From 903960116eb3329631702723bba11f5463eff573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Fri, 22 Jul 2016 13:23:17 +0200 Subject: fixes the build issues --- framework/domain/mimetreeparser/CMakeLists.txt | 2 +- framework/domain/mimetreeparser/interface.cpp | 103 ++++++++++++++------- framework/domain/mimetreeparser/interface.h | 21 +++-- .../domain/mimetreeparser/tests/interfacetest.cpp | 54 ++++++----- 4 files changed, 115 insertions(+), 65 deletions(-) (limited to 'framework') diff --git a/framework/domain/mimetreeparser/CMakeLists.txt b/framework/domain/mimetreeparser/CMakeLists.txt index 07ec28df..e1c04893 100644 --- a/framework/domain/mimetreeparser/CMakeLists.txt +++ b/framework/domain/mimetreeparser/CMakeLists.txt @@ -9,4 +9,4 @@ add_library(mimetreeparser SHARED ${mimetreeparser_SRCS}) qt5_use_modules(mimetreeparser Core Gui) target_link_libraries(mimetreeparser KF5::Mime KF5::MimeTreeParser) -# add_subdirectory(tests) \ No newline at end of file +add_subdirectory(tests) \ No newline at end of file diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp index aa7e3911..5cf36d10 100644 --- a/framework/domain/mimetreeparser/interface.cpp +++ b/framework/domain/mimetreeparser/interface.cpp @@ -141,7 +141,7 @@ Content::~Content() { } -QVector< Encryption > Content::encryptions() const +QVector Content::encryptions() const { if (d->mParent) { return d->mParent->encryptions(); @@ -149,7 +149,7 @@ QVector< Encryption > Content::encryptions() const return QVector(); } -QVector< Signature > Content::signatures() const +QVector Content::signatures() const { if (d->mParent) { return d->mParent->signatures(); @@ -167,6 +167,19 @@ QByteArray Content::charset() const return d->mCodec; } +HtmlContent::HtmlContent(const QByteArray& content, Part* parent) + : Content(content, parent) +{ + +} + +PlainTextContent::PlainTextContent(const QByteArray& content, Part* parent) + : Content(content, parent) +{ + +} + + class AlternativePartPrivate { public: @@ -187,7 +200,7 @@ void AlternativePartPrivate::fillFrom(MimeTreeParser::AlternativeMessagePart::Pt { mTypes = QVector() << "html" << "plaintext"; - auto content = std::make_shared(part->htmlContent().toLocal8Bit(), q); + Content::Ptr content = std::make_shared(part->htmlContent().toLocal8Bit(), q); mContent["html"].append(content); content = std::make_shared(part->plaintextContent().toLocal8Bit(), q); mContent["plaintext"].append(content); @@ -224,11 +237,6 @@ QVector AlternativePart::availableContents() const return d->types(); } -QVector AlternativePart::content() const -{ - return d->content(availableContents().first()); -} - QVector AlternativePart::content(const QByteArray& ct) const { return d->content(ct); @@ -283,9 +291,12 @@ QVector SinglePart::availableContents() const return QVector() << d->mType; } -QVector< Content::Ptr > SinglePart::content() const +QVector< Content::Ptr > SinglePart::content(const QByteArray &ct) const { - return d->mContent; + if (ct == d->mType) { + return d->mContent; + } + return QVector(); } QByteArray SinglePart::type() const @@ -293,17 +304,6 @@ QByteArray SinglePart::type() const return "SinglePart"; } -class MimePartPrivate -{ -public: - void fillFrom(MimeTreeParser::MessagePart::Ptr part); -}; - -QByteArray MimePart::type() const -{ - return "MimePart"; -} - ParserPrivate::ParserPrivate(Parser* parser) : q(parser) , mNodeHelper(std::make_shared()) @@ -343,7 +343,7 @@ void ParserPrivate::createTree(const MimeTreeParser::MessagePart::Ptr &start, co const auto html = mp.dynamicCast(); const auto attachment = mp.dynamicCast(); if (attachment) { - auto part = std::make_shared(); + auto part = std::make_shared(); part->d->fillFrom(attachment); mTree->d->appendSubPart(part); } else if (text) { @@ -376,20 +376,55 @@ Parser::~Parser() QVector Parser::collectContentParts() const { - return collect(d->mTree, [](const Part::Ptr &p){return p->availableContents().indexOf("html") > -1 || p->availableContents().indexOf("text") > -1;}, [](const Part::Ptr &p){return true;}); -} - -template -QVector Parser::collect(const Part::Ptr &start, std::function select, std::function filter) const -{ - QVector ret; + return collect(d->mTree, [](const Part::Ptr &p){return p->type() != "EncapsulatedPart";}, + [](const Content::Ptr &content){ + const auto mime = content->mailMime(); + + if (!mime) { + return true; + } + + if (mime->isFirstTextPart()) { + return true; + } + const auto cd = mime->disposition(); + if (cd && cd == MailMime::Inline) { + // explict "inline" disposition: + return true; + } + if (cd && cd == MailMime::Attachment) { + // explicit "attachment" disposition: + return false; + } + + const auto ct = mime->mimetype(); + if (ct.name().trimmed().toLower() == "text" && ct.name().trimmed().isEmpty() && + (!mime || mime->filename().trimmed().isEmpty())) { + // text/* w/o filename parameter: + return true; + } + return false; + }); +} + +QVector Parser::collect(const Part::Ptr &start, std::function select, std::function filter) const +{ + QVector ret; foreach (const auto &part, start->subParts()) { - if (select(part)){ - const auto p = std::dynamic_pointer_cast(part); - if (p && filter(p)) { - ret.append(p); + QVector contents; + foreach(const auto &ct, part->availableContents()) { + foreach(const auto &content, part->content(ct)) { + if (filter(content)) { + contents.append(ct); + break; + } } - ret += collect(part, select, filter); + } + if (!contents.isEmpty()) { + ret.append(part); + } + if (select(part)){ + ret += collect(part, select, filter); } } return ret; diff --git a/framework/domain/mimetreeparser/interface.h b/framework/domain/mimetreeparser/interface.h index 5133b87e..f6ee41ee 100644 --- a/framework/domain/mimetreeparser/interface.h +++ b/framework/domain/mimetreeparser/interface.h @@ -41,9 +41,6 @@ class SinglePartPrivate; class EncryptionPart; class EncryptionPartPrivate; -class AttachmentPart; -class AttachmentPartPrivate; - class EncapsulatedPart; class EncapsulatedPartPrivate; @@ -84,6 +81,7 @@ public: QUrl label() const; QByteArray cid() const; QByteArray charset() const; + QByteArray filename() const; // Unique identifier to ecactly this KMime::Content QByteArray link() const; @@ -95,6 +93,8 @@ public: // overwrite default charset with given charset QString encodedContent(QByteArray charset) const; + bool isFirstTextPart() const; + private: std::unique_ptr d; }; @@ -127,12 +127,14 @@ private: class PlainTextContent : public Content { public: + PlainTextContent(const QByteArray &content, Part *parent); QByteArray type() const Q_DECL_OVERRIDE; }; class HtmlContent : public Content { public: + HtmlContent(const QByteArray &content, Part *parent); QByteArray type() const Q_DECL_OVERRIDE; }; @@ -145,6 +147,7 @@ class CertContent : public Content { public: typedef std::shared_ptr Ptr; + CertContent(const QByteArray &content, Part *parent); QByteArray type() const Q_DECL_OVERRIDE; enum CertType { @@ -173,7 +176,8 @@ public: virtual QByteArray type() const; virtual QVector availableContents() const; - virtual QVector content() const; + virtual QVector content(const QByteArray& ct) const; + QVector content() const; bool hasSubParts() const; QVector subParts() const; @@ -196,9 +200,8 @@ public: AlternativePart(); virtual ~AlternativePart(); - QVector content() const Q_DECL_OVERRIDE; QVector availableContents() const Q_DECL_OVERRIDE; - QVector content(const QByteArray& ct) const; + QVector content(const QByteArray& ct) const Q_DECL_OVERRIDE; QByteArray type() const Q_DECL_OVERRIDE; @@ -216,7 +219,7 @@ class SinglePart : public Part SinglePart(); virtual ~SinglePart(); - QVector content() const Q_DECL_OVERRIDE; + QVector content(const QByteArray& ct) const Q_DECL_OVERRIDE; QVector availableContents() const Q_DECL_OVERRIDE; QByteArray type() const Q_DECL_OVERRIDE; @@ -311,9 +314,9 @@ public: Part::Ptr getPart(QUrl url); - template QVector collect(const Part::Ptr &start, std::function select, std::function filter) const; - //QVector collectAttachments(Part::Ptr start, std::function select, std::function filter) const; + QVector collect(const Part::Ptr &start, std::function select, std::function filter) const; QVector collectContentParts() const; + QVector collectAttachmentParts() const; //template <> QVector collect() const; //template <> static StatusObject verifySignature(const Signature signature) const; diff --git a/framework/domain/mimetreeparser/tests/interfacetest.cpp b/framework/domain/mimetreeparser/tests/interfacetest.cpp index 88691539..822d530c 100644 --- a/framework/domain/mimetreeparser/tests/interfacetest.cpp +++ b/framework/domain/mimetreeparser/tests/interfacetest.cpp @@ -48,34 +48,38 @@ private slots: void testTextMail() { Parser parser(readMailFromFile("plaintext.mbox")); - auto contentPart = parser.collectContentPart(); + auto contentPartList = parser.collectContentParts(); + QCOMPARE(contentPartList.size(), 1); + auto contentPart = contentPartList[0]; QVERIFY((bool)contentPart); - QCOMPARE(contentPart->availableContents(), ContentPart::PlainText); - auto contentList = contentPart->content(ContentPart::PlainText); + QCOMPARE(contentPart->availableContents(), "plaintext"); + auto contentList = contentPart->content("plaintext"); QCOMPARE(contentList.size(), 1); QCOMPARE(contentList[0]->content(), QStringLiteral("If you can see this text it means that your email client couldn't display our newsletter properly.\nPlease visit this link to view the newsletter on our website: http://www.gog.com/newsletter/").toLocal8Bit()); QCOMPARE(contentList[0]->charset(), QStringLiteral("utf-8").toLocal8Bit()); QCOMPARE(contentList[0]->encryptions().size(), 0); QCOMPARE(contentList[0]->signatures().size(), 0); - contentList = contentPart->content(ContentPart::Html); + contentList = contentPart->content("html"); QCOMPARE(contentList.size(), 0); } void testTextAlternative() { Parser parser(readMailFromFile("alternative.mbox")); - auto contentPart = parser.collectContentPart(); + auto contentPartList = parser.collectContentParts(); + QCOMPARE(contentPartList.size(), 1); + auto contentPart = contentPartList[0]; QVERIFY((bool)contentPart); - QCOMPARE(contentPart->availableContents(), ContentPart::PlainText | ContentPart::Html); - auto contentList = contentPart->content(ContentPart::PlainText); + QCOMPARE(contentPart->availableContents(), QVector() << "html" << "plaintext"); + auto contentList = contentPart->content("plaintext"); QCOMPARE(contentList.size(), 1); QCOMPARE(contentList[0]->content(), QStringLiteral("If you can see this text it means that your email client couldn't display our newsletter properly.\nPlease visit this link to view the newsletter on our website: http://www.gog.com/newsletter/\n").toLocal8Bit()); QCOMPARE(contentList[0]->charset(), QStringLiteral("utf-8").toLocal8Bit()); QCOMPARE(contentList[0]->encryptions().size(), 0); QCOMPARE(contentList[0]->signatures().size(), 0); - contentList = contentPart->content(ContentPart::Html); + contentList = contentPart->content("html"); QCOMPARE(contentList.size(), 1); QCOMPARE(contentList[0]->content(), QStringLiteral("

