diff options
Diffstat (limited to 'framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp')
-rw-r--r-- | framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp b/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp index fced7997..f44816b0 100644 --- a/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp +++ b/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp | |||
@@ -399,7 +399,7 @@ MessagePartPtr ObjectTreeParser::parsedPart() const | |||
399 | return mParsedPart; | 399 | return mParsedPart; |
400 | } | 400 | } |
401 | 401 | ||
402 | MessagePartPtr ObjectTreeParser::processType(KMime::Content *node, const QByteArray &mediaType, const QByteArray &subType) | 402 | QVector<MessagePartPtr> ObjectTreeParser::processType(KMime::Content *node, const QByteArray &mediaType, const QByteArray &subType) |
403 | { | 403 | { |
404 | static MimeTreeParser::BodyPartFormatterBaseFactory factory; | 404 | static MimeTreeParser::BodyPartFormatterBaseFactory factory; |
405 | const auto sub = factory.subtypeRegistry(mediaType.constData()); | 405 | const auto sub = factory.subtypeRegistry(mediaType.constData()); |
@@ -410,8 +410,9 @@ MessagePartPtr ObjectTreeParser::processType(KMime::Content *node, const QByteAr | |||
410 | continue; | 410 | continue; |
411 | } | 411 | } |
412 | PartNodeBodyPart part(this, mTopLevelContent, node, mNodeHelper); | 412 | PartNodeBodyPart part(this, mTopLevelContent, node, mNodeHelper); |
413 | if (const MessagePart::Ptr result = formatter->process(part)) { | 413 | const auto list = formatter->processList(part); |
414 | return result; | 414 | if (!list.isEmpty()) { |
415 | return list; | ||
415 | } | 416 | } |
416 | } | 417 | } |
417 | return {}; | 418 | return {}; |
@@ -458,16 +459,35 @@ MessagePart::Ptr ObjectTreeParser::parseObjectTreeInternal(KMime::Content *node, | |||
458 | subType = node->contentType()->subType(); | 459 | subType = node->contentType()->subType(); |
459 | } | 460 | } |
460 | 461 | ||
461 | //Try the specific type handler | 462 | auto mp = [&] { |
462 | if (auto mp = processType(node, mediaType, subType)) { | 463 | //Try the specific type handler |
463 | parsedPart->appendSubPart(mp); | 464 | { |
464 | //Fallback to the generic handler | 465 | auto list = processType(node, mediaType, subType); |
465 | } else if (auto mp = processType(node, mediaType, "*")) { | 466 | if (!list.isEmpty()) { |
466 | parsedPart->appendSubPart(mp); | 467 | return list; |
467 | //Fallback to the default handler | 468 | } |
468 | } else if (auto mp = defaultHandling(node)) { | 469 | } |
469 | parsedPart->appendSubPart(mp); | 470 | //Fallback to the generic handler |
471 | { | ||
472 | auto list = processType(node, mediaType, "*"); | ||
473 | if (!list.isEmpty()) { | ||
474 | return list; | ||
475 | } | ||
476 | } | ||
477 | //Fallback to the default handler | ||
478 | { | ||
479 | auto list = defaultHandling(node); | ||
480 | if (!list.isEmpty()) { | ||
481 | return list; | ||
482 | } | ||
483 | } | ||
484 | return QVector<MessagePart::Ptr>{}; | ||
485 | }(); | ||
486 | |||
487 | for (const auto p : mp) { | ||
488 | parsedPart->appendSubPart(p); | ||
470 | } | 489 | } |
490 | |||
471 | mNodeHelper->setNodeProcessed(node, false); | 491 | mNodeHelper->setNodeProcessed(node, false); |
472 | 492 | ||
473 | if (onlyOneMimePart) { | 493 | if (onlyOneMimePart) { |
@@ -478,19 +498,20 @@ MessagePart::Ptr ObjectTreeParser::parseObjectTreeInternal(KMime::Content *node, | |||
478 | return parsedPart; | 498 | return parsedPart; |
479 | } | 499 | } |
480 | 500 | ||
481 | MessagePart::Ptr ObjectTreeParser::defaultHandling(KMime::Content *node) | 501 | QVector<MessagePart::Ptr> ObjectTreeParser::defaultHandling(KMime::Content *node) |
482 | { | 502 | { |
483 | if (node->contentType()->mimeType() == QByteArrayLiteral("application/octet-stream") && | 503 | if (node->contentType()->mimeType() == QByteArrayLiteral("application/octet-stream") && |
484 | (node->contentType()->name().endsWith(QLatin1String("p7m")) || | 504 | (node->contentType()->name().endsWith(QLatin1String("p7m")) || |
485 | node->contentType()->name().endsWith(QLatin1String("p7s")) || | 505 | node->contentType()->name().endsWith(QLatin1String("p7s")) || |
486 | node->contentType()->name().endsWith(QLatin1String("p7c")) | 506 | node->contentType()->name().endsWith(QLatin1String("p7c")) |
487 | )) { | 507 | )) { |
488 | if (auto mp = processType(node, "application", "pkcs7-mime")) { | 508 | auto list = processType(node, "application", "pkcs7-mime"); |
489 | return mp; | 509 | if (!list.isEmpty()) { |
510 | return list; | ||
490 | } | 511 | } |
491 | } | 512 | } |
492 | 513 | ||
493 | return AttachmentMessagePart::Ptr(new AttachmentMessagePart(this, node)); | 514 | return {AttachmentMessagePart::Ptr(new AttachmentMessagePart(this, node))}; |
494 | } | 515 | } |
495 | 516 | ||
496 | const QTextCodec *ObjectTreeParser::codecFor(KMime::Content *node) const | 517 | const QTextCodec *ObjectTreeParser::codecFor(KMime::Content *node) const |