diff --git a/messageviewer/src/viewer/messagepart.h b/messageviewer/src/viewer/messagepart.h --- a/messageviewer/src/viewer/messagepart.h +++ b/messageviewer/src/viewer/messagepart.h @@ -96,15 +96,31 @@ PartMetaData *partMetaData() const; protected: - void parseInternal(KMime::Content* node); + void parseInternal(KMime::Content* node, bool onlyOneMimePart); void renderInternalHtml() const; + void copyContentFrom() const; QString renderInternalText() const; QString mText; ObjectTreeParser *mOtp; ObjectTreeParser *mSubOtp; PartMetaData *mMetaData; }; +class MimeMessagePart : public MessagePart +{ +public: + typedef QSharedPointer Ptr; + MimeMessagePart( MessageViewer::ObjectTreeParser* otp, KMime::Content* node, bool onlyOneMimePart ); + virtual ~MimeMessagePart(); + + QString text() const Q_DECL_OVERRIDE; + void html(bool decorate) Q_DECL_OVERRIDE; + +private: + KMime::Content* mNode; + bool mOnlyOneMimePart; +}; + class EncapsulatedRfc822MessagePart : public MessagePart { public: diff --git a/messageviewer/src/viewer/messagepart.cpp b/messageviewer/src/viewer/messagepart.cpp --- a/messageviewer/src/viewer/messagepart.cpp +++ b/messageviewer/src/viewer/messagepart.cpp @@ -119,7 +119,7 @@ MessagePart::~MessagePart() { if (mSubOtp) { - delete mSubOtp->mHtmlWriter; + delete mSubOtp->htmlWriter(); delete mSubOtp; mSubOtp = Q_NULLPTR; } @@ -153,9 +153,9 @@ writer->queue(mOtp->quotedHTML(text(), decorate)); } -void MessagePart::parseInternal(KMime::Content* node) +void MessagePart::parseInternal(KMime::Content* node, bool onlyOneMimePart) { - mSubOtp = new ObjectTreeParser(mOtp, true); + mSubOtp = new ObjectTreeParser(mOtp, onlyOneMimePart); mSubOtp->setAllowAsync(mOtp->allowAsync()); if (mOtp->htmlWriter()) { mSubOtp->mHtmlWriter = new QueueHtmlWriter(mOtp->htmlWriter()); @@ -170,14 +170,53 @@ } } +void MessagePart::copyContentFrom() const +{ + if (mSubOtp) { + mOtp->copyContentFrom(mSubOtp); + } +} + QString MessagePart::renderInternalText() const { if (!mSubOtp) { return QString(); } return mSubOtp->plainTextContent(); } + +//-----MimeMessageBlock---------------------- + +MimeMessagePart::MimeMessagePart(ObjectTreeParser* otp, KMime::Content* node, bool onlyOneMimePart) +: MessagePart(otp, QString()) +, mNode(node) +, mOnlyOneMimePart(onlyOneMimePart) +{ + if (!mNode) { + qCWarning(MESSAGEVIEWER_LOG) << "not a valid node"; + return; + } + + parseInternal(mNode, mOnlyOneMimePart); +} + +MimeMessagePart::~MimeMessagePart() +{ + +} + +void MimeMessagePart::html(bool decorate) +{ + copyContentFrom(); + renderInternalHtml(); +} + +QString MimeMessagePart::text() const +{ + return renderInternalText(); +} + //-----CryptMessageBlock--------------------- CryptoMessagePart::CryptoMessagePart(ObjectTreeParser *otp, @@ -277,7 +316,7 @@ } mOtp->mNodeHelper->attachExtraContent(mNode, tempNode); - parseInternal(tempNode); + parseInternal(tempNode, false); } } } @@ -319,9 +358,10 @@ } if (!mVerifiedText.isEmpty() && textNode) { - parseInternal(textNode); + parseInternal(textNode, false); } } + } void CryptoMessagePart::writeDeferredDecryptionBlock() const @@ -354,9 +394,7 @@ MessageViewer::HtmlWriter *writer = mOtp->htmlWriter(); //TODO: still the following part should not be here - if (mSubOtp) { - mOtp->copyContentFrom(mSubOtp); - } + copyContentFrom(); if (mMetaData->isEncrypted && !mDecryptMessage) { mMetaData->isDecryptable = true; @@ -420,7 +458,7 @@ // since the user can click the link and expect to have normal attachment operations there. mOtp->nodeHelper()->writeNodeToTempFile(message.data()); - parseInternal(message.data()); + parseInternal(message.data(), false); } EncapsulatedRfc822MessagePart::~EncapsulatedRfc822MessagePart()