diff --git a/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp b/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp --- a/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp +++ b/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp @@ -35,7 +35,6 @@ #include "messagepartrenderermanager.h" #include -#include #include #include #include @@ -403,18 +402,8 @@ void DefaultRendererPrivate::renderSubParts(const MessagePart::Ptr &msgPart, const QSharedPointer &htmlWriter) { - foreach (const auto &_m, msgPart->subParts()) { - const auto m = _m.dynamicCast(); - if (m) { - htmlWriter->queue(renderFactory(m, htmlWriter)); - } else { - auto hw = dynamic_cast(_m->htmlWriter()); - if (hw) { - hw->setBase(htmlWriter.data()); - _m->html(false); - } - } - } + foreach (const auto &m, msgPart->subParts()) + htmlWriter->queue(renderFactory(m, htmlWriter)); } QString DefaultRendererPrivate::render(const MessagePartList::Ptr &mp) @@ -433,9 +422,7 @@ = HTMLBlock::Ptr(new AttachmentMarkBlock(htmlWriter.data(), mp->attachmentNode())); } - mp->setHtmlWriter(htmlWriter.data()); renderSubParts(mp, htmlWriter); - mp->setHtmlWriter(mOldWriter); } return htmlWriter->html; @@ -1063,22 +1050,12 @@ if (mp) { return render(mp); } + } else if (auto mp = msgPart.dynamicCast()) { + return mp->formatOutput(); } - qCDebug(MESSAGEVIEWER_LOG) << "We got a unkonwn classname, using default behaviour for " + qCWarning(MESSAGEVIEWER_LOG) << "We got a unkonwn classname, using default behaviour for " << className; - - auto _htmlWriter = htmlWriter; - if (!_htmlWriter) { - _htmlWriter = QSharedPointer(new CacheHtmlWriter(mOldWriter)); - } - msgPart->setHtmlWriter(_htmlWriter.data()); - msgPart->html(false); - msgPart->setHtmlWriter(mOldWriter); - if (!htmlWriter) { - return _htmlWriter->html; - } - return QString(); } diff --git a/mimetreeparser/src/CMakeLists.txt b/mimetreeparser/src/CMakeLists.txt --- a/mimetreeparser/src/CMakeLists.txt +++ b/mimetreeparser/src/CMakeLists.txt @@ -43,7 +43,6 @@ set(libmimetreeparser_extra_SRCS #HTML Writer htmlwriter/filehtmlwriter.cpp - htmlwriter/queuehtmlwriter.cpp ) set(mimetreeparser_temporaryfile_SRCS @@ -88,7 +87,6 @@ ecm_generate_headers(MimeTreeParser_Camelcasehtmlwriter_HEADERS HEADER_NAMES FileHtmlWriter - QueueHtmlWriter REQUIRED_HEADERS MimeTreeParser_htmlwriter_HEADERS PREFIX MimeTreeParser RELATIVE htmlwriter diff --git a/mimetreeparser/src/htmlwriter/queuehtmlwriter.h b/mimetreeparser/src/htmlwriter/queuehtmlwriter.h deleted file mode 100644 --- a/mimetreeparser/src/htmlwriter/queuehtmlwriter.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - Copyright (c) 2015 Sandro Knauß - - This library is free software; you can redistribute it and/or modify it - under the terms of the GNU Library General Public License as published by - the Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This library is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public - License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ - -#ifndef __MIMETREEPARSER_QUEUEHTMLWRITER_H__ -#define __MIMETREEPARSER_QUEUEHTMLWRITER_H__ - -#include "mimetreeparser_export.h" -#include "mimetreeparser/htmlwriter.h" - -#include - -class QString; -class QByteArray; - -namespace MimeTreeParser { -/** -\brief Cache HTML output and not write them directy. - -This class is needed to make it possible to first process the mime tree and -afterwards render the HTML. - -Please do not use this class - it is only added to make it possible to slowly -move ObjectTreeParser to a process fist / render later. - -*/ -struct Command { - enum { - Begin, End, Reset, Write, Queue, Flush, EmbedPart, ExtraHead - } type; - QString s; - QByteArray b; -}; - -class MIMETREEPARSER_DEPRECATED_EXPORT QueueHtmlWriter : public HtmlWriter -{ -public: - explicit QueueHtmlWriter(MimeTreeParser::HtmlWriter *base); - virtual ~QueueHtmlWriter(); - - void setBase(HtmlWriter *base); - - void begin(const QString &cssDefs) override; - void end() override; - void reset() override; - void write(const QString &str) override; - void queue(const QString &str) override; - void flush() override; - void embedPart(const QByteArray &contentId, const QString &url) override; - void extraHead(const QString &str) override; - - void replay(); - -private: - HtmlWriter *mBase = nullptr; - QVector mQueue; -}; -} // namespace MimeTreeParser - -#endif // __MIMETREEPARSER_QUEUEHTMLWRITER_H__ diff --git a/mimetreeparser/src/htmlwriter/queuehtmlwriter.cpp b/mimetreeparser/src/htmlwriter/queuehtmlwriter.cpp deleted file mode 100644 --- a/mimetreeparser/src/htmlwriter/queuehtmlwriter.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* - Copyright (c) 2015 Sandro Knauß - - This library is free software; you can redistribute it and/or modify it - under the terms of the GNU Library General Public License as published by - the Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This library is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public - License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ - -#include "queuehtmlwriter.h" - -#include "mimetreeparser_debug.h" - -#include -#include - -using namespace MimeTreeParser; - -QueueHtmlWriter::QueueHtmlWriter(HtmlWriter *base) - : HtmlWriter() - , mBase(base) -{ -} - -QueueHtmlWriter::~QueueHtmlWriter() -{ -} - -void QueueHtmlWriter::setBase(HtmlWriter *base) -{ - mBase = base; -} - -void QueueHtmlWriter::begin(const QString &css) -{ - Command cmd; - cmd.type = Command::Begin; - cmd.s = css; - mQueue.append(cmd); -} - -void QueueHtmlWriter::end() -{ - Command cmd; - cmd.type = Command::End; - mQueue.append(cmd); -} - -void QueueHtmlWriter::reset() -{ - Command cmd; - cmd.type = Command::Reset; - mQueue.append(cmd); -} - -void QueueHtmlWriter::write(const QString &str) -{ - Command cmd; - cmd.type = Command::Write; - cmd.s = str; - mQueue.append(cmd); -} - -void QueueHtmlWriter::queue(const QString &str) -{ - Command cmd; - cmd.type = Command::Queue; - cmd.s = str; - mQueue.append(cmd); -} - -void QueueHtmlWriter::flush() -{ - Command cmd; - cmd.type = Command::Flush; - mQueue.append(cmd); -} - -void QueueHtmlWriter::replay() -{ - for (const auto &entry : qAsConst(mQueue)) { - switch (entry.type) { - case Command::Begin: - mBase->begin(entry.s); - break; - case Command::End: - mBase->end(); - break; - case Command::Reset: - mBase->reset(); - break; - case Command::Write: - mBase->write(entry.s); - break; - case Command::Queue: - mBase->queue(entry.s); - break; - case Command::Flush: - mBase->flush(); - break; - case Command::EmbedPart: - mBase->embedPart(entry.b, entry.s); - break; - case Command::ExtraHead: - mBase->extraHead(entry.s); - break; - } - } -} - -void QueueHtmlWriter::embedPart(const QByteArray &contentId, const QString &url) -{ - Command cmd; - cmd.type = Command::EmbedPart; - cmd.s = url; - cmd.b = contentId; - mQueue.append(cmd); -} - -void QueueHtmlWriter::extraHead(const QString &extra) -{ - Command cmd; - cmd.type = Command::ExtraHead; - cmd.s = extra; - mQueue.append(cmd); -} diff --git a/mimetreeparser/src/interfaces/bodypartformatter.h b/mimetreeparser/src/interfaces/bodypartformatter.h --- a/mimetreeparser/src/interfaces/bodypartformatter.h +++ b/mimetreeparser/src/interfaces/bodypartformatter.h @@ -56,25 +56,19 @@ Q_PROPERTY(QString htmlContent READ htmlContent) public: typedef QSharedPointer Ptr; - explicit MessagePart(); - explicit MessagePart(const BodyPart &part); + MessagePart(); virtual ~MessagePart(); - virtual void html(bool decorate); virtual QString text() const; void setParentPart(MessagePart *parentPart); MessagePart *parentPart() const; virtual QString plaintextContent() const; virtual QString htmlContent() const; - virtual MimeTreeParser::HtmlWriter *htmlWriter() const; - virtual void setHtmlWriter(MimeTreeParser::HtmlWriter *htmlWriter) const; private: MessagePartPrivate *d; - - friend class BodyPartFormatter; }; class MIMETREEPARSER_EXPORT BodyPartFormatter diff --git a/mimetreeparser/src/interfaces/bodypartformatter.cpp b/mimetreeparser/src/interfaces/bodypartformatter.cpp --- a/mimetreeparser/src/interfaces/bodypartformatter.cpp +++ b/mimetreeparser/src/interfaces/bodypartformatter.cpp @@ -33,7 +33,7 @@ #include "bodypartformatter.h" #include "bodypart.h" -#include "htmlwriter/queuehtmlwriter.h" +#include "viewer/messagepart.h" #include "viewer/objecttreeparser.h" using namespace MimeTreeParser::Interface; @@ -43,60 +43,22 @@ class MessagePartPrivate { public: - MessagePartPrivate(const BodyPart *part) - : mHtmlWriter(nullptr) - , mPart(part) - , mParentPart(nullptr) - , mCreatedWriter(false) - { - } - - ~MessagePartPrivate() - { - if (mCreatedWriter) { - delete mHtmlWriter; - } - } - - MimeTreeParser::HtmlWriter *htmlWriter() - { - if (!mHtmlWriter && mPart) { - mHtmlWriter = mPart->objectTreeParser()->htmlWriter(); - } - return mHtmlWriter; - } - - MimeTreeParser::HtmlWriter *mHtmlWriter = nullptr; - const BodyPart *mPart = nullptr; MessagePart *mParentPart = nullptr; - bool mCreatedWriter; }; } } MessagePart::MessagePart() : QObject() - , d(new MessagePartPrivate(nullptr)) -{ -} - -MessagePart::MessagePart(const BodyPart &part) - : QObject() - , d(new MessagePartPrivate(&part)) + , d(new MessagePartPrivate) { } MessagePart::~MessagePart() { delete d; } -void MessagePart::html(bool decorate) -{ - Q_UNUSED(decorate); - static_cast(d->mHtmlWriter)->replay(); -} - QString MessagePart::text() const { return QString(); @@ -122,30 +84,16 @@ return text(); } -MimeTreeParser::HtmlWriter *MessagePart::htmlWriter() const -{ - return d->htmlWriter(); -} - -void MessagePart::setHtmlWriter(MimeTreeParser::HtmlWriter *htmlWriter) const -{ - if (d->mHtmlWriter) { - d->mHtmlWriter = htmlWriter; - } -} - BodyPartFormatter::Result BodyPartFormatter::format(BodyPart *part, MimeTreeParser::HtmlWriter *writer) const { Q_UNUSED(part); Q_UNUSED(writer); return Failed; } -MessagePart::Ptr BodyPartFormatter::process(BodyPart &part) const +MessagePart::Ptr BodyPartFormatter::process(BodyPart&) const { - auto mp = MessagePart::Ptr(new MessagePart(part)); - mp->setHtmlWriter(new QueueHtmlWriter(mp->htmlWriter())); - mp->d->mCreatedWriter = true; + auto mp = MessagePart::Ptr(new LegacyPluginMessagePart); return mp; } diff --git a/mimetreeparser/src/viewer/messagepart.h b/mimetreeparser/src/viewer/messagepart.h --- a/mimetreeparser/src/viewer/messagepart.h +++ b/mimetreeparser/src/viewer/messagepart.h @@ -34,6 +34,8 @@ #include #include +#include + class QTextCodec; class PartPrivate; class TextPartRendered; @@ -95,9 +97,6 @@ const QVector &subParts() const; bool hasSubParts() const; - HtmlWriter *htmlWriter() const override; - void setHtmlWriter(HtmlWriter *htmlWriter) const override; - Interface::ObjectTreeSource *source() const; KMime::Content *attachmentNode() const; @@ -116,6 +115,21 @@ bool mRoot; }; +// TODO remove once all plugins are ported away from BPF::format() +class MIMETREEPARSER_DEPRECATED_EXPORT LegacyPluginMessagePart : public Interface::MessagePart +{ + Q_OBJECT +public: + LegacyPluginMessagePart(); + ~LegacyPluginMessagePart(); + + HtmlWriter *htmlWriter() const; + QString formatOutput() const; + +private: + std::unique_ptr m_htmlWriter; +}; + class MIMETREEPARSER_EXPORT MimeMessagePart : public MessagePart { Q_OBJECT diff --git a/mimetreeparser/src/viewer/messagepart.cpp b/mimetreeparser/src/viewer/messagepart.cpp --- a/mimetreeparser/src/viewer/messagepart.cpp +++ b/mimetreeparser/src/viewer/messagepart.cpp @@ -119,17 +119,6 @@ return mOtp->mSource; } -HtmlWriter *MessagePart::htmlWriter() const -{ - Q_ASSERT(mOtp); - return mOtp->htmlWriter(); -} - -void MessagePart::setHtmlWriter(HtmlWriter *htmlWriter) const -{ - mOtp->mHtmlWriter = htmlWriter; -} - void MessagePart::parseInternal(KMime::Content *node, bool onlyOneMimePart) { auto subMessagePart = mOtp->parseObjectTreeInternal(node, onlyOneMimePart); @@ -174,6 +163,41 @@ return !mBlocks.isEmpty(); } +//-----LegacyMessagePart-------------------- +class LegacyHtmlWriter : public HtmlWriter +{ +public: + void begin(const QString&) override {} + void end() override {} + void extraHead(const QString&) override {} + void embedPart(const QByteArray&, const QString&) override {} + void flush() override {} + void queue(const QString &str) override { text += str; } + void write(const QString &html) override { text += html; } + void reset() override {} + + QString text; +}; + +LegacyPluginMessagePart::LegacyPluginMessagePart() + : m_htmlWriter(new LegacyHtmlWriter) +{ +} + +LegacyPluginMessagePart::~LegacyPluginMessagePart() +{ +} + +HtmlWriter* LegacyPluginMessagePart::htmlWriter() const +{ + return m_htmlWriter.get(); +} + +QString LegacyPluginMessagePart::formatOutput() const +{ + return static_cast(m_htmlWriter.get())->text; +} + //-----MessagePartList---------------------- MessagePartList::MessagePartList(ObjectTreeParser *otp) : MessagePart(otp, QString()) diff --git a/mimetreeparser/src/viewer/objecttreeparser.cpp b/mimetreeparser/src/viewer/objecttreeparser.cpp --- a/mimetreeparser/src/viewer/objecttreeparser.cpp +++ b/mimetreeparser/src/viewer/objecttreeparser.cpp @@ -214,12 +214,9 @@ continue; } - if (const auto mp = result.dynamicCast()) { - mp->setAttachmentFlag(node); - return result; - } else { - Q_ASSERT(mimeType != "application/octet-stream"); // can't happen, the above branch will be taken for that - const auto r = formatter->format(&part, result->htmlWriter()); + // ### legacy BFP::format() handling, can be removed once all plugins are ported away from that + if (const auto legacyPart = result.dynamicCast()) { + const auto r = formatter->format(&part, legacyPart->htmlWriter()); if (r == Interface::BodyPartFormatter::AsIcon) { processResult.setNeverDisplayInline(true); mNodeHelper->setNodeDisplayedEmbedded(node, false); @@ -234,6 +231,10 @@ processResult.setNeverDisplayInline(true); return result; } + } else { + if (auto mp = result.dynamicCast()) + mp->setAttachmentFlag(node); + return result; } }