summaryrefslogtreecommitdiffstats
path: root/framework/domain/mimetreeparser/interface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'framework/domain/mimetreeparser/interface.cpp')
-rw-r--r--framework/domain/mimetreeparser/interface.cpp165
1 files changed, 97 insertions, 68 deletions
diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp
index e34ffda7..aa7e3911 100644
--- a/framework/domain/mimetreeparser/interface.cpp
+++ b/framework/domain/mimetreeparser/interface.cpp
@@ -89,6 +89,16 @@ QByteArray Part::type() const
89 return "Part"; 89 return "Part";
90} 90}
91 91
92QVector<QByteArray> Part::availableContents() const
93{
94 return QVector<QByteArray>();
95}
96
97QVector<Content::Ptr> Part::content() const
98{
99 return QVector<Content::Ptr>();
100}
101
92QVector<Encryption> Part::encryptions() const 102QVector<Encryption> Part::encryptions() const
93{ 103{
94 auto parent = d->parent(); 104 auto parent = d->parent();
@@ -118,7 +128,7 @@ public:
118 Content *q; 128 Content *q;
119}; 129};
120 130
121Content::Content(const QByteArray& content, ContentPart *parent) 131Content::Content(const QByteArray& content, Part *parent)
122 : d(std::unique_ptr<ContentPrivate>(new ContentPrivate)) 132 : d(std::unique_ptr<ContentPrivate>(new ContentPrivate))
123{ 133{
124 d->q = this; 134 d->q = this;
@@ -157,113 +167,141 @@ QByteArray Content::charset() const
157 return d->mCodec; 167 return d->mCodec;
158} 168}
159 169
160class ContentPartPrivate 170class AlternativePartPrivate
161{ 171{
162public: 172public:
163 void fillFrom(MimeTreeParser::TextMessagePart::Ptr part);
164 void fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part);
165 void fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part); 173 void fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part);
166 174
167 QVector<Content::Ptr> content(ContentPart::Type ct) const; 175 QVector<Content::Ptr> content(const QByteArray &ct) const;
168 176
169 ContentPart *q; 177 AlternativePart *q;
170 178
171 ContentPart::Types types() const; 179 QVector<QByteArray> types() const;
172 180
173private: 181private:
174 QMap<ContentPart::Type, QVector<Content::Ptr>> mContent; 182 QMap<QByteArray, QVector<Content::Ptr>> mContent;
175 ContentPart::Types mTypes; 183 QVector<QByteArray> mTypes;
176}; 184};
177 185
178void ContentPartPrivate::fillFrom(MimeTreeParser::TextMessagePart::Ptr part) 186void AlternativePartPrivate::fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part)
179{ 187{
180 qDebug() << "jepp"; 188 mTypes = QVector<QByteArray>() << "html" << "plaintext";
181 mTypes = ContentPart::PlainText; 189
182 foreach (const auto &mp, part->subParts()) { 190 auto content = std::make_shared<HtmlContent>(part->htmlContent().toLocal8Bit(), q);
183 auto content = std::make_shared<Content>(mp->text().toLocal8Bit(), q); 191 mContent["html"].append(content);
184 mContent[ContentPart::PlainText].append(content); 192 content = std::make_shared<PlainTextContent>(part->plaintextContent().toLocal8Bit(), q);
185 } 193 mContent["plaintext"].append(content);
186} 194}
187 195
188void ContentPartPrivate::fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part) 196QVector<QByteArray> AlternativePartPrivate::types() const
189{ 197{
190 mTypes = ContentPart::Html; 198 return mTypes;
191 auto content = std::make_shared<Content>(part->text().toLocal8Bit(), q);
192 mContent[ContentPart::Html].append(content);
193} 199}
194 200
195void ContentPartPrivate::fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part) 201QVector<Content::Ptr> AlternativePartPrivate::content(const QByteArray& ct) const
196{ 202{
197 mTypes = ContentPart::Html | ContentPart::PlainText; 203 return mContent[ct];
204}
198 205
199 auto content = std::make_shared<Content>(part->htmlContent().toLocal8Bit(), q); 206AlternativePart::AlternativePart()
200 mContent[ContentPart::Html].append(content); 207 : d(std::unique_ptr<AlternativePartPrivate>(new AlternativePartPrivate))
201 content = std::make_shared<Content>(part->plaintextContent().toLocal8Bit(), q); 208{
202 mContent[ContentPart::PlainText].append(content); 209 d->q = this;
203} 210}
204 211
205ContentPart::Types ContentPartPrivate::types() const 212AlternativePart::~AlternativePart()
206{ 213{
207 return mTypes; 214
208} 215}
209 216
210QVector<Content::Ptr> ContentPartPrivate::content(ContentPart::Type ct) const 217QByteArray AlternativePart::type() const
211{ 218{
212 return mContent[ct]; 219 return "AlternativePart";
213} 220}
214 221
215QVector<Content::Ptr> ContentPart::content(ContentPart::Type ct) const 222QVector<QByteArray> AlternativePart::availableContents() const
216{ 223{
217 return d->content(ct); 224 return d->types();
218} 225}
219 226
227QVector<Content::Ptr> AlternativePart::content() const
228{
229 return d->content(availableContents().first());
230}
220 231
221ContentPart::ContentPart() 232QVector<Content::Ptr> AlternativePart::content(const QByteArray& ct) const
222 : d(std::unique_ptr<ContentPartPrivate>(new ContentPartPrivate))
223{ 233{
224 d->q = this; 234 return d->content(ct);
225} 235}
226 236
227ContentPart::~ContentPart() 237class SinglePartPrivate
228{ 238{
239public:
240 void fillFrom(MimeTreeParser::TextMessagePart::Ptr part);
241 void fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part);
242 void fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part);
243 SinglePart *q;
244
245 QVector<Content::Ptr> mContent;
246 QByteArray mType;
247};
229 248
249void SinglePartPrivate::fillFrom(MimeTreeParser::TextMessagePart::Ptr part)
250{
251 mType = "plaintext";
252 mContent.clear();
253 foreach (const auto &mp, part->subParts()) {
254 mContent.append(std::make_shared<PlainTextContent>(mp->text().toLocal8Bit(), q));
255 }
230} 256}
231 257
232QByteArray ContentPart::type() const 258void SinglePartPrivate::fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part)
233{ 259{
234 return "ContentPart"; 260 mType = "html";
261 mContent.clear();
262 mContent.append(std::make_shared<HtmlContent>(part->text().toLocal8Bit(), q));
235} 263}
236 264
237ContentPart::Types ContentPart::availableContents() const 265void SinglePartPrivate::fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part)
238{ 266{
239 return d->types(); 267
240} 268}
241 269
242class MimePartPrivate 270SinglePart::SinglePart()
271 : d(std::unique_ptr<SinglePartPrivate>(new SinglePartPrivate))
243{ 272{
244public: 273 d->q = this;
245 void fillFrom(MimeTreeParser::MessagePart::Ptr part); 274}
246};
247 275
248QByteArray MimePart::type() const 276SinglePart::~SinglePart()
249{ 277{
250 return "MimePart"; 278
251} 279}
252 280
253class AttachmentPartPrivate 281QVector<QByteArray> SinglePart::availableContents() const
254{ 282{
255public: 283 return QVector<QByteArray>() << d->mType;
256 void fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part); 284}
257};
258 285
259void AttachmentPartPrivate::fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part) 286QVector< Content::Ptr > SinglePart::content() const
260{ 287{
288 return d->mContent;
289}
261 290
291QByteArray SinglePart::type() const
292{
293 return "SinglePart";
262} 294}
263 295
264QByteArray AttachmentPart::type() const 296class MimePartPrivate
297{
298public:
299 void fillFrom(MimeTreeParser::MessagePart::Ptr part);
300};
301
302QByteArray MimePart::type() const
265{ 303{
266 return "AttachmentPart"; 304 return "MimePart";
267} 305}
268 306
269ParserPrivate::ParserPrivate(Parser* parser) 307ParserPrivate::ParserPrivate(Parser* parser)
@@ -309,15 +347,15 @@ void ParserPrivate::createTree(const MimeTreeParser::MessagePart::Ptr &start, co
309 part->d->fillFrom(attachment); 347 part->d->fillFrom(attachment);
310 mTree->d->appendSubPart(part); 348 mTree->d->appendSubPart(part);
311 } else if (text) { 349 } else if (text) {
312 auto part = std::make_shared<ContentPart>(); 350 auto part = std::make_shared<SinglePart>();
313 part->d->fillFrom(text); 351 part->d->fillFrom(text);
314 mTree->d->appendSubPart(part); 352 mTree->d->appendSubPart(part);
315 } else if (alternative) { 353 } else if (alternative) {
316 auto part = std::make_shared<ContentPart>(); 354 auto part = std::make_shared<AlternativePart>();
317 part->d->fillFrom(alternative); 355 part->d->fillFrom(alternative);
318 mTree->d->appendSubPart(part); 356 mTree->d->appendSubPart(part);
319 } else if (html) { 357 } else if (html) {
320 auto part = std::make_shared<ContentPart>(); 358 auto part = std::make_shared<SinglePart>();
321 part->d->fillFrom(html); 359 part->d->fillFrom(html);
322 mTree->d->appendSubPart(part); 360 mTree->d->appendSubPart(part);
323 } else { 361 } else {
@@ -336,18 +374,9 @@ Parser::~Parser()
336{ 374{
337} 375}
338 376
339ContentPart::Ptr Parser::collectContentPart(const Part::Ptr &start) const 377QVector<Part::Ptr> Parser::collectContentParts() const
340{ 378{
341 const auto ret = collect<ContentPart>(start, [](const Part::Ptr &p){return p->type() == "ContentPart";}, [](const ContentPart::Ptr &p){return true;}); 379 return collect<Part>(d->mTree, [](const Part::Ptr &p){return p->availableContents().indexOf("html") > -1 || p->availableContents().indexOf("text") > -1;}, [](const Part::Ptr &p){return true;});
342 if (ret.size() > 0) {
343 return ret[0];
344 };
345 return ContentPart::Ptr();
346}
347
348ContentPart::Ptr Parser::collectContentPart() const
349{
350 return collectContentPart(d->mTree);
351} 380}
352 381
353template <typename T> 382template <typename T>
@@ -364,4 +393,4 @@ QVector<typename T::Ptr> Parser::collect(const Part::Ptr &start, std::function<b
364 } 393 }
365 } 394 }
366 return ret; 395 return ret;
367} 396} \ No newline at end of file