From a34e14a57c7726a99e63d767935379cba1ff6ea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Tue, 2 Aug 2016 09:32:12 +0200 Subject: Implement the interface --- framework/domain/mimetreeparser/interface.cpp | 83 ++++++++++++++++++++++++--- 1 file changed, 76 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 a76a6cde..4f45b883 100644 --- a/framework/domain/mimetreeparser/interface.cpp +++ b/framework/domain/mimetreeparser/interface.cpp @@ -47,12 +47,20 @@ MailMime::MailMime() bool MailMime::isFirstTextPart() const { - if (!d->mNode) { + if (!d->mNode || !d->mNode->topLevel()) { return false; } return (d->mNode->topLevel()->textContent() == d->mNode); } +bool MailMime::isTopLevelPart() const +{ + if (!d->mNode) { + return false; + } + return (d->mNode->topLevel() == d->mNode); +} + MailMime::Disposition MailMime::disposition() const { if (!d->mNode) { @@ -110,6 +118,10 @@ public: Part *parent() const; const MailMime::Ptr &mailMime() const; + void createMailMime(const MimeTreeParser::MimeMessagePart::Ptr &part); + void createMailMime(const MimeTreeParser::TextMessagePart::Ptr &part); + void createMailMime(const MimeTreeParser::AlternativeMessagePart::Ptr &part); + void createMailMime(const MimeTreeParser::HtmlMessagePart::Ptr &part); private: Part *q; Part *mParent; @@ -124,6 +136,30 @@ PartPrivate::PartPrivate(Part* part) } +void PartPrivate::createMailMime(const MimeTreeParser::HtmlMessagePart::Ptr& part) +{ + mMailMime = MailMime::Ptr(new MailMime); + mMailMime->d->mNode = part->mNode; +} + +void PartPrivate::createMailMime(const MimeTreeParser::AlternativeMessagePart::Ptr& part) +{ + mMailMime = MailMime::Ptr(new MailMime); + mMailMime->d->mNode = part->mNode; +} + +void PartPrivate::createMailMime(const MimeTreeParser::TextMessagePart::Ptr& part) +{ + mMailMime = MailMime::Ptr(new MailMime); + mMailMime->d->mNode = part->mNode; +} + +void PartPrivate::createMailMime(const MimeTreeParser::MimeMessagePart::Ptr& part) +{ + mMailMime = MailMime::Ptr(new MailMime); + mMailMime->d->mNode = part->mNode; +} + void PartPrivate::appendSubPart(Part::Ptr subpart) { subpart->d->mParent = q; @@ -262,7 +298,16 @@ QByteArray Content::type() const MailMime::Ptr Content::mailMime() const { - return d->mMailMime; + if (d->mMailMime) { + return d->mMailMime; + } else { + return d->mParent->mailMime(); + } +} + +Part *Content::parent() const +{ + return d->mParent; } HtmlContent::HtmlContent(const QByteArray& content, Part* parent) @@ -311,6 +356,7 @@ void AlternativePartPrivate::fillFrom(MimeTreeParser::AlternativeMessagePart::Pt mContent["html"].append(content); content = std::make_shared(part->plaintextContent().toLocal8Bit(), q); mContent["plaintext"].append(content); + q->reachParentD()->createMailMime(part); } QVector AlternativePartPrivate::types() const @@ -349,6 +395,11 @@ QVector AlternativePart::content(const QByteArray& ct) const return d->content(ct); } +PartPrivate* AlternativePart::reachParentD() const +{ + return Part::d.get(); +} + class SinglePartPrivate { public: @@ -367,6 +418,7 @@ void SinglePartPrivate::fillFrom(MimeTreeParser::TextMessagePart::Ptr part) mContent.clear(); foreach (const auto &mp, part->subParts()) { mContent.append(std::make_shared(mp->text().toLocal8Bit(), q)); + q->reachParentD()->createMailMime(part); } } @@ -375,11 +427,12 @@ void SinglePartPrivate::fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part) mType = "html"; mContent.clear(); mContent.append(std::make_shared(part->text().toLocal8Bit(), q)); + q->reachParentD()->createMailMime(part); } void SinglePartPrivate::fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part) { - + q->reachParentD()->createMailMime(part.staticCast()); } SinglePart::SinglePart() @@ -411,6 +464,11 @@ QByteArray SinglePart::type() const return "SinglePart"; } +PartPrivate* SinglePart::reachParentD() const +{ + return Part::d.get(); +} + ParserPrivate::ParserPrivate(Parser* parser) : q(parser) , mNodeHelper(std::make_shared()) @@ -421,16 +479,16 @@ ParserPrivate::ParserPrivate(Parser* parser) void ParserPrivate::setMessage(const QByteArray& mimeMessage) { const auto mailData = KMime::CRLFtoLF(mimeMessage); - KMime::Message::Ptr msg(new KMime::Message); - msg->setContent(mailData); - msg->parse(); + mMsg = KMime::Message::Ptr(new KMime::Message); + mMsg->setContent(mailData); + mMsg->parse(); // render the mail StringHtmlWriter htmlWriter; ObjectTreeSource source(&htmlWriter); MimeTreeParser::ObjectTreeParser otp(&source, mNodeHelper.get()); - otp.parseObjectTree(msg.data()); + otp.parseObjectTree(mMsg.data()); mPartTree = otp.parsedPart().dynamicCast(); mEmbeddedPartMap = htmlWriter.embeddedParts(); @@ -494,6 +552,16 @@ QVector Parser::collectContentParts() const if (mime->isFirstTextPart()) { return true; } + + { + const auto parent = content->parent(); + if (parent) { + const auto _mime = parent->mailMime(); + if (_mime && (_mime->isTopLevelPart() || _mime->isFirstTextPart())) { + return true; + } + } + } const auto cd = mime->disposition(); if (cd && cd == MailMime::Inline) { // explict "inline" disposition: @@ -526,6 +594,7 @@ QVector Parser::collect(const Part::Ptr &start, std::function