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.cpp144
1 files changed, 29 insertions, 115 deletions
diff --git a/framework/domain/messageparser.cpp b/framework/domain/messageparser.cpp
index ff763aec..ef9fb0d2 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,128 +33,32 @@
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)
33{
34}
35 36
36QHash<int, QByteArray> PartModel::roleNames() const 37class MessagePartPrivate
37{ 38{
38 QHash<int, QByteArray> roles; 39public:
39 roles[Text] = "text"; 40 QSharedPointer<MimeTreeParser::MessagePart> mPartTree;
40 roles[IsHtml] = "isHtml"; 41 QString mHtml;
41 roles[IsHidden] = "isHidden"; 42 QMap<QByteArray, QUrl> mEmbeddedPartMap;
42 roles[IsEncrypted] = "isEncrypted"; 43 std::shared_ptr<MimeTreeParser::NodeHelper> mNodeHelper;
43 roles[IsAttachment] = "isAttachment"; 44 std::shared_ptr<Parser> mParser;
44 roles[HasContent] = "hasContent"; 45};
45 roles[Type] = "type";
46 roles[IsHidden] = "isHidden";
47 return roles;
48}
49 46
50QModelIndex PartModel::index(int row, int column, const QModelIndex &parent) const 47MessageParser::MessageParser(QObject *parent)
51{ 48 : QObject(parent)
52 // qDebug() << "index " << parent << row << column << mPartTree->subParts().size(); 49 , d(std::unique_ptr<MessagePartPrivate>(new MessagePartPrivate))
53 if (!parent.isValid()) {
54 if (row < mPartTree->subParts().size()) {
55 auto part = mPartTree->subParts().at(row);
56 return createIndex(row, column, part.data());
57 }
58 } else {
59 auto part = static_cast<MimeTreeParser::MessagePart*>(parent.internalPointer());
60 auto subPart = part->subParts().at(row);
61 return createIndex(row, column, subPart.data());
62 }
63 return QModelIndex();
64}
65
66QVariant PartModel::data(const QModelIndex &index, int role) const
67{
68 // qDebug() << "Getting data for index";
69 if (index.isValid()) {
70 auto part = static_cast<MimeTreeParser::MessagePart*>(index.internalPointer());
71 switch (role) {
72 case Text: {
73 // qDebug() << "Getting text: " << part->property("text").toString();
74 // FIXME: we should have a list per part, and not one for all parts.
75 auto text = part->property("htmlContent").toString();
76 for (const auto &cid : mEmbeddedPartMap.keys()) {
77 text.replace(QString("src=\"cid:%1\"").arg(QString(cid)), QString("src=\"%1\"").arg(mEmbeddedPartMap.value(cid).toString()));
78 }
79 return text;
80 }
81 case IsAttachment:
82 return part->property("attachment").toBool();
83 case IsEncrypted:
84 return part->property("isEncrypted").toBool();
85 case IsHtml:
86 return part->property("isHtml").toBool();
87 case HasContent:
88 return !part->property("htmlContent").toString().isEmpty();
89 case Type:
90 return part->metaObject()->className();
91 case IsHidden:
92 return false;
93 //return part->property("isHidden").toBool();
94
95 }
96 }
97 return QVariant();
98}
99
100QModelIndex PartModel::parent(const QModelIndex &index) const
101{
102 // qDebug() << "parent " << index;
103 if (index.isValid()) {
104 auto part = static_cast<MimeTreeParser::MessagePart*>(index.internalPointer());
105 auto parentPart = static_cast<MimeTreeParser::MessagePart*>(part->parentPart());
106 auto row = 0;//get the parents parent to find the index
107 if (!parentPart) {
108 parentPart = mPartTree.data();
109 }
110 int i = 0;
111 for (const auto &p : parentPart->subParts()) {
112 if (p.data() == part) {
113 row = i;
114 break;
115 }
116 i++;
117 }
118 return createIndex(row, index.column(), parentPart);
119 }
120 return QModelIndex();
121}
122
123int PartModel::rowCount(const QModelIndex &parent) const
124{ 50{
125 // qDebug() << "Row count " << parent;
126 if (!parent.isValid()) {
127 // qDebug() << "Row count " << mPartTree->subParts().size();
128 return mPartTree->subParts().size();
129 } else {
130 auto part = static_cast<MimeTreeParser::MessagePart*>(parent.internalPointer());
131 if (part) {
132 return part->subParts().size();
133 }
134 }
135 return 0;
136}
137 51
138int PartModel::columnCount(const QModelIndex &parent) const
139{
140 // qDebug() << "Column count " << parent;
141 return 1;
142} 52}
143 53
144 54MessageParser::~MessageParser()
145MessageParser::MessageParser(QObject *parent)
146 : QObject(parent)
147{ 55{
148 56
149} 57}
150 58
151QString MessageParser::html() const 59QString MessageParser::html() const
152{ 60{
153 return mHtml; 61 return d->mHtml;
154} 62}
155 63
156QVariant MessageParser::message() const 64QVariant MessageParser::message() const
@@ -162,6 +70,8 @@ void MessageParser::setMessage(const QVariant &message)
162{ 70{
163 QTime time; 71 QTime time;
164 time.start(); 72 time.start();
73 d->mParser = std::shared_ptr<Parser>(new Parser(message.toByteArray()));
74
165 const auto mailData = KMime::CRLFtoLF(message.toByteArray()); 75 const auto mailData = KMime::CRLFtoLF(message.toByteArray());
166 KMime::Message::Ptr msg(new KMime::Message); 76 KMime::Message::Ptr msg(new KMime::Message);
167 msg->setContent(mailData); 77 msg->setContent(mailData);
@@ -171,20 +81,24 @@ void MessageParser::setMessage(const QVariant &message)
171 // render the mail 81 // render the mail
172 StringHtmlWriter htmlWriter; 82 StringHtmlWriter htmlWriter;
173 //temporary files only have the lifetime of the nodehelper, so we keep it around until the mail changes. 83 //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>(); 84 d->mNodeHelper = std::make_shared<MimeTreeParser::NodeHelper>();
175 ObjectTreeSource source(&htmlWriter); 85 ObjectTreeSource source(&htmlWriter);
176 MimeTreeParser::ObjectTreeParser otp(&source, mNodeHelper.get()); 86 MimeTreeParser::ObjectTreeParser otp(&source, d->mNodeHelper.get());
177 87
178 otp.parseObjectTree(msg.data()); 88 otp.parseObjectTree(msg.data());
179 mPartTree = otp.parsedPart().dynamicCast<MimeTreeParser::MessagePart>(); 89 d->mPartTree = otp.parsedPart().dynamicCast<MimeTreeParser::MessagePart>();
180 90
181 mEmbeddedPartMap = htmlWriter.embeddedParts(); 91 d->mEmbeddedPartMap = htmlWriter.embeddedParts();
182 mHtml = htmlWriter.html(); 92 d->mHtml = htmlWriter.html();
183 emit htmlChanged(); 93 emit htmlChanged();
184} 94}
185 95
186QAbstractItemModel *MessageParser::partTree() const 96QAbstractItemModel *MessageParser::partTree() const
187{ 97{
188 return new PartModel(mPartTree, mEmbeddedPartMap); 98 return new PartModel(d->mPartTree, d->mParser);
189} 99}
190 100
101QAbstractItemModel *MessageParser::newTree() const
102{
103 return new NewModel(d->mParser);
104}