diff --git a/plugins/messageviewer/bodypartformatter/gnupgwks/gnupgwks.json b/plugins/messageviewer/bodypartformatter/gnupgwks/gnupgwks.json --- a/plugins/messageviewer/bodypartformatter/gnupgwks/gnupgwks.json +++ b/plugins/messageviewer/bodypartformatter/gnupgwks/gnupgwks.json @@ -1,10 +1,10 @@ { "formatter": [ + { "mimetype": "application/pgp-keys" }, { "mimetype": "multipart/mixed" }, - { "mimetype": "application/vnd.gnupg.wks" }, - { "mimetype": "application/pgp-keys" } + { "mimetype": "application/vnd.gnupg.wks" } ], "renderer": [ - { "type": "MimeTreeParser::AttachmentMessagePart" } + { "type": "PgpKeyMessagePart" } ] } diff --git a/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeyformatter.h b/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeyformatter.h --- a/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeyformatter.h +++ b/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeyformatter.h @@ -21,15 +21,19 @@ #define PGPKEYFORMATTER_H_ #include +#include class PgpKeyMessagePart; -class ApplicationPGPKeyFormatter : public MimeTreeParser::Interface::BodyPartFormatter +class ApplicationPGPKeyFormatter + : public MimeTreeParser::Interface::BodyPartFormatter + , public MessageViewer::MessagePartRendererBase { public: ApplicationPGPKeyFormatter() = default; - MimeTreeParser::Interface::BodyPartFormatter::Result format(MimeTreeParser::Interface::BodyPart *part, MimeTreeParser::HtmlWriter *writer) const override; + MimeTreeParser::MessagePartPtr process(MimeTreeParser::Interface::BodyPart & part) const override; + bool render(const MimeTreeParser::MessagePartPtr &msgPart, MimeTreeParser::HtmlWriter *htmlWriter, MessageViewer::RenderContext *context) const override; private: QString render(const PgpKeyMessagePart &mp) const; diff --git a/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeyformatter.cpp b/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeyformatter.cpp --- a/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeyformatter.cpp +++ b/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeyformatter.cpp @@ -35,44 +35,43 @@ using namespace MimeTreeParser::Interface; -BodyPartFormatter::Result ApplicationPGPKeyFormatter::format(BodyPart *part, MimeTreeParser::HtmlWriter *writer) const +MimeTreeParser::MessagePartPtr ApplicationPGPKeyFormatter::process(MimeTreeParser::Interface::BodyPart& part) const { - if (!writer) { - return Ok; - } - - PgpKeyMemento *m = dynamic_cast(part->memento()); - PgpKeyMessagePart mp(part); + auto mp = new PgpKeyMessagePart(&part); + PgpKeyMemento *m = dynamic_cast(mp->memento()); if (!m) { auto memento = new PgpKeyMemento(); - auto nodeHelper = part->nodeHelper(); + auto nodeHelper = part.nodeHelper(); if (nodeHelper) { QObject::connect(memento, &PgpKeyMemento::update, nodeHelper, &MimeTreeParser::NodeHelper::update); - memento->start(mp.fingerprint()); + memento->start(mp->fingerprint()); } else { - memento->exec(mp.fingerprint()); + memento->exec(mp->fingerprint()); m = memento; } - part->setBodyPartMemento(memento); + mp->setMemento(memento); } else if (m->isRunning()) { m = nullptr; } if (m) { Q_ASSERT(!m->isRunning()); - mp.setError(m->error()); - mp.setKey(m->key()); + mp->setError(m->error()); + mp->setKey(m->key()); } - - writer->write(render(mp)); - return Ok; + return MimeTreeParser::MessagePartPtr(mp); } -QString ApplicationPGPKeyFormatter::render(const PgpKeyMessagePart &mp) const +bool ApplicationPGPKeyFormatter::render(const MimeTreeParser::MessagePartPtr &msgPart, MimeTreeParser::HtmlWriter *htmlWriter, MessageViewer::RenderContext *context) const { + Q_UNUSED(context); + auto mp = msgPart.dynamicCast(); + if (!mp) + return false; + GrantleeTheme::Engine engine; engine.localizer()->setApplicationDomain(QByteArrayLiteral("messageviewer_application_gnupgwks_plugin")); engine.addTemplateLoader(QSharedPointer::create()); @@ -83,14 +82,14 @@ QObject block; - block.setProperty("showKeyDetails", mp.source()->showSignatureDetails()); - block.setProperty("error", mp.error()); - block.setProperty("importUrl", mp.part()->makeLink(QStringLiteral("pgpkey")) + QStringLiteral("?action=import")); - const auto key = mp.key(); + block.setProperty("showKeyDetails", mp->source()->showSignatureDetails()); + block.setProperty("error", mp->error()); + block.setProperty("importUrl", mp->makeLink(QStringLiteral("pgpkey")) + QStringLiteral("?action=import")); + const auto key = mp->key(); if (key.isNull()) { - block.setProperty("uid", mp.userID()); - block.setProperty("fingerprint", mp.fingerprint()); - block.setProperty("created", mp.keyDate().toString(Qt::SystemLocaleDate)); + block.setProperty("uid", mp->userID()); + block.setProperty("fingerprint", mp->fingerprint()); + block.setProperty("created", mp->keyDate().toString(Qt::SystemLocaleDate)); } else { const auto uid = key.userID(0); block.setProperty("hasKey", true); @@ -121,5 +120,7 @@ ctx.insert(QStringLiteral("block"), &block); ctx.insert(QStringLiteral("style"), &style); - return tpl->render(&ctx); + Grantlee::OutputStream s(htmlWriter->stream()); + tpl->render(&s, &ctx); + return true; } diff --git a/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeymessagepart.h b/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeymessagepart.h --- a/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeymessagepart.h +++ b/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeymessagepart.h @@ -20,6 +20,8 @@ #ifndef PGPKEYMESSAGEPART_H_ #define PGPKEYMESSAGEPART_H_ +#include + #include #include @@ -35,12 +37,12 @@ class Content; } -class PgpKeyMessagePart +class PgpKeyMessagePart : public MimeTreeParser::MessagePart { + Q_OBJECT public: - PgpKeyMessagePart(MimeTreeParser::Interface::BodyPart *part); - - virtual ~PgpKeyMessagePart() = default; + explicit PgpKeyMessagePart(MimeTreeParser::Interface::BodyPart *part); + ~PgpKeyMessagePart() = default; QDateTime keyDate() const; QString userID() const; @@ -55,13 +57,9 @@ QByteArray rawKey() const; - MimeTreeParser::Interface::ObjectTreeSource *source() const; - MimeTreeParser::Interface::BodyPart *part() const; - protected: void parseContent(KMime::Content *node); - MimeTreeParser::Interface::BodyPart *mPart = nullptr; QDateTime mKeyDate; QString mUserID; QString mKeyID; diff --git a/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeymessagepart.cpp b/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeymessagepart.cpp --- a/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeymessagepart.cpp +++ b/plugins/messageviewer/bodypartformatter/gnupgwks/pgpkeymessagepart.cpp @@ -25,9 +25,10 @@ #include PgpKeyMessagePart::PgpKeyMessagePart(MimeTreeParser::Interface::BodyPart *part) - : mPart(part) + : MimeTreeParser::MessagePart(part->objectTreeParser(), QString()) { - parseContent(mPart->content()); + setContent(part->content()); + parseContent(part->content()); } QDateTime PgpKeyMessagePart::keyDate() const @@ -72,17 +73,7 @@ QByteArray PgpKeyMessagePart::rawKey() const { - return mPart->content()->decodedContent(); -} - -MimeTreeParser::Interface::ObjectTreeSource *PgpKeyMessagePart::source() const -{ - return mPart->source(); -} - -MimeTreeParser::Interface::BodyPart *PgpKeyMessagePart::part() const -{ - return mPart; + return content()->decodedContent(); } void PgpKeyMessagePart::parseContent(KMime::Content *node) diff --git a/plugins/messageviewer/bodypartformatter/gnupgwks/plugin.cpp b/plugins/messageviewer/bodypartformatter/gnupgwks/plugin.cpp --- a/plugins/messageviewer/bodypartformatter/gnupgwks/plugin.cpp +++ b/plugins/messageviewer/bodypartformatter/gnupgwks/plugin.cpp @@ -26,9 +26,9 @@ namespace { enum Index { + application_pgp_keys, multipart_mixed, - application_vnd_gnupg_keys, - application_pgp_keys + application_vnd_gnupg_keys }; } @@ -45,10 +45,17 @@ } } -MessageViewer::MessagePartRendererBase* ApplicationGnuPGWKSPlugin::renderer(int index) +MessageViewer::MessagePartRendererBase* ApplicationGnuPGWKSPlugin::renderer(int idx) { - Q_UNUSED(index); - return nullptr; + switch (idx) { + case multipart_mixed: + case application_vnd_gnupg_keys: + return nullptr; // TODO + case application_pgp_keys: + return new ApplicationPGPKeyFormatter(); + default: + return nullptr; + } } const MessageViewer::Interface::BodyPartURLHandler *ApplicationGnuPGWKSPlugin::urlHandler(int idx) const