diff options
Diffstat (limited to 'framework/domain/messageparser.cpp')
-rw-r--r-- | framework/domain/messageparser.cpp | 49 |
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 | ||
32 | PartModel::PartModel(QSharedPointer<MimeTreeParser::MessagePart> partTree, QMap<QByteArray, QUrl> embeddedPartMap) : mPartTree(partTree), mEmbeddedPartMap(embeddedPartMap) | 36 | PartModel::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 | ||
156 | class MessagePartPrivate | ||
157 | { | ||
158 | public: | ||
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 | ||
145 | MessageParser::MessageParser(QObject *parent) | 166 | MessageParser::MessageParser(QObject *parent) |
146 | : QObject(parent) | 167 | : QObject(parent) |
168 | , d(std::unique_ptr<MessagePartPrivate>(new MessagePartPrivate)) | ||
169 | { | ||
170 | |||
171 | } | ||
172 | |||
173 | MessageParser::~MessageParser() | ||
147 | { | 174 | { |
148 | 175 | ||
149 | } | 176 | } |
150 | 177 | ||
151 | QString MessageParser::html() const | 178 | QString MessageParser::html() const |
152 | { | 179 | { |
153 | return mHtml; | 180 | return d->mHtml; |
154 | } | 181 | } |
155 | 182 | ||
156 | QVariant MessageParser::message() const | 183 | QVariant 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 | ||
186 | QAbstractItemModel *MessageParser::partTree() const | 215 | QAbstractItemModel *MessageParser::partTree() const |
187 | { | 216 | { |
188 | return new PartModel(mPartTree, mEmbeddedPartMap); | 217 | return new PartModel(d->mPartTree, d->mParser); |
189 | } | 218 | } |
190 | 219 | ||