diff options
Diffstat (limited to 'framework/domain/mimetreeparser/interface.cpp')
-rw-r--r-- | framework/domain/mimetreeparser/interface.cpp | 165 |
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 | ||
92 | QVector<QByteArray> Part::availableContents() const | ||
93 | { | ||
94 | return QVector<QByteArray>(); | ||
95 | } | ||
96 | |||
97 | QVector<Content::Ptr> Part::content() const | ||
98 | { | ||
99 | return QVector<Content::Ptr>(); | ||
100 | } | ||
101 | |||
92 | QVector<Encryption> Part::encryptions() const | 102 | QVector<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 | ||
121 | Content::Content(const QByteArray& content, ContentPart *parent) | 131 | Content::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 | ||
160 | class ContentPartPrivate | 170 | class AlternativePartPrivate |
161 | { | 171 | { |
162 | public: | 172 | public: |
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 | ||
173 | private: | 181 | private: |
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 | ||
178 | void ContentPartPrivate::fillFrom(MimeTreeParser::TextMessagePart::Ptr part) | 186 | void 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 | ||
188 | void ContentPartPrivate::fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part) | 196 | QVector<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 | ||
195 | void ContentPartPrivate::fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part) | 201 | QVector<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); | 206 | AlternativePart::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 | ||
205 | ContentPart::Types ContentPartPrivate::types() const | 212 | AlternativePart::~AlternativePart() |
206 | { | 213 | { |
207 | return mTypes; | 214 | |
208 | } | 215 | } |
209 | 216 | ||
210 | QVector<Content::Ptr> ContentPartPrivate::content(ContentPart::Type ct) const | 217 | QByteArray AlternativePart::type() const |
211 | { | 218 | { |
212 | return mContent[ct]; | 219 | return "AlternativePart"; |
213 | } | 220 | } |
214 | 221 | ||
215 | QVector<Content::Ptr> ContentPart::content(ContentPart::Type ct) const | 222 | QVector<QByteArray> AlternativePart::availableContents() const |
216 | { | 223 | { |
217 | return d->content(ct); | 224 | return d->types(); |
218 | } | 225 | } |
219 | 226 | ||
227 | QVector<Content::Ptr> AlternativePart::content() const | ||
228 | { | ||
229 | return d->content(availableContents().first()); | ||
230 | } | ||
220 | 231 | ||
221 | ContentPart::ContentPart() | 232 | QVector<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 | ||
227 | ContentPart::~ContentPart() | 237 | class SinglePartPrivate |
228 | { | 238 | { |
239 | public: | ||
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 | ||
249 | void 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 | ||
232 | QByteArray ContentPart::type() const | 258 | void 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 | ||
237 | ContentPart::Types ContentPart::availableContents() const | 265 | void SinglePartPrivate::fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part) |
238 | { | 266 | { |
239 | return d->types(); | 267 | |
240 | } | 268 | } |
241 | 269 | ||
242 | class MimePartPrivate | 270 | SinglePart::SinglePart() |
271 | : d(std::unique_ptr<SinglePartPrivate>(new SinglePartPrivate)) | ||
243 | { | 272 | { |
244 | public: | 273 | d->q = this; |
245 | void fillFrom(MimeTreeParser::MessagePart::Ptr part); | 274 | } |
246 | }; | ||
247 | 275 | ||
248 | QByteArray MimePart::type() const | 276 | SinglePart::~SinglePart() |
249 | { | 277 | { |
250 | return "MimePart"; | 278 | |
251 | } | 279 | } |
252 | 280 | ||
253 | class AttachmentPartPrivate | 281 | QVector<QByteArray> SinglePart::availableContents() const |
254 | { | 282 | { |
255 | public: | 283 | return QVector<QByteArray>() << d->mType; |
256 | void fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part); | 284 | } |
257 | }; | ||
258 | 285 | ||
259 | void AttachmentPartPrivate::fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part) | 286 | QVector< Content::Ptr > SinglePart::content() const |
260 | { | 287 | { |
288 | return d->mContent; | ||
289 | } | ||
261 | 290 | ||
291 | QByteArray SinglePart::type() const | ||
292 | { | ||
293 | return "SinglePart"; | ||
262 | } | 294 | } |
263 | 295 | ||
264 | QByteArray AttachmentPart::type() const | 296 | class MimePartPrivate |
297 | { | ||
298 | public: | ||
299 | void fillFrom(MimeTreeParser::MessagePart::Ptr part); | ||
300 | }; | ||
301 | |||
302 | QByteArray MimePart::type() const | ||
265 | { | 303 | { |
266 | return "AttachmentPart"; | 304 | return "MimePart"; |
267 | } | 305 | } |
268 | 306 | ||
269 | ParserPrivate::ParserPrivate(Parser* parser) | 307 | ParserPrivate::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 | ||
339 | ContentPart::Ptr Parser::collectContentPart(const Part::Ptr &start) const | 377 | QVector<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 | |||
348 | ContentPart::Ptr Parser::collectContentPart() const | ||
349 | { | ||
350 | return collectContentPart(d->mTree); | ||
351 | } | 380 | } |
352 | 381 | ||
353 | template <typename T> | 382 | template <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 |