diff --git a/mimetreeparser/src/bodyformatter/mailman.cpp b/mimetreeparser/src/bodyformatter/mailman.cpp index 0736597b972dce96ab1eb81051af7fded0f90ea0..1e94a0ac93c8c83b6ac542e882a4501a42b7a561 100644 --- a/mimetreeparser/src/bodyformatter/mailman.cpp +++ b/mimetreeparser/src/bodyformatter/mailman.cpp @@ -114,7 +114,7 @@ Interface::MessagePart::Ptr MailmanBodyPartFormatter::process(Interface::BodyPar digestHeaderStr += str.midRef(0, thisDelim); MessagePartList::Ptr mpl(new MessagePartList(part.objectTreeParser())); - mpl->appendMessagePart(createAndParseTempNode(part, part.topLevelContent(), digestHeaderStr.toLatin1(), "Digest Header")); + mpl->appendSubPart(createAndParseTempNode(part, part.topLevelContent(), digestHeaderStr.toLatin1(), "Digest Header")); //mReader->queueHtml("


"); // temporarily change curent node's Content-Type // to get our embedded RfC822 messages properly inserted @@ -151,7 +151,7 @@ Interface::MessagePart::Ptr MailmanBodyPartFormatter::process(Interface::BodyPar } } qCDebug(MIMETREEPARSER_LOG) << " embedded message found: \"" << subject; - mpl->appendMessagePart(createAndParseTempNode(part, part.topLevelContent(), partStr.toLatin1(), subject.toLatin1())); + mpl->appendSubPart(createAndParseTempNode(part, part.topLevelContent(), partStr.toLatin1(), subject.toLatin1())); //mReader->queueHtml("


"); thisDelim = nextDelim + 1; nextDelim = str.indexOf(delim1, thisDelim, Qt::CaseInsensitive); @@ -179,6 +179,6 @@ Interface::MessagePart::Ptr MailmanBodyPartFormatter::process(Interface::BodyPar } partStr = QStringLiteral("Content-Type: text/plain\nContent-Description: digest footer\n\n"); partStr += str.midRef(thisDelim); - mpl->appendMessagePart(createAndParseTempNode(part, part.topLevelContent(), partStr.toLatin1(), "Digest Footer")); + mpl->appendSubPart(createAndParseTempNode(part, part.topLevelContent(), partStr.toLatin1(), "Digest Footer")); return mpl; } diff --git a/mimetreeparser/src/interfaces/bodypartformatter.cpp b/mimetreeparser/src/interfaces/bodypartformatter.cpp index 39de55626ae889ed35c1823540ae5d01d9b8f474..d903e7a4ca995b498abf031aee2c14cc891a8c69 100644 --- a/mimetreeparser/src/interfaces/bodypartformatter.cpp +++ b/mimetreeparser/src/interfaces/bodypartformatter.cpp @@ -42,6 +42,7 @@ MessagePart::MessagePart() : QObject() , mHtmlWriter(Q_NULLPTR) , mPart(Q_NULLPTR) + , mParentPart(Q_NULLPTR) { } @@ -49,6 +50,7 @@ MessagePart::MessagePart(const BodyPart &part) : QObject() , mHtmlWriter(Q_NULLPTR) , mPart(&part) + , mParentPart(Q_NULLPTR) { } @@ -68,6 +70,16 @@ QString MessagePart::text() const return QString(); } +MessagePart* MessagePart::parentPart() const +{ + return mParentPart; +} + +void MessagePart::setParentPart(MessagePart* parentPart) +{ + mParentPart = parentPart; +} + MimeTreeParser::HtmlWriter *MessagePart::htmlWriter() { if (!mHtmlWriter) { diff --git a/mimetreeparser/src/interfaces/bodypartformatter.h b/mimetreeparser/src/interfaces/bodypartformatter.h index d247038e8a226ac6e5c8e1cf0a2c86813b4d8e54..37550e54064a1ea4f0a9d2a18a0a9edcada1207e 100644 --- a/mimetreeparser/src/interfaces/bodypartformatter.h +++ b/mimetreeparser/src/interfaces/bodypartformatter.h @@ -63,11 +63,15 @@ public: virtual void html(bool decorate); virtual QString text() const; + void setParentPart(MessagePart *parentPart); + MessagePart *parentPart() const; + private: MimeTreeParser::HtmlWriter *htmlWriter(); MimeTreeParser::HtmlWriter *mHtmlWriter; const BodyPart *mPart; + MessagePart *mParentPart; friend class BodyPartFormatter; }; diff --git a/mimetreeparser/src/viewer/messagepart.cpp b/mimetreeparser/src/viewer/messagepart.cpp index 470591529765fd7203903f2c2f3601d823257579..904804a0abd851c9ae80e93bad1e1b20452af496 100644 --- a/mimetreeparser/src/viewer/messagepart.cpp +++ b/mimetreeparser/src/viewer/messagepart.cpp @@ -1123,6 +1123,9 @@ void MessagePart::parseInternal(KMime::Content *node, bool onlyOneMimePart) mSubOtp = new ObjectTreeParser(mOtp, onlyOneMimePart); mSubOtp->setAllowAsync(mOtp->allowAsync()); mSubMessagePart = mSubOtp->parseObjectTreeInternal(node); + foreach(auto part, mSubMessagePart->subParts()) { + part->setParentPart(this); + } } void MessagePart::renderInternalHtml(bool decorate) const @@ -1157,6 +1160,22 @@ void MessagePart::fix() const } } +void MessagePart::appendSubPart(const Interface::MessagePart::Ptr &messagePart) +{ + messagePart->setParentPart(this); + mBlocks.append(messagePart); +} + +const QVector &MessagePart::subParts() const +{ + return mBlocks; +} + +bool MessagePart::hasSubParts() const +{ + return !mBlocks.isEmpty(); +} + //-----MessagePartList---------------------- MessagePartList::MessagePartList(ObjectTreeParser *otp) : MessagePart(otp, QString()) @@ -1187,15 +1206,6 @@ HTMLBlock::Ptr MessagePartList::rootBlock() const return HTMLBlock::Ptr(); } -void MessagePartList::appendMessagePart(const Interface::MessagePart::Ptr &messagePart) -{ - mBlocks.append(messagePart); -} - -const QVector &MessagePartList::messageParts() const -{ - return mBlocks; -} void MessagePartList::html(bool decorate) { @@ -1207,7 +1217,7 @@ void MessagePartList::html(bool decorate) void MessagePartList::htmlInternal(bool decorate) { - foreach (const auto &mp, mBlocks) { + foreach (const auto &mp, subParts()) { mp->html(decorate); } } @@ -1215,7 +1225,7 @@ void MessagePartList::htmlInternal(bool decorate) QString MessagePartList::text() const { QString text; - foreach (const auto &mp, mBlocks) { + foreach (const auto &mp, subParts()) { text += mp->text(); } return text; @@ -1223,7 +1233,7 @@ QString MessagePartList::text() const void MessagePartList::fix() const { - foreach (const auto &mp, mBlocks) { + foreach (const auto &mp, subParts()) { const auto m = mp.dynamicCast(); if (m) { m->fix(); @@ -1233,7 +1243,7 @@ void MessagePartList::fix() const void MessagePartList::copyContentFrom() const { - foreach (const auto &mp, mBlocks) { + foreach (const auto &mp, subParts()) { const auto m = mp.dynamicCast(); if (m) { m->copyContentFrom(); @@ -1301,12 +1311,12 @@ void TextMessagePart::parseContent() if (block.type() == NoPgpBlock && !block.text().trimmed().isEmpty()) { fullySignedOrEncryptedTmp = false; - appendMessagePart(MessagePart::Ptr(new MessagePart(mOtp, aCodec->toUnicode(block.text())))); + appendSubPart(MessagePart::Ptr(new MessagePart(mOtp, aCodec->toUnicode(block.text())))); } else if (block.type() == PgpMessageBlock) { CryptoMessagePart::Ptr mp(new CryptoMessagePart(mOtp, QString(), cryptProto, fromAddress, Q_NULLPTR)); mp->setDecryptMessage(decryptMessage()); mp->setIsEncrypted(true); - appendMessagePart(mp); + appendSubPart(mp); if (!decryptMessage()) { continue; } @@ -1316,13 +1326,13 @@ void TextMessagePart::parseContent() } } else if (block.type() == ClearsignedBlock) { CryptoMessagePart::Ptr mp(new CryptoMessagePart(mOtp, QString(), cryptProto, fromAddress, Q_NULLPTR)); - appendMessagePart(mp); + appendSubPart(mp); mp->startVerification(block.text(), aCodec); } else { continue; } - const auto mp = messageParts().last().staticCast(); + const auto mp = subParts().last().staticCast(); const PartMetaData *messagePart(mp->partMetaData()); if (!messagePart->isEncrypted && !messagePart->isSigned && !block.text().trimmed().isEmpty()) { diff --git a/mimetreeparser/src/viewer/messagepart.h b/mimetreeparser/src/viewer/messagepart.h index b5646fa28470d3bf99dbbfd3c1dbf50ecdf74246..30b32a29f287e9fdd22467b4a63da43e6ca03e71 100644 --- a/mimetreeparser/src/viewer/messagepart.h +++ b/mimetreeparser/src/viewer/messagepart.h @@ -233,6 +233,10 @@ public: virtual void fix() const; virtual void copyContentFrom() const; + void appendSubPart(const Interface::MessagePart::Ptr &messagePart); + const QVector &subParts() const; + bool hasSubParts() const; + protected: void parseInternal(KMime::Content *node, bool onlyOneMimePart); void renderInternalHtml(bool decorate) const; @@ -245,6 +249,8 @@ protected: MessagePart::Ptr mSubMessagePart; PartMetaData mMetaData; KMime::Content *mAttachmentNode; +private: + QVector mBlocks; }; class MimeMessagePart : public MessagePart @@ -277,10 +283,6 @@ public: void setIsRoot(bool root); bool isRoot() const; - void appendMessagePart(const Interface::MessagePart::Ptr &messagePart); - - const QVector &messageParts() const; - void fix() const Q_DECL_OVERRIDE; void copyContentFrom() const Q_DECL_OVERRIDE; @@ -289,7 +291,6 @@ protected: void htmlInternal(bool decorate); private: - QVector mBlocks; bool mRoot; }; diff --git a/mimetreeparser/src/viewer/objecttreeparser.cpp b/mimetreeparser/src/viewer/objecttreeparser.cpp index e76a02b44e44453659b26ab67052802a1b367c20..85b193f018a730509d82e0a7068b8ad6a59989e9 100644 --- a/mimetreeparser/src/viewer/objecttreeparser.cpp +++ b/mimetreeparser/src/viewer/objecttreeparser.cpp @@ -308,11 +308,11 @@ MessagePart::Ptr ObjectTreeParser::parseObjectTreeInternal(KMime::Content *node) Interface::MessagePartPtr mp; if (processType(node, processResult, mediaType, subType, mp)) { if (mp) { - mpl->appendMessagePart(mp); + mpl->appendSubPart(mp); } } else if (processType(node, processResult, mediaType, "*", mp)) { if (mp) { - mpl->appendMessagePart(mp); + mpl->appendSubPart(mp); } } else { qCWarning(MIMETREEPARSER_LOG) << "THIS SHOULD NO LONGER HAPPEN:" << mediaType << '/' << subType; @@ -321,7 +321,7 @@ MessagePart::Ptr ObjectTreeParser::parseObjectTreeInternal(KMime::Content *node) if (auto _mp = mp.dynamicCast()) { _mp->setAttachmentFlag(node); } - mpl->appendMessagePart(mp); + mpl->appendSubPart(mp); } } mNodeHelper->setNodeProcessed(node, false);