From 23132b14e9bf3e1ec1f7720bbe28a2051508bd0f Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 7 Jun 2017 22:17:12 +0200 Subject: Encapsulated parts --- .../mime/mimetreeparser/objecttreeparser.cpp | 38 ++++++++++++++-------- 1 file changed, 25 insertions(+), 13 deletions(-) (limited to 'framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp') diff --git a/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp b/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp index b137be87..8d8ddf12 100644 --- a/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp +++ b/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp @@ -190,20 +190,17 @@ KMime::Content *ObjectTreeParser::find(const std::function collect(MessagePart::Ptr start, const std::function &filter, const std::function &select) +static QVector collect(MessagePart::Ptr start, const std::function &evaluateSubtree, const std::function &select) { MessagePartPtr ptr = start.dynamicCast(); Q_ASSERT(ptr); - if (!filter(ptr)) { - return {}; - } - QVector list; - if (ptr) { + if (evaluateSubtree(ptr)) { for (const auto &p: ptr->subParts()) { - list << ::collect(p, filter, select); + list << ::collect(p, evaluateSubtree, select); } } + //Don't consider this part if we already selected a subpart if (list.isEmpty()) { if (select(ptr)) { @@ -213,14 +210,25 @@ static QVector collect(MessagePart::Ptr start, const std::func return list; } -QVector ObjectTreeParser::collectContentParts() +QVector ObjectTreeParser::collectContentParts() { - QVector contentParts = ::collect(mParsedPart, - [] (const MessagePartPtr &part) { - // return p->type() != "EncapsulatedPart"; + return collectContentParts(mParsedPart); +} + +QVector ObjectTreeParser::collectContentParts(MessagePart::Ptr start) +{ + return ::collect(start, + [start] (const MessagePartPtr &part) { + //Ignore the top-level + if (start.data() == part.data()) { + return true; + } + if (auto e = part.dynamicCast()) { + return false; + } return true; }, - [] (const MessagePartPtr &part) { + [start] (const MessagePartPtr &part) { if (dynamic_cast(part.data())) { return false; } else if (const auto text = dynamic_cast(part.data())) { @@ -233,6 +241,11 @@ QVector ObjectTreeParser::collectContentParts() return true; } else if (dynamic_cast(part.data())) { return true; + } else if (dynamic_cast(part.data())) { + if (start.data() == part.data()) { + return false; + } + return true; } else if (const auto enc = dynamic_cast(part.data())) { if (enc->error()) { return true; @@ -247,7 +260,6 @@ QVector ObjectTreeParser::collectContentParts() } return false; }); - return contentParts; } QVector ObjectTreeParser::collectAttachmentParts() -- cgit v1.2.3