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 @@ -87,17 +87,21 @@ PartMetaData *block, const QString &text); - virtual ~MessagePart() {} + virtual ~MessagePart(); virtual QString text() const; void setText(const QString &text); virtual void html(bool decorate) const; PartMetaData *partMetaData() const; protected: + void parseInternal(KMime::Content* node); + void renderInternalHtml() const; + QString renderInternalText() const; QString mText; ObjectTreeParser *mOtp; + ObjectTreeParser *mSubOtp; PartMetaData *mMetaData; }; @@ -114,7 +118,6 @@ private: const KMime::Message::Ptr mMessage; KMime::Content *mNode; - ObjectTreeParser *mSubOtp; }; class CryptoMessagePart : public MessagePart @@ -146,7 +149,6 @@ void writeDeferredDecryptionBlock() const; protected: - ObjectTreeParser *mSubOtp; const Kleo::CryptoBackend::Protocol *mCryptoProto; QString mFromAddress; KMime::Content *mNode; 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 @@ -108,11 +108,22 @@ const QString &text) : mText(text) , mOtp(otp) + , mSubOtp(Q_NULLPTR) , mMetaData(block) { } +MessagePart::~MessagePart() +{ + if (mSubOtp) { + delete mSubOtp->mHtmlWriter; + delete mSubOtp; + mSubOtp = Q_NULLPTR; + } +} + + PartMetaData *MessagePart::partMetaData() const { return mMetaData; @@ -140,6 +151,31 @@ writer->queue(mOtp->quotedHTML(text(), decorate)); } +void MessagePart::parseInternal(KMime::Content* node) +{ + mSubOtp = new ObjectTreeParser(mOtp, true); + mSubOtp->setAllowAsync(mOtp->allowAsync()); + if (mOtp->htmlWriter()) { + mSubOtp->mHtmlWriter = new QueueHtmlWriter(mOtp->htmlWriter()); + } + mSubOtp->parseObjectTreeInternal(node); +} + +void MessagePart::renderInternalHtml() const +{ + if (mSubOtp) { + static_cast(mSubOtp->htmlWriter())->replay(); + } +} + +QString MessagePart::renderInternalText() const +{ + if (!mSubOtp) { + return QString(); + } + return mSubOtp->plainTextContent(); +} + //-----CryptMessageBlock--------------------- CryptoMessagePart::CryptoMessagePart(ObjectTreeParser *otp, @@ -149,7 +185,6 @@ const QString &fromAddress, KMime::Content *node) : MessagePart(otp, block, text) - , mSubOtp(0) , mCryptoProto(cryptoProto) , mFromAddress(fromAddress) , mNode(node) @@ -167,11 +202,7 @@ CryptoMessagePart::~CryptoMessagePart() { - if (mSubOtp) { - delete mSubOtp->mHtmlWriter; - delete mSubOtp; - mSubOtp = 0; - } + } void CryptoMessagePart::startDecryption(const QByteArray &text, const QTextCodec *aCodec) @@ -244,12 +275,7 @@ } mOtp->mNodeHelper->attachExtraContent(mNode, tempNode); - mSubOtp = new ObjectTreeParser(mOtp, true); - mSubOtp->setAllowAsync(mOtp->allowAsync()); - if (mOtp->htmlWriter()) { - mSubOtp->mHtmlWriter = new QueueHtmlWriter(mOtp->htmlWriter()); - } - mSubOtp->parseObjectTreeInternal(tempNode); + parseInternal(tempNode); } } } @@ -291,15 +317,9 @@ } if (!mVerifiedText.isEmpty() && textNode) { - mSubOtp = new ObjectTreeParser(mOtp, true); - mSubOtp->setAllowAsync(mOtp->allowAsync()); - if (mOtp->htmlWriter()) { - mSubOtp->mHtmlWriter = new QueueHtmlWriter(mOtp->htmlWriter()); - } - mSubOtp->parseObjectTreeInternal(textNode); + parseInternal(textNode); } } - } void CryptoMessagePart::writeDeferredDecryptionBlock() const @@ -370,9 +390,7 @@ } } else if (mNode) { const CryptoBlock block(mOtp, mMetaData, mCryptoProto, mFromAddress, mNode); - if (mSubOtp) { - static_cast(mSubOtp->htmlWriter())->replay(); - } + renderInternalHtml(); } else { MessagePart::html(decorate); } @@ -383,7 +401,6 @@ : MessagePart(otp, block, QString()) , mMessage(message) , mNode(node) - , mSubOtp(0) { mMetaData->isEncrypted = false; mMetaData->isSigned = false; @@ -401,12 +418,7 @@ // since the user can click the link and expect to have normal attachment operations there. mOtp->nodeHelper()->writeNodeToTempFile(message.data()); - mSubOtp = new ObjectTreeParser(mOtp, true); - mSubOtp->setAllowAsync(mOtp->allowAsync()); - if (mOtp->htmlWriter()) { - mSubOtp->mHtmlWriter = new QueueHtmlWriter(mOtp->htmlWriter()); - } - mSubOtp->parseObjectTreeInternal(message.data()); + parseInternal(message.data()); } EncapsulatedRfc822MessagePart::~EncapsulatedRfc822MessagePart() @@ -416,6 +428,7 @@ void EncapsulatedRfc822MessagePart::html(bool decorate) const { + Q_UNUSED(decorate) if (!mSubOtp) { return; } @@ -428,15 +441,13 @@ const CryptoBlock block(mOtp, mMetaData, 0, mMessage->from()->asUnicodeString(), mMessage.data()); writer->queue(mOtp->mSource->createMessageHeader(mMessage.data())); - static_cast(mSubOtp->htmlWriter())->replay(); + renderInternalHtml(); mOtp->nodeHelper()->setPartMetaData(mNode, *mMetaData); } QString EncapsulatedRfc822MessagePart::text() const { - if (!mSubOtp) { - return QString(); - } - return mSubOtp->plainTextContent(); + return renderInternalText(); } +