summaryrefslogtreecommitdiffstats
path: root/framework/src/domain/mime/mimetreeparser
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2018-06-29 17:27:31 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2018-06-29 17:27:31 +0200
commitd81eea635c2151c2c9c62a53c08e427c38ad0acd (patch)
tree3dc1eda9702f060eac17581b74c7b848dcc7301c /framework/src/domain/mime/mimetreeparser
parent4e338ae323fc6fcdfb641cf463f60946bcbbc60e (diff)
downloadkube-d81eea635c2151c2c9c62a53c08e427c38ad0acd.tar.gz
kube-d81eea635c2151c2c9c62a53c08e427c38ad0acd.zip
Partial fix for multipart/mixed in alternative part
We only render the first part right now, which is not correct.
Diffstat (limited to 'framework/src/domain/mime/mimetreeparser')
-rw-r--r--framework/src/domain/mime/mimetreeparser/messagepart.cpp27
-rw-r--r--framework/src/domain/mime/mimetreeparser/messagepart.h1
-rw-r--r--framework/src/domain/mime/mimetreeparser/multipartalternative.cpp28
-rw-r--r--framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp20
4 files changed, 37 insertions, 39 deletions
diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.cpp b/framework/src/domain/mime/mimetreeparser/messagepart.cpp
index 1a1b2003..9c17aafc 100644
--- a/framework/src/domain/mime/mimetreeparser/messagepart.cpp
+++ b/framework/src/domain/mime/mimetreeparser/messagepart.cpp
@@ -587,30 +587,35 @@ AlternativeMessagePart::AlternativeMessagePart(ObjectTreeParser *otp, KMime::Con
587 // when displaying plain text. 587 // when displaying plain text.
588 if (!dataHtml) { 588 if (!dataHtml) {
589 dataHtml = findTypeInDirectChilds(mNode, "multipart/mixed"); 589 dataHtml = findTypeInDirectChilds(mNode, "multipart/mixed");
590 if (dataHtml) {
591 const auto parts = dataHtml->contents();
592 for (int i = 0; i < parts.size(); i++) {
593 const auto p = parts.at(i);
594 if (i == 0 ) {
595 // FIXME multipart/mixed should display all types serially, not just one
596 dataHtml = p;
597 } else if (KMime::isAttachment(p)) {
598 appendSubPart(MimeMessagePart::Ptr(new MimeMessagePart(otp, p, true)));
599 }
600 }
601 }
590 } 602 }
591 } 603 }
592 604
593 if (dataIcal) { 605 if (dataIcal) {
594 mChildNodes[Util::MultipartIcal] = dataIcal; 606 mChildParts[Util::MultipartIcal] = MimeMessagePart::Ptr(new MimeMessagePart(mOtp, dataIcal, true));
595 } 607 }
596 608
597 if (dataText) { 609 if (dataText) {
598 mChildNodes[Util::MultipartPlain] = dataText; 610 mChildParts[Util::MultipartPlain] = MimeMessagePart::Ptr(new MimeMessagePart(mOtp, dataText, true));
599 } 611 }
600 612
601 if (dataHtml) { 613 if (dataHtml) {
602 mChildNodes[Util::MultipartHtml] = dataHtml; 614 mChildParts[Util::MultipartHtml] = MimeMessagePart::Ptr(new MimeMessagePart(mOtp, dataHtml, true));
603 } 615 }
604 616
605 if (mChildNodes.isEmpty()) { 617 if (mChildParts.isEmpty()) {
606 qCWarning(MIMETREEPARSER_LOG) << "no valid nodes"; 618 qCWarning(MIMETREEPARSER_LOG) << "no valid nodes";
607 return;
608 }
609
610 QMapIterator<Util::HtmlMode, KMime::Content *> i(mChildNodes);
611 while (i.hasNext()) {
612 i.next();
613 mChildParts[i.key()] = MimeMessagePart::Ptr(new MimeMessagePart(mOtp, i.value(), true));
614 } 619 }
615} 620}
616 621
diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.h b/framework/src/domain/mime/mimetreeparser/messagepart.h
index c576699e..9add81d2 100644
--- a/framework/src/domain/mime/mimetreeparser/messagepart.h
+++ b/framework/src/domain/mime/mimetreeparser/messagepart.h
@@ -245,7 +245,6 @@ public:
245 245
246 QList<Util::HtmlMode> availableModes(); 246 QList<Util::HtmlMode> availableModes();
247private: 247private:
248 QMap<Util::HtmlMode, KMime::Content *> mChildNodes;
249 QMap<Util::HtmlMode, MimeMessagePart::Ptr> mChildParts; 248 QMap<Util::HtmlMode, MimeMessagePart::Ptr> mChildParts;
250 249
251 friend class DefaultRendererPrivate; 250 friend class DefaultRendererPrivate;
diff --git a/framework/src/domain/mime/mimetreeparser/multipartalternative.cpp b/framework/src/domain/mime/mimetreeparser/multipartalternative.cpp
index d0657edb..b1500136 100644
--- a/framework/src/domain/mime/mimetreeparser/multipartalternative.cpp
+++ b/framework/src/domain/mime/mimetreeparser/multipartalternative.cpp
@@ -47,35 +47,9 @@ MessagePart::Ptr MultiPartAlternativeBodyPartFormatter::process(Interface::BodyP
47 return MessagePart::Ptr(); 47 return MessagePart::Ptr();
48 } 48 }
49 49
50 //Hardcoded after removing the source
51 auto preferredMode = MimeTreeParser::Util::Html;
52 AlternativeMessagePart::Ptr mp(new AlternativeMessagePart(part.objectTreeParser(), node)); 50 AlternativeMessagePart::Ptr mp(new AlternativeMessagePart(part.objectTreeParser(), node));
53 if (mp->mChildNodes.isEmpty()) { 51 if (mp->mChildParts.isEmpty()) {
54 return MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), node->contents().at(0))); 52 return MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), node->contents().at(0)));
55 } 53 }
56
57 KMime::Content *dataIcal = mp->mChildNodes.contains(Util::MultipartIcal) ? mp->mChildNodes[Util::MultipartIcal] : nullptr;
58 KMime::Content *dataHtml = mp->mChildNodes.contains(Util::MultipartHtml) ? mp->mChildNodes[Util::MultipartHtml] : nullptr;
59 KMime::Content *dataPlain = mp->mChildNodes.contains(Util::MultipartPlain) ? mp->mChildNodes[Util::MultipartPlain] : nullptr;
60
61 // Make sure that in default ical is prefered over html and plain text
62 if (dataIcal && ((preferredMode != Util::MultipartHtml && preferredMode != Util::MultipartPlain))) {
63 if (dataHtml) {
64 part.nodeHelper()->setNodeProcessed(dataHtml, false);
65 }
66 if (dataPlain) {
67 part.nodeHelper()->setNodeProcessed(dataPlain, false);
68 }
69 preferredMode = Util::MultipartIcal;
70 } else if ((dataHtml && (preferredMode == Util::MultipartHtml || preferredMode == Util::Html)) ||
71 (dataHtml && dataPlain && dataPlain->body().isEmpty())) {
72 if (dataPlain) {
73 part.nodeHelper()->setNodeProcessed(dataPlain, false);
74 }
75 preferredMode = Util::MultipartHtml;
76 } else if (!(preferredMode == Util::MultipartHtml) && dataPlain) {
77 part.nodeHelper()->setNodeProcessed(dataHtml, false);
78 preferredMode = Util::MultipartPlain;
79 }
80 return mp; 54 return mp;
81} 55}
diff --git a/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp b/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp
index 6b4280a9..7fa651bc 100644
--- a/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp
+++ b/framework/src/domain/mime/mimetreeparser/tests/mimetreeparsertest.cpp
@@ -418,6 +418,26 @@ private slots:
418 auto attachments = otp.collectAttachmentParts(); 418 auto attachments = otp.collectAttachmentParts();
419 QCOMPARE(attachments.size(), 1); 419 QCOMPARE(attachments.size(), 1);
420 } 420 }
421
422 void testAppleHtmlWithAttachmentsMixed()
423 {
424 MimeTreeParser::ObjectTreeParser otp;
425 otp.parseObjectTree(readMailFromFile("applehtmlwithattachmentsmixed.mbox"));
426 otp.decryptParts();
427 otp.print();
428 auto partList = otp.collectContentParts();
429 QCOMPARE(partList.size(), 1);
430 auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
431 QCOMPARE(part->encryptions().size(), 0);
432 QCOMPARE(part->signatures().size(), 0);
433 qWarning() << otp.plainTextContent();
434 qWarning() << otp.htmlContent();
435 QCOMPARE(otp.plainTextContent(), QString::fromUtf8("Hello\n\n\n\nRegards\n\nFsdfsdf"));
436 QCOMPARE(otp.htmlContent(), QString::fromUtf8("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\"></head><body style=\"word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;\" class=\"\"><strike class=\"\">Hello</strike><div class=\"\"><br class=\"\"></div><div class=\"\"></div></body></html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\"></head><body style=\"word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;\" class=\"\"><div class=\"\"></div><div class=\"\"><br class=\"\"></div><div class=\"\"><b class=\"\">Regards</b></div><div class=\"\"><b class=\"\"><br class=\"\"></b></div><div class=\"\">Fsdfsdf</div></body></html>"));
437
438 auto attachments = otp.collectAttachmentParts();
439 QCOMPARE(attachments.size(), 1);
440 }
421}; 441};
422 442
423QTEST_GUILESS_MAIN(InterfaceTest) 443QTEST_GUILESS_MAIN(InterfaceTest)