HTML text

\n\n").toLocal8Bit()); QCOMPARE(contentList[0]->charset(), QStringLiteral("utf-8").toLocal8Bit()); @@ -86,14 +90,16 @@ private slots: void testTextHtml() { Parser parser(readMailFromFile("html.mbox")); - auto contentPart = parser.collectContentPart(); + auto contentPartList = parser.collectContentParts(); + QCOMPARE(contentPartList.size(), 1); + auto contentPart = contentPartList[0]; QVERIFY((bool)contentPart); - QCOMPARE(contentPart->availableContents(), ContentPart::Html); + QCOMPARE(contentPart->availableContents(), "html"); - auto contentList = contentPart->content(ContentPart::PlainText); + auto contentList = contentPart->content("plaintext"); QCOMPARE(contentList.size(), 0); - contentList = contentPart->content(ContentPart::Html); + contentList = contentPart->content("html"); QCOMPARE(contentList.size(), 1); QCOMPARE(contentList[0]->content(), QStringLiteral("

HTML text

").toLocal8Bit()); QCOMPARE(contentList[0]->charset(), QStringLiteral("utf-8").toLocal8Bit()); @@ -105,10 +111,12 @@ private slots: { Parser parser(readMailFromFile("smime-encrypted.mbox")); printTree(parser.d->mTree,QString()); - auto contentPart = parser.collectContentPart(); + auto contentPartList = parser.collectContentParts(); + QCOMPARE(contentPartList.size(), 1); + auto contentPart = contentPartList[0]; QVERIFY((bool)contentPart); - QCOMPARE(contentPart->availableContents(), ContentPart::PlainText); - auto contentList = contentPart->content(ContentPart::PlainText); + QCOMPARE(contentPart->availableContents(), "plaintext"); + auto contentList = contentPart->content("plaintext"); QCOMPARE(contentList.size(), 1); QCOMPARE(contentList[0]->content(), QStringLiteral("The quick brown fox jumped over the lazy dog.").toLocal8Bit()); QCOMPARE(contentList[0]->charset(), QStringLiteral("utf-8").toLocal8Bit()); @@ -118,10 +126,12 @@ private slots: { Parser parser(readMailFromFile("openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox")); printTree(parser.d->mTree,QString()); - auto contentPart = parser.collectContentPart(); + auto contentPartList = parser.collectContentParts(); + QCOMPARE(contentPartList.size(), 1); + auto contentPart = contentPartList[0]; QVERIFY((bool)contentPart); - QCOMPARE(contentPart->availableContents(), ContentPart::PlainText); - auto contentList = contentPart->content(ContentPart::PlainText); + QCOMPARE(contentPart->availableContents(), "plaintext"); + auto contentList = contentPart->content("plaintext"); QCOMPARE(contentList.size(), 1); QCOMPARE(contentList[0]->content(), QStringLiteral("test text").toLocal8Bit()); QCOMPARE(contentList[0]->charset(), QStringLiteral("utf-8").toLocal8Bit()); @@ -131,10 +141,12 @@ private slots: { Parser parser(readMailFromFile("openpgp-inline-charset-encrypted.mbox")); printTree(parser.d->mTree,QString()); - auto contentPart = parser.collectContentPart(); + auto contentPartList = parser.collectContentParts(); + QCOMPARE(contentPartList.size(), 1); + auto contentPart = contentPartList[0]; QVERIFY((bool)contentPart); - QCOMPARE(contentPart->availableContents(), ContentPart::PlainText); - auto contentList = contentPart->content(ContentPart::PlainText); + QCOMPARE(contentPart->availableContents(), "plaintext"); + auto contentList = contentPart->content("plaintext"); QCOMPARE(contentList.size(), 1); QCOMPARE(contentList[0]->content(), QStringLiteral("asdasd asd asd asdf sadf sdaf sadf äöü").toLocal8Bit()); QCOMPARE(contentList[0]->charset(), QStringLiteral("utf-8").toLocal8Bit()); -- cgit v1.2.3