From b7a02699eefd84c68ff602bfea91640faec5c4ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Mon, 17 Oct 2016 13:05:43 +0200 Subject: find part by cid --- framework/domain/mimetreeparser/interface.cpp | 34 ++++++++++++++++++++-- framework/domain/mimetreeparser/interface.h | 4 +-- .../domain/mimetreeparser/tests/interfacetest.cpp | 9 ++++++ 3 files changed, 43 insertions(+), 4 deletions(-) (limited to 'framework') 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() { } +QByteArray MailMime::cid() const +{ + if (!d->mNode || !d->mNode->contentID()) { + return QByteArray(); + } + return d->mNode->contentID()->identifier(); +} + bool MailMime::isFirstTextPart() const { if (!d->mNode || !d->mNode->topLevel()) { @@ -750,9 +758,16 @@ Parser::~Parser() { } -QUrl Parser::getPart(const QByteArray &cid) +Part::Ptr Parser::getPart(const QUrl &url) { - return d->mEmbeddedPartMap.value(cid); + if (url.scheme() == QStringLiteral("cid") && !url.path().isEmpty()) { + const auto cid = url.path(); + return find(d->mTree, [&cid](const Part::Ptr &p){ + const auto mime = p->mailMime(); + return mime->cid() == cid; + }); + } + return Part::Ptr(); } QVector Parser::collectContentParts() const @@ -857,6 +872,7 @@ QVector Parser::collectAttachmentParts() const return true; }); } + QVector Parser::collect(const Part::Ptr &start, std::function select, std::function filter) const { QVector ret; @@ -879,3 +895,17 @@ QVector Parser::collect(const Part::Ptr &start, std::function select) const +{ + foreach (const auto &part, start->subParts()) { + if (select(part)) { + return part; + } + const auto ret = find(part, select); + if (ret) { + return ret; + } + } + return Part::Ptr(); +} 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: Parser(const QByteArray &mimeMessage); ~Parser(); - Part::Ptr getPart(QUrl url); - QUrl getPart(const QByteArray &cid); + Part::Ptr getPart(const QUrl &url); QVector collect(const Part::Ptr &start, std::function select, std::function filter) const; + Part::Ptr find(const Part::Ptr &start, std::function select) const; QVector collectContentParts() const; QVector collectAttachmentParts() const; //template <> QVector collect() 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: auto contentAttachmentList = parser.collectAttachmentParts(); QCOMPARE(contentAttachmentList.size(), 0); } + + void testCidLink() + { + Parser parser(readMailFromFile("cid-links.mbox")); + printTree(parser.d->mTree,QString()); + QCOMPARE(parser.getPart(QUrl("cid:9359201d15e53f31a68c307b3369b6@info")), parser.d->mTree->subParts().at(1)); + QVERIFY(!parser.getPart(QUrl("cid:"))); + QVERIFY(!parser.getPart(QUrl("cid:unknown"))); + } }; QTEST_GUILESS_MAIN(InterfaceTest) -- cgit v1.2.3