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.cpp83
1 files changed, 76 insertions, 7 deletions
diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp
index a76a6cde..4f45b883 100644
--- a/framework/domain/mimetreeparser/interface.cpp
+++ b/framework/domain/mimetreeparser/interface.cpp
@@ -47,12 +47,20 @@ MailMime::MailMime()
47 47
48bool MailMime::isFirstTextPart() const 48bool MailMime::isFirstTextPart() const
49{ 49{
50 if (!d->mNode) { 50 if (!d->mNode || !d->mNode->topLevel()) {
51 return false; 51 return false;
52 } 52 }
53 return (d->mNode->topLevel()->textContent() == d->mNode); 53 return (d->mNode->topLevel()->textContent() == d->mNode);
54} 54}
55 55
56bool MailMime::isTopLevelPart() const
57{
58 if (!d->mNode) {
59 return false;
60 }
61 return (d->mNode->topLevel() == d->mNode);
62}
63
56MailMime::Disposition MailMime::disposition() const 64MailMime::Disposition MailMime::disposition() const
57{ 65{
58 if (!d->mNode) { 66 if (!d->mNode) {
@@ -110,6 +118,10 @@ public:
110 Part *parent() const; 118 Part *parent() const;
111 119
112 const MailMime::Ptr &mailMime() const; 120 const MailMime::Ptr &mailMime() const;
121 void createMailMime(const MimeTreeParser::MimeMessagePart::Ptr &part);
122 void createMailMime(const MimeTreeParser::TextMessagePart::Ptr &part);
123 void createMailMime(const MimeTreeParser::AlternativeMessagePart::Ptr &part);
124 void createMailMime(const MimeTreeParser::HtmlMessagePart::Ptr &part);
113private: 125private:
114 Part *q; 126 Part *q;
115 Part *mParent; 127 Part *mParent;
@@ -124,6 +136,30 @@ PartPrivate::PartPrivate(Part* part)
124 136
125} 137}
126 138
139void PartPrivate::createMailMime(const MimeTreeParser::HtmlMessagePart::Ptr& part)
140{
141 mMailMime = MailMime::Ptr(new MailMime);
142 mMailMime->d->mNode = part->mNode;
143}
144
145void PartPrivate::createMailMime(const MimeTreeParser::AlternativeMessagePart::Ptr& part)
146{
147 mMailMime = MailMime::Ptr(new MailMime);
148 mMailMime->d->mNode = part->mNode;
149}
150
151void PartPrivate::createMailMime(const MimeTreeParser::TextMessagePart::Ptr& part)
152{
153 mMailMime = MailMime::Ptr(new MailMime);
154 mMailMime->d->mNode = part->mNode;
155}
156
157void PartPrivate::createMailMime(const MimeTreeParser::MimeMessagePart::Ptr& part)
158{
159 mMailMime = MailMime::Ptr(new MailMime);
160 mMailMime->d->mNode = part->mNode;
161}
162
127void PartPrivate::appendSubPart(Part::Ptr subpart) 163void PartPrivate::appendSubPart(Part::Ptr subpart)
128{ 164{
129 subpart->d->mParent = q; 165 subpart->d->mParent = q;
@@ -262,7 +298,16 @@ QByteArray Content::type() const
262 298
263MailMime::Ptr Content::mailMime() const 299MailMime::Ptr Content::mailMime() const
264{ 300{
265 return d->mMailMime; 301 if (d->mMailMime) {
302 return d->mMailMime;
303 } else {
304 return d->mParent->mailMime();
305 }
306}
307
308Part *Content::parent() const
309{
310 return d->mParent;
266} 311}
267 312
268HtmlContent::HtmlContent(const QByteArray& content, Part* parent) 313HtmlContent::HtmlContent(const QByteArray& content, Part* parent)
@@ -311,6 +356,7 @@ void AlternativePartPrivate::fillFrom(MimeTreeParser::AlternativeMessagePart::Pt
311 mContent["html"].append(content); 356 mContent["html"].append(content);
312 content = std::make_shared<PlainTextContent>(part->plaintextContent().toLocal8Bit(), q); 357 content = std::make_shared<PlainTextContent>(part->plaintextContent().toLocal8Bit(), q);
313 mContent["plaintext"].append(content); 358 mContent["plaintext"].append(content);
359 q->reachParentD()->createMailMime(part);
314} 360}
315 361
316QVector<QByteArray> AlternativePartPrivate::types() const 362QVector<QByteArray> AlternativePartPrivate::types() const
@@ -349,6 +395,11 @@ QVector<Content::Ptr> AlternativePart::content(const QByteArray& ct) const
349 return d->content(ct); 395 return d->content(ct);
350} 396}
351 397
398PartPrivate* AlternativePart::reachParentD() const
399{
400 return Part::d.get();
401}
402
352class SinglePartPrivate 403class SinglePartPrivate
353{ 404{
354public: 405public:
@@ -367,6 +418,7 @@ void SinglePartPrivate::fillFrom(MimeTreeParser::TextMessagePart::Ptr part)
367 mContent.clear(); 418 mContent.clear();
368 foreach (const auto &mp, part->subParts()) { 419 foreach (const auto &mp, part->subParts()) {
369 mContent.append(std::make_shared<PlainTextContent>(mp->text().toLocal8Bit(), q)); 420 mContent.append(std::make_shared<PlainTextContent>(mp->text().toLocal8Bit(), q));
421 q->reachParentD()->createMailMime(part);
370 } 422 }
371} 423}
372 424
@@ -375,11 +427,12 @@ void SinglePartPrivate::fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part)
375 mType = "html"; 427 mType = "html";
376 mContent.clear(); 428 mContent.clear();
377 mContent.append(std::make_shared<HtmlContent>(part->text().toLocal8Bit(), q)); 429 mContent.append(std::make_shared<HtmlContent>(part->text().toLocal8Bit(), q));
430 q->reachParentD()->createMailMime(part);
378} 431}
379 432
380void SinglePartPrivate::fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part) 433void SinglePartPrivate::fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part)
381{ 434{
382 435 q->reachParentD()->createMailMime(part.staticCast<MimeTreeParser::TextMessagePart>());
383} 436}
384 437
385SinglePart::SinglePart() 438SinglePart::SinglePart()
@@ -411,6 +464,11 @@ QByteArray SinglePart::type() const
411 return "SinglePart"; 464 return "SinglePart";
412} 465}
413 466
467PartPrivate* SinglePart::reachParentD() const
468{
469 return Part::d.get();
470}
471
414ParserPrivate::ParserPrivate(Parser* parser) 472ParserPrivate::ParserPrivate(Parser* parser)
415 : q(parser) 473 : q(parser)
416 , mNodeHelper(std::make_shared<MimeTreeParser::NodeHelper>()) 474 , mNodeHelper(std::make_shared<MimeTreeParser::NodeHelper>())
@@ -421,16 +479,16 @@ ParserPrivate::ParserPrivate(Parser* parser)
421void ParserPrivate::setMessage(const QByteArray& mimeMessage) 479void ParserPrivate::setMessage(const QByteArray& mimeMessage)
422{ 480{
423 const auto mailData = KMime::CRLFtoLF(mimeMessage); 481 const auto mailData = KMime::CRLFtoLF(mimeMessage);
424 KMime::Message::Ptr msg(new KMime::Message); 482 mMsg = KMime::Message::Ptr(new KMime::Message);
425 msg->setContent(mailData); 483 mMsg->setContent(mailData);
426 msg->parse(); 484 mMsg->parse();
427 485
428 // render the mail 486 // render the mail
429 StringHtmlWriter htmlWriter; 487 StringHtmlWriter htmlWriter;
430 ObjectTreeSource source(&htmlWriter); 488 ObjectTreeSource source(&htmlWriter);
431 MimeTreeParser::ObjectTreeParser otp(&source, mNodeHelper.get()); 489 MimeTreeParser::ObjectTreeParser otp(&source, mNodeHelper.get());
432 490
433 otp.parseObjectTree(msg.data()); 491 otp.parseObjectTree(mMsg.data());
434 mPartTree = otp.parsedPart().dynamicCast<MimeTreeParser::MessagePart>(); 492 mPartTree = otp.parsedPart().dynamicCast<MimeTreeParser::MessagePart>();
435 493
436 mEmbeddedPartMap = htmlWriter.embeddedParts(); 494 mEmbeddedPartMap = htmlWriter.embeddedParts();
@@ -494,6 +552,16 @@ QVector<Part::Ptr> Parser::collectContentParts() const
494 if (mime->isFirstTextPart()) { 552 if (mime->isFirstTextPart()) {
495 return true; 553 return true;
496 } 554 }
555
556 {
557 const auto parent = content->parent();
558 if (parent) {
559 const auto _mime = parent->mailMime();
560 if (_mime && (_mime->isTopLevelPart() || _mime->isFirstTextPart())) {
561 return true;
562 }
563 }
564 }
497 const auto cd = mime->disposition(); 565 const auto cd = mime->disposition();
498 if (cd && cd == MailMime::Inline) { 566 if (cd && cd == MailMime::Inline) {
499 // explict "inline" disposition: 567 // explict "inline" disposition:
@@ -526,6 +594,7 @@ QVector<Part::Ptr> Parser::collect(const Part::Ptr &start, std::function<bool(co
526 break; 594 break;
527 } 595 }
528 } 596 }
597 qWarning() << ct << contents.size();
529 } 598 }
530 if (!contents.isEmpty()) { 599 if (!contents.isEmpty()) {
531 ret.append(part); 600 ret.append(part);