summaryrefslogtreecommitdiffstats
path: root/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp')
-rw-r--r--framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp53
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
402MessagePartPtr ObjectTreeParser::processType(KMime::Content *node, const QByteArray &mediaType, const QByteArray &subType) 402QVector<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
481MessagePart::Ptr ObjectTreeParser::defaultHandling(KMime::Content *node) 501QVector<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
496const QTextCodec *ObjectTreeParser::codecFor(KMime::Content *node) const 517const QTextCodec *ObjectTreeParser::codecFor(KMime::Content *node) const