summaryrefslogtreecommitdiffstats
path: root/framework/domain/messageparser.cpp
diff options
context:
space:
mode:
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 ff763aec..febd1363 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 }
@@ -141,16 +153,31 @@ int PartModel::columnCount(const QModelIndex &parent) const
141 return 1; 153 return 1;
142} 154}
143 155
156class MessagePartPrivate
157{
158public:
159 QSharedPointer<MimeTreeParser::MessagePart> mPartTree;
160 QString mHtml;
161 QMap<QByteArray, QUrl> mEmbeddedPartMap;
162 std::shared_ptr<MimeTreeParser::NodeHelper> mNodeHelper;
163 std::shared_ptr<Parser> mParser;
164};
144 165
145MessageParser::MessageParser(QObject *parent) 166MessageParser::MessageParser(QObject *parent)
146 : QObject(parent) 167 : QObject(parent)
168 , d(std::unique_ptr<MessagePartPrivate>(new MessagePartPrivate))
169{
170
171}
172
173MessageParser::~MessageParser()
147{ 174{
148 175
149} 176}
150 177
151QString MessageParser::html() const 178QString MessageParser::html() const
152{ 179{
153 return mHtml; 180 return d->mHtml;
154} 181}
155 182
156QVariant MessageParser::message() const 183QVariant MessageParser::message() const
@@ -162,6 +189,8 @@ void MessageParser::setMessage(const QVariant &message)
162{ 189{
163 QTime time; 190 QTime time;
164 time.start(); 191 time.start();
192 d->mParser = std::shared_ptr<Parser>(new Parser(message.toByteArray()));
193
165 const auto mailData = KMime::CRLFtoLF(message.toByteArray()); 194 const auto mailData = KMime::CRLFtoLF(message.toByteArray());
166 KMime::Message::Ptr msg(new KMime::Message); 195 KMime::Message::Ptr msg(new KMime::Message);
167 msg->setContent(mailData); 196 msg->setContent(mailData);
@@ -171,20 +200,20 @@ void MessageParser::setMessage(const QVariant &message)
171 // render the mail 200 // render the mail
172 StringHtmlWriter htmlWriter; 201 StringHtmlWriter htmlWriter;
173 //temporary files only have the lifetime of the nodehelper, so we keep it around until the mail changes. 202 //temporary files only have the lifetime of the nodehelper, so we keep it around until the mail changes.
174 mNodeHelper = std::make_shared<MimeTreeParser::NodeHelper>(); 203 d->mNodeHelper = std::make_shared<MimeTreeParser::NodeHelper>();
175 ObjectTreeSource source(&htmlWriter); 204 ObjectTreeSource source(&htmlWriter);
176 MimeTreeParser::ObjectTreeParser otp(&source, mNodeHelper.get()); 205 MimeTreeParser::ObjectTreeParser otp(&source, d->mNodeHelper.get());
177 206
178 otp.parseObjectTree(msg.data()); 207 otp.parseObjectTree(msg.data());
179 mPartTree = otp.parsedPart().dynamicCast<MimeTreeParser::MessagePart>(); 208 d->mPartTree = otp.parsedPart().dynamicCast<MimeTreeParser::MessagePart>();
180 209
181 mEmbeddedPartMap = htmlWriter.embeddedParts(); 210 d->mEmbeddedPartMap = htmlWriter.embeddedParts();
182 mHtml = htmlWriter.html(); 211 d->mHtml = htmlWriter.html();
183 emit htmlChanged(); 212 emit htmlChanged();
184} 213}
185 214
186QAbstractItemModel *MessageParser::partTree() const 215QAbstractItemModel *MessageParser::partTree() const
187{ 216{
188 return new PartModel(mPartTree, mEmbeddedPartMap); 217 return new PartModel(d->mPartTree, d->mParser);
189} 218}
190 219