summaryrefslogtreecommitdiffstats
path: root/framework/domain
diff options
context:
space:
mode:
Diffstat (limited to 'framework/domain')
-rw-r--r--framework/domain/mimetreeparser/interface.cpp34
-rw-r--r--framework/domain/mimetreeparser/interface.h4
-rw-r--r--framework/domain/mimetreeparser/tests/interfacetest.cpp9
3 files changed, 43 insertions, 4 deletions
diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp
index ab56f800..c2fd1e65 100644
--- a/framework/domain/mimetreeparser/interface.cpp
+++ b/framework/domain/mimetreeparser/interface.cpp
@@ -56,6 +56,14 @@ MailMime::MailMime()
56{ 56{
57} 57}
58 58
59QByteArray MailMime::cid() const
60{
61 if (!d->mNode || !d->mNode->contentID()) {
62 return QByteArray();
63 }
64 return d->mNode->contentID()->identifier();
65}
66
59bool MailMime::isFirstTextPart() const 67bool MailMime::isFirstTextPart() const
60{ 68{
61 if (!d->mNode || !d->mNode->topLevel()) { 69 if (!d->mNode || !d->mNode->topLevel()) {
@@ -750,9 +758,16 @@ Parser::~Parser()
750{ 758{
751} 759}
752 760
753QUrl Parser::getPart(const QByteArray &cid) 761Part::Ptr Parser::getPart(const QUrl &url)
754{ 762{
755 return d->mEmbeddedPartMap.value(cid); 763 if (url.scheme() == QStringLiteral("cid") && !url.path().isEmpty()) {
764 const auto cid = url.path();
765 return find(d->mTree, [&cid](const Part::Ptr &p){
766 const auto mime = p->mailMime();
767 return mime->cid() == cid;
768 });
769 }
770 return Part::Ptr();
756} 771}
757 772
758QVector<Part::Ptr> Parser::collectContentParts() const 773QVector<Part::Ptr> Parser::collectContentParts() const
@@ -857,6 +872,7 @@ QVector<Part::Ptr> Parser::collectAttachmentParts() const
857 return true; 872 return true;
858 }); 873 });
859} 874}
875
860QVector<Part::Ptr> Parser::collect(const Part::Ptr &start, std::function<bool(const Part::Ptr &)> select, std::function<bool(const Content::Ptr &)> filter) const 876QVector<Part::Ptr> Parser::collect(const Part::Ptr &start, std::function<bool(const Part::Ptr &)> select, std::function<bool(const Content::Ptr &)> filter) const
861{ 877{
862 QVector<Part::Ptr> ret; 878 QVector<Part::Ptr> ret;
@@ -879,3 +895,17 @@ QVector<Part::Ptr> Parser::collect(const Part::Ptr &start, std::function<bool(co
879 } 895 }
880 return ret; 896 return ret;
881} 897}
898
899Part::Ptr Parser::find(const Part::Ptr &start, std::function<bool(const Part::Ptr &)> select) const
900{
901 foreach (const auto &part, start->subParts()) {
902 if (select(part)) {
903 return part;
904 }
905 const auto ret = find(part, select);
906 if (ret) {
907 return ret;
908 }
909 }
910 return Part::Ptr();
911}
diff --git a/framework/domain/mimetreeparser/interface.h b/framework/domain/mimetreeparser/interface.h
index 4b569546..cc6c68d2 100644
--- a/framework/domain/mimetreeparser/interface.h
+++ b/framework/domain/mimetreeparser/interface.h
@@ -349,10 +349,10 @@ public:
349 Parser(const QByteArray &mimeMessage); 349 Parser(const QByteArray &mimeMessage);
350 ~Parser(); 350 ~Parser();
351 351
352 Part::Ptr getPart(QUrl url); 352 Part::Ptr getPart(const QUrl &url);
353 QUrl getPart(const QByteArray &cid);
354 353
355 QVector<Part::Ptr> collect(const Part::Ptr &start, std::function<bool(const Part::Ptr &)> select, std::function<bool(const Content::Ptr &)> filter) const; 354 QVector<Part::Ptr> collect(const Part::Ptr &start, std::function<bool(const Part::Ptr &)> select, std::function<bool(const Content::Ptr &)> filter) const;
355 Part::Ptr find(const Part::Ptr &start, std::function<bool(const Part::Ptr &)> select) const;
356 QVector<Part::Ptr> collectContentParts() const; 356 QVector<Part::Ptr> collectContentParts() const;
357 QVector<Part::Ptr> collectAttachmentParts() const; 357 QVector<Part::Ptr> collectAttachmentParts() const;
358 //template <> QVector<ContentPart::Ptr> collect<ContentPart>() const; 358 //template <> QVector<ContentPart::Ptr> collect<ContentPart>() const;
diff --git a/framework/domain/mimetreeparser/tests/interfacetest.cpp b/framework/domain/mimetreeparser/tests/interfacetest.cpp
index 923a7446..d52606c2 100644
--- a/framework/domain/mimetreeparser/tests/interfacetest.cpp
+++ b/framework/domain/mimetreeparser/tests/interfacetest.cpp
@@ -240,6 +240,15 @@ private slots:
240 auto contentAttachmentList = parser.collectAttachmentParts(); 240 auto contentAttachmentList = parser.collectAttachmentParts();
241 QCOMPARE(contentAttachmentList.size(), 0); 241 QCOMPARE(contentAttachmentList.size(), 0);
242 } 242 }
243
244 void testCidLink()
245 {
246 Parser parser(readMailFromFile("cid-links.mbox"));
247 printTree(parser.d->mTree,QString());
248 QCOMPARE(parser.getPart(QUrl("cid:9359201d15e53f31a68c307b3369b6@info")), parser.d->mTree->subParts().at(1));
249 QVERIFY(!parser.getPart(QUrl("cid:")));
250 QVERIFY(!parser.getPart(QUrl("cid:unknown")));
251 }
243}; 252};
244 253
245QTEST_GUILESS_MAIN(InterfaceTest) 254QTEST_GUILESS_MAIN(InterfaceTest)