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.cpp50
1 files changed, 43 insertions, 7 deletions
diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp
index efa0fd40..596dc152 100644
--- a/framework/domain/mimetreeparser/interface.cpp
+++ b/framework/domain/mimetreeparser/interface.cpp
@@ -36,14 +36,24 @@
36class MailMimePrivate 36class MailMimePrivate
37{ 37{
38public: 38public:
39 KMime::Content *mNode; 39 MailMimePrivate(MailMime *p);
40
40 MailMime *q; 41 MailMime *q;
42 KMime::Content *mNode;
43 std::shared_ptr<MailMime> parent;
41}; 44};
42 45
46MailMimePrivate::MailMimePrivate(MailMime* p)
47 : q(p)
48 , mNode(nullptr)
49 , parent(nullptr)
50{
51}
52
53
43MailMime::MailMime() 54MailMime::MailMime()
44 : d(std::unique_ptr<MailMimePrivate>(new MailMimePrivate())) 55 : d(std::unique_ptr<MailMimePrivate>(new MailMimePrivate(this)))
45{ 56{
46 d->q = this;
47} 57}
48 58
49bool MailMime::isFirstTextPart() const 59bool MailMime::isFirstTextPart() const
@@ -54,6 +64,14 @@ bool MailMime::isFirstTextPart() const
54 return (d->mNode->topLevel()->textContent() == d->mNode); 64 return (d->mNode->topLevel()->textContent() == d->mNode);
55} 65}
56 66
67bool MailMime::isFirstPart() const
68{
69 if (!d->mNode || !d->mNode->parent()) {
70 return false;
71 }
72 return (d->mNode->parent()->contents().first() == d->mNode);
73}
74
57bool MailMime::isTopLevelPart() const 75bool MailMime::isTopLevelPart() const
58{ 76{
59 if (!d->mNode) { 77 if (!d->mNode) {
@@ -108,6 +126,15 @@ QMimeType MailMime::mimetype() const
108 return mimeDb.mimeTypeForName(ct->mimeType()); 126 return mimeDb.mimeTypeForName(ct->mimeType());
109} 127}
110 128
129MailMime::Ptr MailMime::parent() const
130{
131 if (!d->parent) {
132 d->parent = std::shared_ptr<MailMime>(new MailMime());
133 d->parent->d->mNode = d->mNode->parent();
134 }
135 return d->parent;
136}
137
111class PartPrivate 138class PartPrivate
112{ 139{
113public: 140public:
@@ -285,6 +312,11 @@ MailMime::Ptr Part::mailMime() const
285 return d->mailMime(); 312 return d->mailMime();
286} 313}
287 314
315Part *Part::parent() const
316{
317 return d->parent();
318}
319
288class ContentPrivate 320class ContentPrivate
289{ 321{
290public: 322public:
@@ -738,12 +770,16 @@ QVector<Part::Ptr> Parser::collectContentParts() const
738 } 770 }
739 771
740 { 772 {
741 const auto parent = content->parent(); 773 auto _mime = content->parent()->mailMime();
742 if (parent) { 774 while (_mime) {
743 const auto _mime = parent->mailMime();
744 if (_mime && (_mime->isTopLevelPart() || _mime->isFirstTextPart())) { 775 if (_mime && (_mime->isTopLevelPart() || _mime->isFirstTextPart())) {
745 return true; 776 return true;
746 } 777 }
778 if (_mime->isFirstPart()) {
779 _mime = _mime->parent();
780 } else {
781 break;
782 }
747 } 783 }
748 } 784 }
749 const auto cd = mime->disposition(); 785 const auto cd = mime->disposition();
@@ -830,4 +866,4 @@ QVector<Part::Ptr> Parser::collect(const Part::Ptr &start, std::function<bool(co
830 } 866 }
831 } 867 }
832 return ret; 868 return ret;
833} \ No newline at end of file 869}