From 964f0003584a0b745045db75ca6184f54eddd859 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 4 Jun 2017 15:21:05 +0200 Subject: Rely on isAttachment to collect attachments --- .../mimetreeparser/autotests/attachmenttest.cpp | 7 +- .../src/domain/mime/mimetreeparser/messagepart.cpp | 5 +- .../src/domain/mime/mimetreeparser/messagepart.h | 3 +- .../src/domain/mime/mimetreeparser/nodehelper.cpp | 85 ---------------------- .../src/domain/mime/mimetreeparser/nodehelper.h | 16 ---- .../mime/mimetreeparser/objecttreeparser.cpp | 6 +- 6 files changed, 11 insertions(+), 111 deletions(-) (limited to 'framework') diff --git a/framework/src/domain/mime/mimetreeparser/autotests/attachmenttest.cpp b/framework/src/domain/mime/mimetreeparser/autotests/attachmenttest.cpp index 47b5cbce..789c9049 100644 --- a/framework/src/domain/mime/mimetreeparser/autotests/attachmenttest.cpp +++ b/framework/src/domain/mime/mimetreeparser/autotests/attachmenttest.cpp @@ -22,6 +22,7 @@ #include "setupenv.h" #include +#include using namespace MimeTreeParser; @@ -58,10 +59,10 @@ void AttachmentTest::testEncryptedAttachment() ObjectTreeParser otp(&nodeHelper); otp.parseObjectTree(msg.data()); otp.decryptParts(); + otp.print(); - auto attachments = msg->attachments(); - auto encAtts = nodeHelper.attachmentsOfExtraContents(); - QCOMPARE(attachments.size() + encAtts.size(), 2); + auto attachmentParts = otp.collectAttachmentParts(); + QCOMPARE(attachmentParts.size(), 2); } #include "attachmenttest.moc" diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.cpp b/framework/src/domain/mime/mimetreeparser/messagepart.cpp index f93d4ea5..b6dfd30a 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.cpp +++ b/framework/src/domain/mime/mimetreeparser/messagepart.cpp @@ -185,7 +185,10 @@ PartMetaData *MessagePart::partMetaData() bool MessagePart::isAttachment() const { - return true; + if (mNode) { + return KMime::isAttachment(mNode); + } + return false; } KMime::Content *MessagePart::node() const diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.h b/framework/src/domain/mime/mimetreeparser/messagepart.h index 04fb30c3..0c206210 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.h +++ b/framework/src/domain/mime/mimetreeparser/messagepart.h @@ -83,7 +83,7 @@ public: virtual QString text() const; void setText(const QString &text); - bool isAttachment() const; + virtual bool isAttachment() const; void setIsRoot(bool root); bool isRoot() const; @@ -196,6 +196,7 @@ public: typedef QSharedPointer Ptr; AttachmentMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node); virtual ~AttachmentMessagePart(); + virtual bool isAttachment() const Q_DECL_OVERRIDE { return true; } }; diff --git a/framework/src/domain/mime/mimetreeparser/nodehelper.cpp b/framework/src/domain/mime/mimetreeparser/nodehelper.cpp index 3005ea0f..4e60fa68 100644 --- a/framework/src/domain/mime/mimetreeparser/nodehelper.cpp +++ b/framework/src/domain/mime/mimetreeparser/nodehelper.cpp @@ -456,89 +456,4 @@ QList< KMime::Content * > NodeHelper::extraContents(KMime::Content *topLevelnode return mExtraContents.value(topLevelnode); } -void NodeHelper::mergeExtraNodes(KMime::Content *node) -{ - if (!node) { - return; - } - - const QList extraNodes = extraContents(node); - for (KMime::Content *extra : extraNodes) { - if (node->bodyIsMessage()) { - qCWarning(MIMETREEPARSER_LOG) << "Asked to attach extra content to a kmime::message, this does not make sense. Attaching to:" << node << - node->encodedContent() << "\n====== with =======\n" << extra << extra->encodedContent(); - continue; - } - KMime::Content *c = new KMime::Content(node); - c->setContent(extra->encodedContent()); - c->parse(); - node->addContent(c); - } - - Q_FOREACH (KMime::Content *child, node->contents()) { - mergeExtraNodes(child); - } -} - -void NodeHelper::cleanFromExtraNodes(KMime::Content *node) -{ - if (!node) { - return; - } - const QList extraNodes = extraContents(node); - for (KMime::Content *extra : extraNodes) { - QByteArray s = extra->encodedContent(); - const auto children = node->contents(); - for (KMime::Content *c : children) { - if (c->encodedContent() == s) { - node->removeContent(c); - } - } - } - Q_FOREACH (KMime::Content *child, node->contents()) { - cleanFromExtraNodes(child); - } -} - -KMime::Message *NodeHelper::messageWithExtraContent(KMime::Content *topLevelNode) -{ - /*The merge is done in several steps: - 1) merge the extra nodes into topLevelNode - 2) copy the modified (merged) node tree into a new node tree - 3) restore the original node tree in topLevelNode by removing the extra nodes from it - - The reason is that extra nodes are assigned by pointer value to the nodes in the original tree. - */ - if (!topLevelNode) { - return nullptr; - } - - mergeExtraNodes(topLevelNode); - - KMime::Message *m = new KMime::Message; - m->setContent(topLevelNode->encodedContent()); - m->parse(); - - cleanFromExtraNodes(topLevelNode); -// qCDebug(MIMETREEPARSER_LOG) << "MESSAGE WITH EXTRA: " << m->encodedContent(); -// qCDebug(MIMETREEPARSER_LOG) << "MESSAGE WITHOUT EXTRA: " << topLevelNode->encodedContent(); - - return m; -} - -QVector NodeHelper::attachmentsOfExtraContents() const -{ - QVector result; - for (auto it = mExtraContents.begin(); it != mExtraContents.end(); ++it) { - foreach (auto content, it.value()) { - if (KMime::isAttachment(content)) { - result.push_back(content); - } else { - result += content->attachments(); - } - } - } - return result; -} - } diff --git a/framework/src/domain/mime/mimetreeparser/nodehelper.h b/framework/src/domain/mime/mimetreeparser/nodehelper.h index 2891f3bd..bf472413 100644 --- a/framework/src/domain/mime/mimetreeparser/nodehelper.h +++ b/framework/src/domain/mime/mimetreeparser/nodehelper.h @@ -76,11 +76,6 @@ public: /** Get the extra nodes attached to the @param topLevelNode and all sub-nodes of @param topLevelNode */ QList extraContents(KMime::Content *topLevelNode) const; - /** Return a modified message (node tree) starting from @param topLevelNode that has the original nodes and the extra nodes. - The caller has the responsibility to delete the new message. - */ - KMime::Message *messageWithExtraContent(KMime::Content *topLevelNode); - /** Get a QTextCodec suitable for this message part */ const QTextCodec *codec(KMime::Content *node); @@ -149,14 +144,6 @@ public: QString fromAsString(KMime::Content *node) const; - /** - * Returns a list of attachments of attached extra content nodes. - * This is mainly useful is order to get attachments of encrypted messages. - * Note that this does not include attachments from the primary node tree. - * @see KMime::Content::attachments(). - */ - QVector attachmentsOfExtraContents() const; - Q_SIGNALS: void update(MimeTreeParser::UpdateMode); @@ -165,9 +152,6 @@ private: bool unencryptedMessage_helper(KMime::Content *node, QByteArray &resultingData, bool addHeaders, int recursionLevel = 1); - void mergeExtraNodes(KMime::Content *node); - void cleanFromExtraNodes(KMime::Content *node); - /** Creates a persistent index string that bridges the gap between the permanent nodes and the temporary ones. diff --git a/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp b/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp index 914298b9..a37c8b27 100644 --- a/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp +++ b/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp @@ -278,10 +278,7 @@ QVector ObjectTreeParser::collectAttachmentParts() return true; }, [] (const MessagePartPtr &part) { - if (const auto attachment = dynamic_cast(part.data())) { - return true; - } - return false; + return part->isAttachment(); }); return contentParts; } @@ -296,7 +293,6 @@ void ObjectTreeParser::decryptParts() } return false; }); - print(); ::collect(mParsedPart, [] (const MessagePartPtr &part) { return true; }, [] (const MessagePartPtr &part) { -- cgit v1.2.3