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);