diff --git a/messageviewer/src/messagepartthemes/default/cachehtmlwriter.h b/messageviewer/src/messagepartthemes/default/cachehtmlwriter.h deleted file mode 100644 --- a/messageviewer/src/messagepartthemes/default/cachehtmlwriter.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - Copyright (c) 2016 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 MESSAGEVIEWER_CACHEHTMLWRITER_H -#define MESSAGEVIEWER_CACHEHTMLWRITER_H - -#include "messageviewer_export.h" -#include - -#include - -namespace MessageViewer { - -/** @deprecated port to proper streaming API */ -class MESSAGEVIEWER_DEPRECATED CacheHtmlWriter : public MimeTreeParser::BufferedHtmlWriter -{ -public: - explicit CacheHtmlWriter(MimeTreeParser::HtmlWriter *baseWriter = nullptr) - : mBaseWriter(baseWriter) - { - BufferedHtmlWriter::begin(); - } - ~CacheHtmlWriter() = default; - - void embedPart(const QByteArray &contentId, const QString &url) override - { - if (mBaseWriter) - mBaseWriter->embedPart(contentId, url); - else - embedParts.insert(contentId, url); - } - - void extraHead(const QString &extra) override - { - if (mBaseWriter) - mBaseWriter->extraHead(extra); - else - head.append(extra); - } - - QString html() - { - BufferedHtmlWriter::end(); - return QString::fromUtf8(data()); - } - - QString head; - QMap embedParts; - -private: - MimeTreeParser::HtmlWriter *mBaseWriter = nullptr; -}; - -} - -#endif // MESSAGEVIEWER_CACHEHTMLWRITER_H diff --git a/messageviewer/src/messagepartthemes/default/defaultrenderer.h b/messageviewer/src/messagepartthemes/default/defaultrenderer.h --- a/messageviewer/src/messagepartthemes/default/defaultrenderer.h +++ b/messageviewer/src/messagepartthemes/default/defaultrenderer.h @@ -20,8 +20,6 @@ #ifndef __MESSAGEVIEWER_DEFAULTRENDERER_H__ #define __MESSAGEVIEWER_DEFAULTRENDERER_H__ -#include - #include namespace MimeTreeParser { @@ -34,14 +32,12 @@ namespace MessageViewer { class CSSHelperBase; -class DefaultRenderer : public MimeTreeParser::Interface::MessagePartRenderer +class DefaultRenderer { public: DefaultRenderer(const MimeTreeParser::MessagePartPtr &msgPart, CSSHelperBase *cssHelder, MimeTreeParser::HtmlWriter *writer); ~DefaultRenderer(); - QString html() const override; - private: MimeTreeParser::DefaultRendererPrivate *d; }; 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 @@ -23,7 +23,6 @@ #include "messageviewer_debug.h" -#include "cachehtmlwriter.h" #include "converthtmltoplaintext.h" #include "messagepartrendererbase.h" #include "messagepartrendererfactory.h" @@ -56,14 +55,9 @@ #include #include -#include - using namespace MimeTreeParser; using namespace MessageViewer; -typedef std::function GrantleeCallback; -Q_DECLARE_METATYPE(GrantleeCallback) - Q_DECLARE_METATYPE(GpgME::DecryptionResult::Recipient) Q_DECLARE_METATYPE(const QGpgME::Protocol *) @@ -315,11 +309,10 @@ DefaultRendererPrivate::DefaultRendererPrivate(const MessagePart::Ptr &msgPart, CSSHelperBase *cssHelper, HtmlWriter *writer, const MessagePartRendererFactory *rendererFactory) : mMsgPart(msgPart) - , mOldWriter(writer) , mCSSHelper(cssHelper) , mRendererFactory(rendererFactory) { - mHtml = renderFactory(mMsgPart, nullptr); + renderFactory(mMsgPart, writer); } DefaultRendererPrivate::~DefaultRendererPrivate() @@ -339,7 +332,7 @@ void DefaultRendererPrivate::renderSubParts(const MessagePart::Ptr &msgPart, HtmlWriter *htmlWriter) { foreach (const auto &m, msgPart->subParts()) - htmlWriter->write(renderFactory(m, htmlWriter)); + renderFactory(m, htmlWriter); } void DefaultRendererPrivate::render(const MessagePartList::Ptr &mp, HtmlWriter *htmlWriter) @@ -850,61 +843,59 @@ return false; } -QString DefaultRendererPrivate::renderFactory(const MessagePart::Ptr &msgPart, HtmlWriter *_htmlWriter) +void DefaultRendererPrivate::renderFactory(const MessagePart::Ptr &msgPart, HtmlWriter *htmlWriter) { - auto htmlWriter = QSharedPointer(new CacheHtmlWriter(mOldWriter)); const QString className = QString::fromUtf8(msgPart->metaObject()->className()); - if (renderWithFactory(className, msgPart, htmlWriter.data())) - return htmlWriter->html(); + if (renderWithFactory(className, msgPart, htmlWriter)) + return; if (className == QStringLiteral("MimeTreeParser::MessagePartList")) { auto mp = msgPart.dynamicCast(); if (mp) { - render(mp, htmlWriter.data()); + render(mp, htmlWriter); } } else if (className == QStringLiteral("MimeTreeParser::MimeMessagePart")) { auto mp = msgPart.dynamicCast(); if (mp) { - render(mp, htmlWriter.data()); + render(mp, htmlWriter); } } else if (className == QStringLiteral("MimeTreeParser::EncapsulatedRfc822MessagePart")) { auto mp = msgPart.dynamicCast(); if (mp) { - render(mp, htmlWriter.data()); + render(mp, htmlWriter); } } else if (className == QStringLiteral("MimeTreeParser::HtmlMessagePart")) { auto mp = msgPart.dynamicCast(); if (mp) { - render(mp, htmlWriter.data()); + render(mp, htmlWriter); } } else if (className == QStringLiteral("MimeTreeParser::SignedMessagePart")) { auto mp = msgPart.dynamicCast(); if (mp) { - render(mp, htmlWriter.data()); + render(mp, htmlWriter); } } else if (className == QStringLiteral("MimeTreeParser::EncryptedMessagePart")) { auto mp = msgPart.dynamicCast(); if (mp) { - render(mp, htmlWriter.data()); + render(mp, htmlWriter); } } else if (className == QStringLiteral("MimeTreeParser::AlternativeMessagePart")) { auto mp = msgPart.dynamicCast(); if (mp) { - render(mp, htmlWriter.data()); + render(mp, htmlWriter); } } else if (className == QStringLiteral("MimeTreeParser::CertMessagePart")) { auto mp = msgPart.dynamicCast(); if (mp) { - render(mp, htmlWriter.data()); + render(mp, htmlWriter); } } else if (auto mp = msgPart.dynamicCast()) { - return mp->formatOutput(); + htmlWriter->write(mp->formatOutput()); } else { qCWarning(MESSAGEVIEWER_LOG) << "We got a unkonwn classname, using default behaviour for " << className; } - return htmlWriter->html(); } DefaultRenderer::DefaultRenderer(const MimeTreeParser::MessagePart::Ptr &msgPart, CSSHelperBase *cssHelper, MimeTreeParser::HtmlWriter *writer) @@ -916,8 +907,3 @@ { delete d; } - -QString DefaultRenderer::html() const -{ - return d->mHtml; -} diff --git a/messageviewer/src/messagepartthemes/default/defaultrenderer_p.h b/messageviewer/src/messagepartthemes/default/defaultrenderer_p.h --- a/messageviewer/src/messagepartthemes/default/defaultrenderer_p.h +++ b/messageviewer/src/messagepartthemes/default/defaultrenderer_p.h @@ -46,7 +46,7 @@ Interface::ObjectTreeSource *source() const; - void renderSubParts(const MessagePart::Ptr &msgPart, HtmlWriter *htmlWriter); + void renderSubParts(const MessagePart::Ptr &msgPart, HtmlWriter *htmlWriter) override; void render(const MessagePartList::Ptr &mp, HtmlWriter *htmlWriter); void render(const MimeMessagePart::Ptr &mp, HtmlWriter *htmlWriter); @@ -59,12 +59,9 @@ void render(const AlternativeMessagePart::Ptr &mp, HtmlWriter *htmlWriter); void render(const CertMessagePart::Ptr &mp, HtmlWriter *htmlWriter); bool renderWithFactory(const QString &className, const MessagePart::Ptr &msgPart, HtmlWriter *writer) override; - QString renderFactory(const MessagePart::Ptr &msgPart, HtmlWriter *htmlWriter); + void renderFactory(const MessagePart::Ptr &msgPart, HtmlWriter *htmlWriter); - QString mHtml; MessagePart::Ptr mMsgPart; - HtmlWriter *mOldWriter = nullptr; - CSSHelperBase *mCSSHelper = nullptr; const MessageViewer::MessagePartRendererFactory *mRendererFactory = nullptr; }; diff --git a/messageviewer/src/messagepartthemes/default/messagepartrendererbase.h b/messageviewer/src/messagepartthemes/default/messagepartrendererbase.h --- a/messageviewer/src/messagepartthemes/default/messagepartrendererbase.h +++ b/messageviewer/src/messagepartthemes/default/messagepartrendererbase.h @@ -54,6 +54,7 @@ virtual CSSHelperBase* cssHelper() const = 0; virtual bool renderWithFactory(const QString &className, const MimeTreeParser::MessagePartPtr &msgPart, MimeTreeParser::HtmlWriter *writer) = 0; + virtual void renderSubParts(const MimeTreeParser::MessagePartPtr &msgPart, MimeTreeParser::HtmlWriter *htmlWriter) = 0; }; class MESSAGEVIEWER_EXPORT MessagePartRendererBase diff --git a/messageviewer/src/messagepartthemes/default/messagepartrenderermanager.h b/messageviewer/src/messagepartthemes/default/messagepartrenderermanager.h --- a/messageviewer/src/messagepartthemes/default/messagepartrenderermanager.h +++ b/messageviewer/src/messagepartthemes/default/messagepartrenderermanager.h @@ -20,17 +20,24 @@ #ifndef MESSAGEPARTRENDERERMANAGER_H #define MESSAGEPARTRENDERERMANAGER_H -#include #include "messageviewer_export.h" + #include +#include +#include + +#include + namespace GrantleeTheme { class Engine; } namespace MessageViewer { class GlobalContext; +typedef std::function GrantleeCallback; + class MESSAGEVIEWER_EXPORT MessagePartRendererManager : public QObject { Q_OBJECT @@ -48,4 +55,6 @@ }; } +Q_DECLARE_METATYPE(MessageViewer::GrantleeCallback) + #endif // MESSAGEPARTRENDERERMANAGER_H diff --git a/messageviewer/src/messagepartthemes/default/plugins/textmessagepartrenderer.cpp b/messageviewer/src/messagepartthemes/default/plugins/textmessagepartrenderer.cpp --- a/messageviewer/src/messagepartthemes/default/plugins/textmessagepartrenderer.cpp +++ b/messageviewer/src/messagepartthemes/default/plugins/textmessagepartrenderer.cpp @@ -54,16 +54,11 @@ Grantlee::Template t; Grantlee::Context c = MessagePartRendererManager::self()->createContext(); c.insert(QStringLiteral("block"), msgPart.data()); - + c.insert(QStringLiteral("content"), QVariant::fromValue([mp, htmlWriter, context](Grantlee::OutputStream*) { + context->renderSubParts(mp, htmlWriter); + })); t = MessagePartRendererManager::self()->loadByName(QStringLiteral(":/textmessagepart.html")); - QString content; - foreach (const auto &_m, mp->subParts()) { - DefaultRenderer::Ptr renderer = mp->source()->messagePartTheme(_m); - content += renderer->html(); - } - c.insert(QStringLiteral("content"), content); - Grantlee::OutputStream s(htmlWriter->stream()); t->render(&s, &c); return true; diff --git a/messageviewer/src/messagepartthemes/default/templates/textmessagepart.html b/messageviewer/src/messagepartthemes/default/templates/textmessagepart.html --- a/messageviewer/src/messagepartthemes/default/templates/textmessagepart.html +++ b/messageviewer/src/messagepartthemes/default/templates/textmessagepart.html @@ -19,12 +19,12 @@ - {{content|safe}} + {% callback content %} {% else %} - {{content|safe}} + {% callback content %} {% endif %} {% if block.isAttachment %} diff --git a/messageviewer/src/messagepartthemes/grantlee/grantleeextension.h b/messageviewer/src/messagepartthemes/grantlee/grantleeextension.h --- a/messageviewer/src/messagepartthemes/grantlee/grantleeextension.h +++ b/messageviewer/src/messagepartthemes/grantlee/grantleeextension.h @@ -25,8 +25,12 @@ #include +#include + namespace MessageViewer { +typedef std::function GrantleeCallback; + class CallbackTag : public Grantlee::Node { Q_OBJECT @@ -57,4 +61,6 @@ } +Q_DECLARE_METATYPE(MessageViewer::GrantleeCallback) + #endif // MESSAGEVIEWER_GRANTLEEEXTENSION_H diff --git a/messageviewer/src/messagepartthemes/grantlee/grantleeextension.cpp b/messageviewer/src/messagepartthemes/grantlee/grantleeextension.cpp --- a/messageviewer/src/messagepartthemes/grantlee/grantleeextension.cpp +++ b/messageviewer/src/messagepartthemes/grantlee/grantleeextension.cpp @@ -24,13 +24,8 @@ #include -#include - using namespace MessageViewer; -typedef std::function GrantleeCallback; -Q_DECLARE_METATYPE(GrantleeCallback) - CallbackTag::CallbackTag(const QString &name, QObject* parent) : Grantlee::Node(parent) , m_name(name) diff --git a/messageviewer/src/viewer/objecttreeemptysource.h b/messageviewer/src/viewer/objecttreeemptysource.h --- a/messageviewer/src/viewer/objecttreeemptysource.h +++ b/messageviewer/src/viewer/objecttreeemptysource.h @@ -51,8 +51,7 @@ bool showEmoticons() const override; bool showExpandQuotesMark() const override; const MimeTreeParser::BodyPartFormatterBaseFactory *bodyPartFormatterFactory() override; - MimeTreeParser::Interface::MessagePartRendererPtr messagePartTheme( - MimeTreeParser::MessagePartPtr msgPart) override; + void render(const MimeTreeParser::MessagePartPtr &msgPart, MimeTreeParser::HtmlWriter *htmlWriter) override; bool isPrinting() const override; private: EmptySourcePrivate *const d; diff --git a/messageviewer/src/viewer/objecttreeemptysource.cpp b/messageviewer/src/viewer/objecttreeemptysource.cpp --- a/messageviewer/src/viewer/objecttreeemptysource.cpp +++ b/messageviewer/src/viewer/objecttreeemptysource.cpp @@ -141,9 +141,7 @@ return false; } -MimeTreeParser::Interface::MessagePartRendererPtr EmptySource::messagePartTheme( - MimeTreeParser::MessagePartPtr msgPart) +void EmptySource::render(const MimeTreeParser::MessagePartPtr &msgPart, MimeTreeParser::HtmlWriter *htmlWriter) { - return MimeTreeParser::Interface::MessagePartRenderer::Ptr( - new DefaultRenderer(msgPart, cssHelper(), htmlWriter())); + DefaultRenderer(msgPart, cssHelper(), htmlWriter); } diff --git a/messageviewer/src/viewer/objecttreeviewersource.h b/messageviewer/src/viewer/objecttreeviewersource.h --- a/messageviewer/src/viewer/objecttreeviewersource.h +++ b/messageviewer/src/viewer/objecttreeviewersource.h @@ -48,8 +48,7 @@ bool showEmoticons() const override; bool showExpandQuotesMark() const override; const MimeTreeParser::BodyPartFormatterBaseFactory *bodyPartFormatterFactory() override; - MimeTreeParser::Interface::MessagePartRendererPtr messagePartTheme( - MimeTreeParser::MessagePartPtr msgPart) override; + void render(const MimeTreeParser::MessagePartPtr &msgPart, MimeTreeParser::HtmlWriter *htmlWriter) override; bool isPrinting() const override; private: ViewerPrivate *mViewer = nullptr; diff --git a/messageviewer/src/viewer/objecttreeviewersource.cpp b/messageviewer/src/viewer/objecttreeviewersource.cpp --- a/messageviewer/src/viewer/objecttreeviewersource.cpp +++ b/messageviewer/src/viewer/objecttreeviewersource.cpp @@ -129,9 +129,7 @@ return mViewer->mPrinting; } -MimeTreeParser::Interface::MessagePartRendererPtr MailViewerSource::messagePartTheme( - MimeTreeParser::MessagePartPtr msgPart) +void MailViewerSource::render(const MimeTreeParser::MessagePartPtr &msgPart, MimeTreeParser::HtmlWriter *htmlWriter) { - return MimeTreeParser::Interface::MessagePartRenderer::Ptr( - new DefaultRenderer(msgPart, mViewer->cssHelper(), mViewer->htmlWriter())); + DefaultRenderer(msgPart, mViewer->cssHelper(), htmlWriter); } diff --git a/mimetreeparser/autotests/setupenv.h b/mimetreeparser/autotests/setupenv.h --- a/mimetreeparser/autotests/setupenv.h +++ b/mimetreeparser/autotests/setupenv.h @@ -26,7 +26,6 @@ #include #include #include -#include #include namespace MimeTreeParser { @@ -149,10 +148,10 @@ return QString(); //do nothing } - Interface::MessagePartRenderer::Ptr messagePartTheme(MessagePart::Ptr msgPart) override + void render(const MessagePart::Ptr &msgPart, HtmlWriter *htmlWriter) override { Q_UNUSED(msgPart); - return Interface::MessagePartRenderer::Ptr(); + Q_UNUSED(htmlWriter); } bool isPrinting() const override diff --git a/mimetreeparser/src/CMakeLists.txt b/mimetreeparser/src/CMakeLists.txt --- a/mimetreeparser/src/CMakeLists.txt +++ b/mimetreeparser/src/CMakeLists.txt @@ -23,7 +23,6 @@ interfaces/objecttreesource.cpp interfaces/bodypart.cpp interfaces/htmlwriter.cpp - interfaces/messagepartrenderer.cpp job/qgpgmejobexecutor.cpp utils/util.cpp viewer/attachmentstrategy.cpp @@ -78,7 +77,6 @@ BodyPartFormatter BodyPart HtmlWriter - MessagePartRenderer ObjectTreeSource REQUIRED_HEADERS MimeTreeParser_interfaces_HEADERS PREFIX MimeTreeParser diff --git a/mimetreeparser/src/interfaces/messagepartrenderer.h b/mimetreeparser/src/interfaces/messagepartrenderer.h deleted file mode 100644 --- a/mimetreeparser/src/interfaces/messagepartrenderer.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - Copyright (C) 2016 Sandro Knauß - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MIMETREEPARSER_MESSAGEPARTRENDERER_IF_H__ -#define __MIMETREEPARSER_MESSAGEPARTRENDERER_IF_H__ - -#include "mimetreeparser_export.h" - -#include - -namespace MimeTreeParser { -namespace Interface { -/** -* Interface for rendering messageparts to html. -* @author Andras Mantia -*/ -class MIMETREEPARSER_EXPORT MessagePartRenderer -{ -public: - typedef QSharedPointer Ptr; - - virtual ~MessagePartRenderer(); - - virtual QString html() const = 0; -}; -} -} -#endif diff --git a/mimetreeparser/src/interfaces/messagepartrenderer.cpp b/mimetreeparser/src/interfaces/messagepartrenderer.cpp deleted file mode 100644 --- a/mimetreeparser/src/interfaces/messagepartrenderer.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/* - Copyright (C) 2016 Sandro Knauß - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "messagepartrenderer.h" - -MimeTreeParser::Interface::MessagePartRenderer::~MessagePartRenderer() -{ -} diff --git a/mimetreeparser/src/interfaces/objecttreesource.h b/mimetreeparser/src/interfaces/objecttreesource.h --- a/mimetreeparser/src/interfaces/objecttreesource.h +++ b/mimetreeparser/src/interfaces/objecttreesource.h @@ -34,10 +34,6 @@ class BodyPartFormatterBaseFactory; class MessagePart; typedef QSharedPointer MessagePartPtr; -namespace Interface { -class MessagePartRenderer; -typedef QSharedPointer MessagePartRendererPtr; -} } namespace MimeTreeParser { @@ -93,7 +89,7 @@ virtual const BodyPartFormatterBaseFactory *bodyPartFormatterFactory() = 0; - virtual MessagePartRendererPtr messagePartTheme(MessagePartPtr msgPart) = 0; + virtual void render(const MessagePartPtr &msgPart, HtmlWriter *htmlWriter) = 0; virtual bool isPrinting() const = 0; 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 @@ -47,7 +47,6 @@ #include "bodyformatter/utils.h" #include "interfaces/bodypartformatter.h" #include "interfaces/htmlwriter.h" -#include "interfaces/messagepartrenderer.h" #include "utils/util.h" #include @@ -184,10 +183,7 @@ } if (htmlWriter()) { - const auto renderer = mSource->messagePartTheme(mParsedPart); - if (renderer) { - htmlWriter()->write(renderer->html()); - } + mSource->render(mParsedPart, htmlWriter()); } } }