From 349e404b539c1f9d1feb54658e2e6fbbd2165462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Wed, 10 Aug 2016 13:20:11 +0200 Subject: Use new mimetreeparser interface --- framework/domain/CMakeLists.txt | 2 +- framework/domain/messageparser.cpp | 49 +++++++++++++++++++++------ framework/domain/messageparser.h | 15 ++++---- framework/domain/mimetreeparser/interface.cpp | 5 +++ framework/domain/mimetreeparser/interface.h | 2 ++ framework/domain/mimetreeparser/interface_p.h | 1 - 6 files changed, 54 insertions(+), 20 deletions(-) (limited to 'framework') diff --git a/framework/domain/CMakeLists.txt b/framework/domain/CMakeLists.txt index 92a81352..07f01367 100644 --- a/framework/domain/CMakeLists.txt +++ b/framework/domain/CMakeLists.txt @@ -20,7 +20,7 @@ find_package(KF5 REQUIRED COMPONENTS Package) add_library(mailplugin SHARED ${mailplugin_SRCS}) qt5_use_modules(mailplugin Core Quick Qml WebKitWidgets) -target_link_libraries(mailplugin actionplugin settingsplugin sink KF5::MimeTreeParser KF5::Codecs KF5::Package KF5::Async KF5::IconThemes) +target_link_libraries(mailplugin actionplugin settingsplugin sink mimetreeparser KF5::MimeTreeParser KF5::Codecs KF5::Package KF5::Async KF5::IconThemes) add_subdirectory(actions/tests) diff --git a/framework/domain/messageparser.cpp b/framework/domain/messageparser.cpp index 8363e119..262be0b7 100644 --- a/framework/domain/messageparser.cpp +++ b/framework/domain/messageparser.cpp @@ -21,6 +21,10 @@ #include "stringhtmlwriter.h" #include "objecttreesource.h" +#include "mimetreeparser/interface.h" + +#include + #include #include #include @@ -29,7 +33,9 @@ #include #include -PartModel::PartModel(QSharedPointer partTree, QMap embeddedPartMap) : mPartTree(partTree), mEmbeddedPartMap(embeddedPartMap) +PartModel::PartModel(QSharedPointer partTree, std::shared_ptr parser) + : mPartTree(partTree) + , mParser(parser) { } @@ -73,8 +79,14 @@ QVariant PartModel::data(const QModelIndex &index, int role) const // qDebug() << "Getting text: " << part->property("text").toString(); // FIXME: we should have a list per part, and not one for all parts. auto text = part->property("htmlContent").toString(); - for (const auto &cid : mEmbeddedPartMap.keys()) { - text.replace(QString("src=\"cid:%1\"").arg(QString(cid)), QString("src=\"%1\"").arg(mEmbeddedPartMap.value(cid).toString())); + auto rx = QRegExp("src=(\"|')cid:([^\1]*)\1"); + int pos = 0; + while ((pos = rx.indexIn(text, pos)) != -1) { + auto repl = mParser->getPart(rx.cap(2).toUtf8()); + if (repl.isValid()) { + text.replace(rx.cap(0), QString("src=\"%1\"").arg(repl.toString())); + } + pos += rx.matchedLength(); } return text; } @@ -140,16 +152,31 @@ int PartModel::columnCount(const QModelIndex &parent) const return 1; } +class MessagePartPrivate +{ +public: + QSharedPointer mPartTree; + QString mHtml; + QMap mEmbeddedPartMap; + std::shared_ptr mNodeHelper; + std::shared_ptr mParser; +}; MessageParser::MessageParser(QObject *parent) : QObject(parent) + , d(std::unique_ptr(new MessagePartPrivate)) +{ + +} + +MessageParser::~MessageParser() { } QString MessageParser::html() const { - return mHtml; + return d->mHtml; } QVariant MessageParser::message() const @@ -161,6 +188,8 @@ void MessageParser::setMessage(const QVariant &message) { QTime time; time.start(); + d->mParser = std::shared_ptr(new Parser(message.toByteArray())); + const auto mailData = KMime::CRLFtoLF(message.toByteArray()); KMime::Message::Ptr msg(new KMime::Message); msg->setContent(mailData); @@ -170,20 +199,20 @@ void MessageParser::setMessage(const QVariant &message) // render the mail StringHtmlWriter htmlWriter; //temporary files only have the lifetime of the nodehelper, so we keep it around until the mail changes. - mNodeHelper = std::make_shared(); + d->mNodeHelper = std::make_shared(); ObjectTreeSource source(&htmlWriter); - MimeTreeParser::ObjectTreeParser otp(&source, mNodeHelper.get()); + MimeTreeParser::ObjectTreeParser otp(&source, d->mNodeHelper.get()); otp.parseObjectTree(msg.data()); - mPartTree = otp.parsedPart().dynamicCast(); + d->mPartTree = otp.parsedPart().dynamicCast(); - mEmbeddedPartMap = htmlWriter.embeddedParts(); - mHtml = htmlWriter.html(); + d->mEmbeddedPartMap = htmlWriter.embeddedParts(); + d->mHtml = htmlWriter.html(); emit htmlChanged(); } QAbstractItemModel *MessageParser::partTree() const { - return new PartModel(mPartTree, mEmbeddedPartMap); + return new PartModel(d->mPartTree, d->mParser); } diff --git a/framework/domain/messageparser.h b/framework/domain/messageparser.h index 3e0255df..9469f2b5 100644 --- a/framework/domain/messageparser.h +++ b/framework/domain/messageparser.h @@ -29,11 +29,11 @@ #include #include -namespace MimeTreeParser { - class NodeHelper; -}; class QAbstractItemModel; +class Parser; +class MessagePartPrivate; + class MessageParser : public QObject { Q_OBJECT @@ -43,6 +43,7 @@ class MessageParser : public QObject public: explicit MessageParser(QObject *parent = Q_NULLPTR); + ~MessageParser(); QString html() const; @@ -54,16 +55,13 @@ signals: void htmlChanged(); private: - QSharedPointer mPartTree; - QString mHtml; - QMap mEmbeddedPartMap; - std::shared_ptr mNodeHelper; + std::unique_ptr d; }; class PartModel : public QAbstractItemModel { Q_OBJECT public: - PartModel(QSharedPointer partTree, QMap embeddedPartMap); + PartModel(QSharedPointer partTree, std::shared_ptr parser); public: enum Roles { @@ -86,5 +84,6 @@ public: private: QSharedPointer mPartTree; QMap mEmbeddedPartMap; + std::shared_ptr mParser; }; diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp index d6354c9e..c3ecf79c 100644 --- a/framework/domain/mimetreeparser/interface.cpp +++ b/framework/domain/mimetreeparser/interface.cpp @@ -706,6 +706,11 @@ Parser::~Parser() { } +QUrl Parser::getPart(const QByteArray &cid) +{ + return d->mEmbeddedPartMap.value(cid); +} + QVector Parser::collectContentParts() const { return collect(d->mTree, [](const Part::Ptr &p){return p->type() != "EncapsulatedPart";}, diff --git a/framework/domain/mimetreeparser/interface.h b/framework/domain/mimetreeparser/interface.h index a482a824..7eadc311 100644 --- a/framework/domain/mimetreeparser/interface.h +++ b/framework/domain/mimetreeparser/interface.h @@ -181,6 +181,7 @@ public: private: std::unique_ptr d; }; + class Part { public: @@ -346,6 +347,7 @@ public: ~Parser(); Part::Ptr getPart(QUrl url); + QUrl getPart(const QByteArray &cid); QVector collect(const Part::Ptr &start, std::function select, std::function filter) const; QVector collectContentParts() const; diff --git a/framework/domain/mimetreeparser/interface_p.h b/framework/domain/mimetreeparser/interface_p.h index 004a50d0..55d1a5cc 100644 --- a/framework/domain/mimetreeparser/interface_p.h +++ b/framework/domain/mimetreeparser/interface_p.h @@ -46,7 +46,6 @@ public: void createTree(const MimeTreeParser::MessagePartPtr& start, const Part::Ptr& tree); Part::Ptr mTree; -private: Parser *q; MimeTreeParser::MessagePartPtr mPartTree; -- cgit v1.2.3