summaryrefslogtreecommitdiffstats
path: root/framework/domain/messageparser.cpp
diff options
context:
space:
mode:
authorSandro Knauß <sknauss@kde.org>2016-08-10 13:20:11 +0200
committerSandro Knauß <sknauss@kde.org>2016-08-10 13:20:11 +0200
commit349e404b539c1f9d1feb54658e2e6fbbd2165462 (patch)
treeb10dc19fba26c0655e918d7e355ae6f54cc8e170 /framework/domain/messageparser.cpp
parent92d6fbd8f6a504da869454ca85f861e30c89a73c (diff)
downloadkube-349e404b539c1f9d1feb54658e2e6fbbd2165462.tar.gz
kube-349e404b539c1f9d1feb54658e2e6fbbd2165462.zip
Use new mimetreeparser interface
Diffstat (limited to 'framework/domain/messageparser.cpp')
-rw-r--r--framework/domain/messageparser.cpp49
1 files changed, 39 insertions, 10 deletions
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 @@
21#include "stringhtmlwriter.h" 21#include "stringhtmlwriter.h"
22#include "objecttreesource.h" 22#include "objecttreesource.h"
23 23
24#include "mimetreeparser/interface.h"
25
26#include <QRegExp>
27
24#include <QFile> 28#include <QFile>
25#include <QImage> 29#include <QImage>
26#include <QDebug> 30#include <QDebug>
@@ -29,7 +33,9 @@
29#include <MimeTreeParser/ObjectTreeParser> 33#include <MimeTreeParser/ObjectTreeParser>
30#include <MimeTreeParser/MessagePart> 34#include <MimeTreeParser/MessagePart>
31 35
32PartModel::PartModel(QSharedPointer<MimeTreeParser::MessagePart> partTree, QMap<QByteArray, QUrl> embeddedPartMap) : mPartTree(partTree), mEmbeddedPartMap(embeddedPartMap) 36PartModel::PartModel(QSharedPointer<MimeTreeParser::MessagePart> partTree, std::shared_ptr<Parser> parser)
37 : mPartTree(partTree)
38 , mParser(parser)
33{ 39{
34} 40}
35 41
@@ -73,8 +79,14 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
73 // qDebug() << "Getting text: " << part->property("text").toString(); 79 // qDebug() << "Getting text: " << part->property("text").toString();
74 // FIXME: we should have a list per part, and not one for all parts. 80 // FIXME: we should have a list per part, and not one for all parts.
75 auto text = part->property("htmlContent").toString(); 81 auto text = part->property("htmlContent").toString();
76 for (const auto &cid : mEmbeddedPartMap.keys()) { 82 auto rx = QRegExp("src=(\"|')cid:([^\1]*)\1");
77 text.replace(QString("src=\"cid:%1\"").arg(QString(cid)), QString("src=\"%1\"").arg(mEmbeddedPartMap.value(cid).toString())); 83 int pos = 0;
84 while ((pos = rx.indexIn(text, pos)) != -1) {
85 auto repl = mParser->getPart(rx.cap(2).toUtf8());
86 if (repl.isValid()) {
87 text.replace(rx.cap(0), QString("src=\"%1\"").arg(repl.toString()));
88 }
89 pos += rx.matchedLength();
78 } 90 }
79 return text; 91 return text;
80 } 92 }
@@ -140,16 +152,31 @@ int PartModel::columnCount(const QModelIndex &parent) const
140 return 1; 152 return 1;
141} 153}
142 154
155class MessagePartPrivate
156{
157public:
158 QSharedPointer<MimeTreeParser::MessagePart> mPartTree;
159 QString mHtml;
160 QMap<QByteArray, QUrl> mEmbeddedPartMap;
161 std::shared_ptr<MimeTreeParser::NodeHelper> mNodeHelper;
162 std::shared_ptr<Parser> mParser;
163};
143 164
144MessageParser::MessageParser(QObject *parent) 165MessageParser::MessageParser(QObject *parent)
145 : QObject(parent) 166 : QObject(parent)
167 , d(std::unique_ptr<MessagePartPrivate>(new MessagePartPrivate))
168{
169
170}
171
172MessageParser::~MessageParser()
146{ 173{
147 174
148} 175}
149 176
150QString MessageParser::html() const 177QString MessageParser::html() const
151{ 178{
152 return mHtml; 179 return d->mHtml;
153} 180}
154 181
155QVariant MessageParser::message() const 182QVariant MessageParser::message() const
@@ -161,6 +188,8 @@ void MessageParser::setMessage(const QVariant &message)
161{ 188{
162 QTime time; 189 QTime time;
163 time.start(); 190 time.start();
191 d->mParser = std::shared_ptr<Parser>(new Parser(message.toByteArray()));
192
164 const auto mailData = KMime::CRLFtoLF(message.toByteArray()); 193 const auto mailData = KMime::CRLFtoLF(message.toByteArray());
165 KMime::Message::Ptr msg(new KMime::Message); 194 KMime::Message::Ptr msg(new KMime::Message);
166 msg->setContent(mailData); 195 msg->setContent(mailData);
@@ -170,20 +199,20 @@ void MessageParser::setMessage(const QVariant &message)
170 // render the mail 199 // render the mail
171 StringHtmlWriter htmlWriter; 200 StringHtmlWriter htmlWriter;
172 //temporary files only have the lifetime of the nodehelper, so we keep it around until the mail changes. 201 //temporary files only have the lifetime of the nodehelper, so we keep it around until the mail changes.
173 mNodeHelper = std::make_shared<MimeTreeParser::NodeHelper>(); 202 d->mNodeHelper = std::make_shared<MimeTreeParser::NodeHelper>();
174 ObjectTreeSource source(&htmlWriter); 203 ObjectTreeSource source(&htmlWriter);
175 MimeTreeParser::ObjectTreeParser otp(&source, mNodeHelper.get()); 204 MimeTreeParser::ObjectTreeParser otp(&source, d->mNodeHelper.get());
176 205
177 otp.parseObjectTree(msg.data()); 206 otp.parseObjectTree(msg.data());
178 mPartTree = otp.parsedPart().dynamicCast<MimeTreeParser::MessagePart>(); 207 d->mPartTree = otp.parsedPart().dynamicCast<MimeTreeParser::MessagePart>();
179 208
180 mEmbeddedPartMap = htmlWriter.embeddedParts(); 209 d->mEmbeddedPartMap = htmlWriter.embeddedParts();
181 mHtml = htmlWriter.html(); 210 d->mHtml = htmlWriter.html();
182 emit htmlChanged(); 211 emit htmlChanged();
183} 212}
184 213
185QAbstractItemModel *MessageParser::partTree() const 214QAbstractItemModel *MessageParser::partTree() const
186{ 215{
187 return new PartModel(mPartTree, mEmbeddedPartMap); 216 return new PartModel(d->mPartTree, d->mParser);
188} 217}
189 218