From 2d0608ddf1b84991ca7a693ce00e70b6447644d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Tue, 2 Aug 2016 10:11:23 +0200 Subject: Implement collectAttachmentParts --- framework/domain/mimetreeparser/interface.cpp | 47 ++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) (limited to 'framework/domain/mimetreeparser/interface.cpp') diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp index 4f45b883..04f0fdf2 100644 --- a/framework/domain/mimetreeparser/interface.cpp +++ b/framework/domain/mimetreeparser/interface.cpp @@ -433,6 +433,9 @@ void SinglePartPrivate::fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part) void SinglePartPrivate::fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part) { q->reachParentD()->createMailMime(part.staticCast()); + mType = q->mailMime()->mimetype().name().toUtf8(); + mContent.clear(); + mContent.append(std::make_shared(part->text().toLocal8Bit(), q)); } SinglePart::SinglePart() @@ -582,6 +585,49 @@ QVector Parser::collectContentParts() const }); } + +QVector Parser::collectAttachmentParts() const +{ + return collect(d->mTree, [](const Part::Ptr &p){return p->type() != "EncapsulatedPart";}, + [](const Content::Ptr &content){ + const auto mime = content->mailMime(); + + if (!mime) { + return false; + } + + if (mime->isFirstTextPart()) { + return false; + } + + { + const auto parent = content->parent(); + if (parent) { + const auto _mime = parent->mailMime(); + if (_mime && (_mime->isTopLevelPart() || _mime->isFirstTextPart())) { + return false; + } + } + } + const auto cd = mime->disposition(); + if (cd && cd == MailMime::Inline) { + // explict "inline" disposition: + return false; + } + if (cd && cd == MailMime::Attachment) { + // explicit "attachment" disposition: + return true; + } + + 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 false; + } + return true; + }); +} QVector Parser::collect(const Part::Ptr &start, std::function select, std::function filter) const { QVector ret; @@ -594,7 +640,6 @@ QVector Parser::collect(const Part::Ptr &start, std::function