diff --git a/messageviewer/src/viewer/bodypartformatter.cpp b/messageviewer/src/viewer/bodypartformatter.cpp --- a/messageviewer/src/viewer/bodypartformatter.cpp +++ b/messageviewer/src/viewer/bodypartformatter.cpp @@ -142,6 +142,45 @@ } } +class MultiPartSignedBodyPartFormatter + : public MessageViewer::Interface::BodyPartFormatter +{ +public: + MessagePart::Ptr process(const Interface::BodyPart &part) const; + MessageViewer::Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using MessageViewer::Interface::BodyPartFormatter::format; + static const MessageViewer::Interface::BodyPartFormatter *create(); +private: + static const MultiPartSignedBodyPartFormatter *self; +}; + +const MultiPartSignedBodyPartFormatter *MultiPartSignedBodyPartFormatter::self; + +const MessageViewer::Interface::BodyPartFormatter *MultiPartSignedBodyPartFormatter::create() +{ + if (!self) { + self = new MultiPartSignedBodyPartFormatter(); + } + return self; +} + +MessagePart::Ptr MultiPartSignedBodyPartFormatter::process(const Interface::BodyPart &part) const +{ + return part.objectTreeParser()->processMultiPartSignedSubtype(part.content(), *part.processResult()); +} + +MessageViewer::Interface::BodyPartFormatter::Result MultiPartSignedBodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + MessagePart::Ptr mp = process(*part); + if (!mp.isNull()) { + mp->html(false); + return Ok; + } + + return Failed; +} + #define CREATE_BODY_PART_FORMATTER(subtype) \ class subtype##BodyPartFormatter \ : public MessageViewer::Interface::BodyPartFormatter \ @@ -182,7 +221,6 @@ CREATE_BODY_PART_FORMATTER(MultiPartMixed) CREATE_BODY_PART_FORMATTER(MultiPartAlternative) -CREATE_BODY_PART_FORMATTER(MultiPartSigned) CREATE_BODY_PART_FORMATTER(MultiPartEncrypted) typedef TextPlainBodyPartFormatter ApplicationPgpBodyPartFormatter; diff --git a/messageviewer/src/viewer/objecttreeparser.h b/messageviewer/src/viewer/objecttreeparser.h --- a/messageviewer/src/viewer/objecttreeparser.h +++ b/messageviewer/src/viewer/objecttreeparser.h @@ -420,7 +420,7 @@ bool processMultiPartAlternativeSubtype(KMime::Content *node, ProcessResult &result); bool processMultiPartDigestSubtype(KMime::Content *node, ProcessResult &result); bool processMultiPartParallelSubtype(KMime::Content *node, ProcessResult &result); - bool processMultiPartSignedSubtype(KMime::Content *node, ProcessResult &result); + MessagePart::Ptr processMultiPartSignedSubtype(KMime::Content *node, ProcessResult &result); bool processMultiPartEncryptedSubtype(KMime::Content *node, ProcessResult &result); bool processApplicationPkcs7MimeSubtype(KMime::Content *node, ProcessResult &result); diff --git a/messageviewer/src/viewer/objecttreeparser.cpp b/messageviewer/src/viewer/objecttreeparser.cpp --- a/messageviewer/src/viewer/objecttreeparser.cpp +++ b/messageviewer/src/viewer/objecttreeparser.cpp @@ -1168,16 +1168,14 @@ return processMultiPartMixedSubtype(node, result); } -bool ObjectTreeParser::processMultiPartSignedSubtype(KMime::Content *node, ProcessResult &) +MessagePart::Ptr ObjectTreeParser::processMultiPartSignedSubtype(KMime::Content *node, ProcessResult &) { KMime::Content *child = MessageCore::NodeHelper::firstChild(node); if (node->contents().size() != 2) { qCDebug(MESSAGEVIEWER_LOG) << "mulitpart/signed must have exactly two child parts!" << endl << "processing as multipart/mixed"; - if (child) { - standardChildHandling(child); - } - return child; + + return MessagePart::Ptr(new MimeMessagePart(this, child, false)); } KMime::Content *signedData = child; @@ -1189,8 +1187,7 @@ mNodeHelper->setNodeProcessed(signature, true); if (!includeSignatures()) { - standardChildHandling(signedData); - return true; + return MessagePart::Ptr(new MimeMessagePart(this, signedData, false)); } QString protocolContentType = node->contentType()->parameter(QStringLiteral("protocol")).toLower(); @@ -1212,30 +1209,28 @@ if (!protocol) { mNodeHelper->setNodeProcessed(signature, true); - standardChildHandling(signedData); - return true; + return MessagePart::Ptr(new MimeMessagePart(this, signedData, false)); } CryptoProtocolSaver saver(this, protocol); mNodeHelper->setSignatureState(node, KMMsgFullySigned); const QByteArray cleartext = KMime::LFtoCRLF(signedData->encodedContent()); const QTextCodec *aCodec(codecFor(signedData)); - CryptoMessagePart mp(this, &messagePart, + CryptoMessagePart::Ptr mp(new CryptoMessagePart(this, aCodec->toUnicode(cleartext), cryptoProtocol(), - NodeHelper::fromAsString(node), signature); - messagePart.isSigned = true; + NodeHelper::fromAsString(node), signature)); + PartMetaData *messagePart(mp->partMetaData()); + messagePart->isSigned = true; if (cryptoProtocol()) { - mp.startVerificationDetached(cleartext, signedData, signature->decodedContent()); + mp->startVerificationDetached(cleartext, signedData, signature->decodedContent()); } else { messagePart->auditLogError = GpgME::Error(GPG_ERR_NOT_IMPLEMENTED); } - mp.html(false); - - return true; + return mp; } bool ObjectTreeParser::processMultiPartEncryptedSubtype(KMime::Content *node, ProcessResult &result)