From b40e6c476e54c5dab834c4d01936d1f7bc33c60e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Wed, 12 Oct 2016 16:41:00 +0200 Subject: Make nested mails work with mailviewer --- framework/domain/mimetreeparser/interface.cpp | 50 +++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 7 deletions(-) (limited to 'framework/domain/mimetreeparser/interface.cpp') diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp index efa0fd40..596dc152 100644 --- a/framework/domain/mimetreeparser/interface.cpp +++ b/framework/domain/mimetreeparser/interface.cpp @@ -36,14 +36,24 @@ class MailMimePrivate { public: - KMime::Content *mNode; + MailMimePrivate(MailMime *p); + MailMime *q; + KMime::Content *mNode; + std::shared_ptr parent; }; +MailMimePrivate::MailMimePrivate(MailMime* p) + : q(p) + , mNode(nullptr) + , parent(nullptr) +{ +} + + MailMime::MailMime() - : d(std::unique_ptr(new MailMimePrivate())) + : d(std::unique_ptr(new MailMimePrivate(this))) { - d->q = this; } bool MailMime::isFirstTextPart() const @@ -54,6 +64,14 @@ bool MailMime::isFirstTextPart() const return (d->mNode->topLevel()->textContent() == d->mNode); } +bool MailMime::isFirstPart() const +{ + if (!d->mNode || !d->mNode->parent()) { + return false; + } + return (d->mNode->parent()->contents().first() == d->mNode); +} + bool MailMime::isTopLevelPart() const { if (!d->mNode) { @@ -108,6 +126,15 @@ QMimeType MailMime::mimetype() const return mimeDb.mimeTypeForName(ct->mimeType()); } +MailMime::Ptr MailMime::parent() const +{ + if (!d->parent) { + d->parent = std::shared_ptr(new MailMime()); + d->parent->d->mNode = d->mNode->parent(); + } + return d->parent; +} + class PartPrivate { public: @@ -285,6 +312,11 @@ MailMime::Ptr Part::mailMime() const return d->mailMime(); } +Part *Part::parent() const +{ + return d->parent(); +} + class ContentPrivate { public: @@ -738,12 +770,16 @@ QVector Parser::collectContentParts() const } { - const auto parent = content->parent(); - if (parent) { - const auto _mime = parent->mailMime(); + auto _mime = content->parent()->mailMime(); + while (_mime) { if (_mime && (_mime->isTopLevelPart() || _mime->isFirstTextPart())) { return true; } + if (_mime->isFirstPart()) { + _mime = _mime->parent(); + } else { + break; + } } } const auto cd = mime->disposition(); @@ -830,4 +866,4 @@ QVector Parser::collect(const Part::Ptr &start, std::function