diff options
-rw-r--r-- | framework/domain/mimetreeparser/interface.cpp | 107 | ||||
-rw-r--r-- | framework/domain/mimetreeparser/interface.h | 4 | ||||
-rw-r--r-- | framework/domain/mimetreeparser/tests/interfacetest.cpp | 10 |
3 files changed, 115 insertions, 6 deletions
diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp index 5cf36d10..a76a6cde 100644 --- a/framework/domain/mimetreeparser/interface.cpp +++ b/framework/domain/mimetreeparser/interface.cpp | |||
@@ -28,8 +28,77 @@ | |||
28 | #include <MimeTreeParser/MessagePart> | 28 | #include <MimeTreeParser/MessagePart> |
29 | #include <MimeTreeParser/NodeHelper> | 29 | #include <MimeTreeParser/NodeHelper> |
30 | 30 | ||
31 | #include <QMimeDatabase> | ||
32 | #include <QMimeType> | ||
31 | #include <QDebug> | 33 | #include <QDebug> |
32 | 34 | ||
35 | class MailMimePrivate | ||
36 | { | ||
37 | public: | ||
38 | KMime::Content *mNode; | ||
39 | MailMime *q; | ||
40 | }; | ||
41 | |||
42 | MailMime::MailMime() | ||
43 | : d(std::unique_ptr<MailMimePrivate>(new MailMimePrivate())) | ||
44 | { | ||
45 | d->q = this; | ||
46 | } | ||
47 | |||
48 | bool MailMime::isFirstTextPart() const | ||
49 | { | ||
50 | if (!d->mNode) { | ||
51 | return false; | ||
52 | } | ||
53 | return (d->mNode->topLevel()->textContent() == d->mNode); | ||
54 | } | ||
55 | |||
56 | MailMime::Disposition MailMime::disposition() const | ||
57 | { | ||
58 | if (!d->mNode) { | ||
59 | return Invalid; | ||
60 | } | ||
61 | const auto cd = d->mNode->contentDisposition(false); | ||
62 | if (!cd) { | ||
63 | return Invalid; | ||
64 | } | ||
65 | switch (cd->disposition()){ | ||
66 | case KMime::Headers::CDinline: | ||
67 | return Inline; | ||
68 | case KMime::Headers::CDattachment: | ||
69 | return Attachment; | ||
70 | default: | ||
71 | return Invalid; | ||
72 | } | ||
73 | } | ||
74 | |||
75 | QString MailMime::filename() const | ||
76 | { | ||
77 | if (!d->mNode) { | ||
78 | return QString(); | ||
79 | } | ||
80 | const auto cd = d->mNode->contentDisposition(false); | ||
81 | if (!cd) { | ||
82 | return QString(); | ||
83 | } | ||
84 | return cd->filename(); | ||
85 | } | ||
86 | |||
87 | QMimeType MailMime::mimetype() const | ||
88 | { | ||
89 | if (!d->mNode) { | ||
90 | return QMimeType(); | ||
91 | } | ||
92 | |||
93 | const auto ct = d->mNode->contentType(false); | ||
94 | if (!ct) { | ||
95 | return QMimeType(); | ||
96 | } | ||
97 | |||
98 | QMimeDatabase mimeDb; | ||
99 | return mimeDb.mimeTypeForName(ct->mimeType()); | ||
100 | } | ||
101 | |||
33 | class PartPrivate | 102 | class PartPrivate |
34 | { | 103 | { |
35 | public: | 104 | public: |
@@ -39,10 +108,13 @@ public: | |||
39 | QVector<Part::Ptr> subParts(); | 108 | QVector<Part::Ptr> subParts(); |
40 | 109 | ||
41 | Part *parent() const; | 110 | Part *parent() const; |
111 | |||
112 | const MailMime::Ptr &mailMime() const; | ||
42 | private: | 113 | private: |
43 | Part *q; | 114 | Part *q; |
44 | Part *mParent; | 115 | Part *mParent; |
45 | QVector<Part::Ptr> mSubParts; | 116 | QVector<Part::Ptr> mSubParts; |
117 | MailMime::Ptr mMailMime; | ||
46 | }; | 118 | }; |
47 | 119 | ||
48 | PartPrivate::PartPrivate(Part* part) | 120 | PartPrivate::PartPrivate(Part* part) |
@@ -68,6 +140,11 @@ QVector< Part::Ptr > PartPrivate::subParts() | |||
68 | return mSubParts; | 140 | return mSubParts; |
69 | } | 141 | } |
70 | 142 | ||
143 | const MailMime::Ptr& PartPrivate::mailMime() const | ||
144 | { | ||
145 | return mMailMime; | ||
146 | } | ||
147 | |||
71 | Part::Part() | 148 | Part::Part() |
72 | : d(std::unique_ptr<PartPrivate>(new PartPrivate(this))) | 149 | : d(std::unique_ptr<PartPrivate>(new PartPrivate(this))) |
73 | { | 150 | { |
@@ -96,6 +173,11 @@ QVector<QByteArray> Part::availableContents() const | |||
96 | 173 | ||
97 | QVector<Content::Ptr> Part::content() const | 174 | QVector<Content::Ptr> Part::content() const |
98 | { | 175 | { |
176 | return content(availableContents().first()); | ||
177 | } | ||
178 | |||
179 | QVector<Content::Ptr> Part::content(const QByteArray& ct) const | ||
180 | { | ||
99 | return QVector<Content::Ptr>(); | 181 | return QVector<Content::Ptr>(); |
100 | } | 182 | } |
101 | 183 | ||
@@ -119,6 +201,11 @@ QVector<Signature> Part::signatures() const | |||
119 | } | 201 | } |
120 | } | 202 | } |
121 | 203 | ||
204 | MailMime::Ptr Part::mailMime() const | ||
205 | { | ||
206 | return d->mailMime(); | ||
207 | } | ||
208 | |||
122 | class ContentPrivate | 209 | class ContentPrivate |
123 | { | 210 | { |
124 | public: | 211 | public: |
@@ -126,6 +213,7 @@ public: | |||
126 | QByteArray mCodec; | 213 | QByteArray mCodec; |
127 | Part *mParent; | 214 | Part *mParent; |
128 | Content *q; | 215 | Content *q; |
216 | MailMime::Ptr mMailMime; | ||
129 | }; | 217 | }; |
130 | 218 | ||
131 | Content::Content(const QByteArray& content, Part *parent) | 219 | Content::Content(const QByteArray& content, Part *parent) |
@@ -167,18 +255,37 @@ QByteArray Content::charset() const | |||
167 | return d->mCodec; | 255 | return d->mCodec; |
168 | } | 256 | } |
169 | 257 | ||
258 | QByteArray Content::type() const | ||
259 | { | ||
260 | return "Content"; | ||
261 | } | ||
262 | |||
263 | MailMime::Ptr Content::mailMime() const | ||
264 | { | ||
265 | return d->mMailMime; | ||
266 | } | ||
267 | |||
170 | HtmlContent::HtmlContent(const QByteArray& content, Part* parent) | 268 | HtmlContent::HtmlContent(const QByteArray& content, Part* parent) |
171 | : Content(content, parent) | 269 | : Content(content, parent) |
172 | { | 270 | { |
173 | 271 | ||
174 | } | 272 | } |
175 | 273 | ||
274 | QByteArray HtmlContent::type() const | ||
275 | { | ||
276 | return "HtmlContent"; | ||
277 | } | ||
278 | |||
176 | PlainTextContent::PlainTextContent(const QByteArray& content, Part* parent) | 279 | PlainTextContent::PlainTextContent(const QByteArray& content, Part* parent) |
177 | : Content(content, parent) | 280 | : Content(content, parent) |
178 | { | 281 | { |
179 | 282 | ||
180 | } | 283 | } |
181 | 284 | ||
285 | QByteArray PlainTextContent::type() const | ||
286 | { | ||
287 | return "PlainTextContent"; | ||
288 | } | ||
182 | 289 | ||
183 | class AlternativePartPrivate | 290 | class AlternativePartPrivate |
184 | { | 291 | { |
diff --git a/framework/domain/mimetreeparser/interface.h b/framework/domain/mimetreeparser/interface.h index f6ee41ee..c71b86d6 100644 --- a/framework/domain/mimetreeparser/interface.h +++ b/framework/domain/mimetreeparser/interface.h | |||
@@ -75,13 +75,15 @@ public: | |||
75 | Attachment ///< attachment | 75 | Attachment ///< attachment |
76 | }; | 76 | }; |
77 | 77 | ||
78 | MailMime(); | ||
79 | |||
78 | // interessting header parts of a KMime::Content | 80 | // interessting header parts of a KMime::Content |
79 | QMimeType mimetype() const; | 81 | QMimeType mimetype() const; |
80 | Disposition disposition() const; | 82 | Disposition disposition() const; |
81 | QUrl label() const; | 83 | QUrl label() const; |
82 | QByteArray cid() const; | 84 | QByteArray cid() const; |
83 | QByteArray charset() const; | 85 | QByteArray charset() const; |
84 | QByteArray filename() const; | 86 | QString filename() const; |
85 | 87 | ||
86 | // Unique identifier to ecactly this KMime::Content | 88 | // Unique identifier to ecactly this KMime::Content |
87 | QByteArray link() const; | 89 | QByteArray link() const; |
diff --git a/framework/domain/mimetreeparser/tests/interfacetest.cpp b/framework/domain/mimetreeparser/tests/interfacetest.cpp index 822d530c..83de97f7 100644 --- a/framework/domain/mimetreeparser/tests/interfacetest.cpp +++ b/framework/domain/mimetreeparser/tests/interfacetest.cpp | |||
@@ -52,7 +52,7 @@ private slots: | |||
52 | QCOMPARE(contentPartList.size(), 1); | 52 | QCOMPARE(contentPartList.size(), 1); |
53 | auto contentPart = contentPartList[0]; | 53 | auto contentPart = contentPartList[0]; |
54 | QVERIFY((bool)contentPart); | 54 | QVERIFY((bool)contentPart); |
55 | QCOMPARE(contentPart->availableContents(), "plaintext"); | 55 | QCOMPARE(contentPart->availableContents(), QVector<QByteArray>() << "plaintext"); |
56 | auto contentList = contentPart->content("plaintext"); | 56 | auto contentList = contentPart->content("plaintext"); |
57 | QCOMPARE(contentList.size(), 1); | 57 | QCOMPARE(contentList.size(), 1); |
58 | QCOMPARE(contentList[0]->content(), QStringLiteral("If you can see this text it means that your email client couldn't display our newsletter properly.\nPlease visit this link to view the newsletter on our website: http://www.gog.com/newsletter/").toLocal8Bit()); | 58 | QCOMPARE(contentList[0]->content(), QStringLiteral("If you can see this text it means that your email client couldn't display our newsletter properly.\nPlease visit this link to view the newsletter on our website: http://www.gog.com/newsletter/").toLocal8Bit()); |
@@ -94,7 +94,7 @@ private slots: | |||
94 | QCOMPARE(contentPartList.size(), 1); | 94 | QCOMPARE(contentPartList.size(), 1); |
95 | auto contentPart = contentPartList[0]; | 95 | auto contentPart = contentPartList[0]; |
96 | QVERIFY((bool)contentPart); | 96 | QVERIFY((bool)contentPart); |
97 | QCOMPARE(contentPart->availableContents(), "html"); | 97 | QCOMPARE(contentPart->availableContents(), QVector<QByteArray>() << "html"); |
98 | 98 | ||
99 | auto contentList = contentPart->content("plaintext"); | 99 | auto contentList = contentPart->content("plaintext"); |
100 | QCOMPARE(contentList.size(), 0); | 100 | QCOMPARE(contentList.size(), 0); |
@@ -115,7 +115,7 @@ private slots: | |||
115 | QCOMPARE(contentPartList.size(), 1); | 115 | QCOMPARE(contentPartList.size(), 1); |
116 | auto contentPart = contentPartList[0]; | 116 | auto contentPart = contentPartList[0]; |
117 | QVERIFY((bool)contentPart); | 117 | QVERIFY((bool)contentPart); |
118 | QCOMPARE(contentPart->availableContents(), "plaintext"); | 118 | QCOMPARE(contentPart->availableContents(), QVector<QByteArray>() << "plaintext"); |
119 | auto contentList = contentPart->content("plaintext"); | 119 | auto contentList = contentPart->content("plaintext"); |
120 | QCOMPARE(contentList.size(), 1); | 120 | QCOMPARE(contentList.size(), 1); |
121 | QCOMPARE(contentList[0]->content(), QStringLiteral("The quick brown fox jumped over the lazy dog.").toLocal8Bit()); | 121 | QCOMPARE(contentList[0]->content(), QStringLiteral("The quick brown fox jumped over the lazy dog.").toLocal8Bit()); |
@@ -130,7 +130,7 @@ private slots: | |||
130 | QCOMPARE(contentPartList.size(), 1); | 130 | QCOMPARE(contentPartList.size(), 1); |
131 | auto contentPart = contentPartList[0]; | 131 | auto contentPart = contentPartList[0]; |
132 | QVERIFY((bool)contentPart); | 132 | QVERIFY((bool)contentPart); |
133 | QCOMPARE(contentPart->availableContents(), "plaintext"); | 133 | QCOMPARE(contentPart->availableContents(), QVector<QByteArray>() << "plaintext"); |
134 | auto contentList = contentPart->content("plaintext"); | 134 | auto contentList = contentPart->content("plaintext"); |
135 | QCOMPARE(contentList.size(), 1); | 135 | QCOMPARE(contentList.size(), 1); |
136 | QCOMPARE(contentList[0]->content(), QStringLiteral("test text").toLocal8Bit()); | 136 | QCOMPARE(contentList[0]->content(), QStringLiteral("test text").toLocal8Bit()); |
@@ -145,7 +145,7 @@ private slots: | |||
145 | QCOMPARE(contentPartList.size(), 1); | 145 | QCOMPARE(contentPartList.size(), 1); |
146 | auto contentPart = contentPartList[0]; | 146 | auto contentPart = contentPartList[0]; |
147 | QVERIFY((bool)contentPart); | 147 | QVERIFY((bool)contentPart); |
148 | QCOMPARE(contentPart->availableContents(), "plaintext"); | 148 | QCOMPARE(contentPart->availableContents(), QVector<QByteArray>() << "plaintext"); |
149 | auto contentList = contentPart->content("plaintext"); | 149 | auto contentList = contentPart->content("plaintext"); |
150 | QCOMPARE(contentList.size(), 1); | 150 | QCOMPARE(contentList.size(), 1); |
151 | QCOMPARE(contentList[0]->content(), QStringLiteral("asdasd asd asd asdf sadf sdaf sadf äöü").toLocal8Bit()); | 151 | QCOMPARE(contentList[0]->content(), QStringLiteral("asdasd asd asd asdf sadf sdaf sadf äöü").toLocal8Bit()); |