diff options
Diffstat (limited to 'framework/domain/mimetreeparser/interface.cpp')
-rw-r--r-- | framework/domain/mimetreeparser/interface.cpp | 89 |
1 files changed, 66 insertions, 23 deletions
diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp index 6a399015..c239fcc0 100644 --- a/framework/domain/mimetreeparser/interface.cpp +++ b/framework/domain/mimetreeparser/interface.cpp | |||
@@ -38,26 +38,27 @@ public: | |||
38 | 38 | ||
39 | QVector<Part::Ptr> subParts(); | 39 | QVector<Part::Ptr> subParts(); |
40 | 40 | ||
41 | const std::weak_ptr<Part> &parent() const; | 41 | Part *parent() const; |
42 | private: | 42 | private: |
43 | Part *q; | 43 | Part *q; |
44 | std::weak_ptr<Part> mParent; | 44 | Part *mParent; |
45 | QVector<Part::Ptr> mSubParts; | 45 | QVector<Part::Ptr> mSubParts; |
46 | }; | 46 | }; |
47 | 47 | ||
48 | PartPrivate::PartPrivate(Part* part) | 48 | PartPrivate::PartPrivate(Part* part) |
49 | :q(part) | 49 | : q(part) |
50 | , mParent(Q_NULLPTR) | ||
50 | { | 51 | { |
51 | 52 | ||
52 | } | 53 | } |
53 | 54 | ||
54 | void PartPrivate::appendSubPart(Part::Ptr subpart) | 55 | void PartPrivate::appendSubPart(Part::Ptr subpart) |
55 | { | 56 | { |
56 | subpart->d->mParent = Part::Ptr(q); | 57 | subpart->d->mParent = q; |
57 | mSubParts.append(subpart); | 58 | mSubParts.append(subpart); |
58 | } | 59 | } |
59 | 60 | ||
60 | const std::weak_ptr<Part> &PartPrivate::parent() const | 61 | Part *PartPrivate::parent() const |
61 | { | 62 | { |
62 | return mParent; | 63 | return mParent; |
63 | } | 64 | } |
@@ -90,7 +91,7 @@ QByteArray Part::type() const | |||
90 | 91 | ||
91 | QVector<Encryption> Part::encryptions() const | 92 | QVector<Encryption> Part::encryptions() const |
92 | { | 93 | { |
93 | auto parent = d->parent().lock(); | 94 | auto parent = d->parent(); |
94 | if (parent) { | 95 | if (parent) { |
95 | return parent->encryptions(); | 96 | return parent->encryptions(); |
96 | } else { | 97 | } else { |
@@ -100,7 +101,7 @@ QVector<Encryption> Part::encryptions() const | |||
100 | 101 | ||
101 | QVector<Signature> Part::signatures() const | 102 | QVector<Signature> Part::signatures() const |
102 | { | 103 | { |
103 | auto parent = d->parent().lock(); | 104 | auto parent = d->parent(); |
104 | if (parent) { | 105 | if (parent) { |
105 | return parent->signatures(); | 106 | return parent->signatures(); |
106 | } else { | 107 | } else { |
@@ -146,6 +147,16 @@ QVector< Signature > Content::signatures() const | |||
146 | return QVector<Signature>(); | 147 | return QVector<Signature>(); |
147 | } | 148 | } |
148 | 149 | ||
150 | QByteArray Content::content() const | ||
151 | { | ||
152 | return d->mContent; | ||
153 | } | ||
154 | |||
155 | QByteArray Content::charset() const | ||
156 | { | ||
157 | return d->mCodec; | ||
158 | } | ||
159 | |||
149 | class ContentPartPrivate | 160 | class ContentPartPrivate |
150 | { | 161 | { |
151 | public: | 162 | public: |
@@ -153,12 +164,14 @@ public: | |||
153 | void fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part); | 164 | void fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part); |
154 | void fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part); | 165 | void fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part); |
155 | 166 | ||
156 | QVector<Content::Ptr> contents() const; | 167 | QVector<Content::Ptr> content() const; |
157 | 168 | ||
158 | ContentPart *q; | 169 | ContentPart *q; |
170 | |||
171 | ContentPart::Types types() const; | ||
159 | 172 | ||
160 | private: | 173 | private: |
161 | QVector<Content::Ptr> mContents; | 174 | QVector<Content::Ptr> mContent; |
162 | ContentPart::Types mTypes; | 175 | ContentPart::Types mTypes; |
163 | }; | 176 | }; |
164 | 177 | ||
@@ -167,7 +180,7 @@ void ContentPartPrivate::fillFrom(MimeTreeParser::TextMessagePart::Ptr part) | |||
167 | mTypes = ContentPart::PlainText; | 180 | mTypes = ContentPart::PlainText; |
168 | foreach (const auto &mp, part->subParts()) { | 181 | foreach (const auto &mp, part->subParts()) { |
169 | auto content = std::make_shared<Content>(mp->text().toLocal8Bit(), q); | 182 | auto content = std::make_shared<Content>(mp->text().toLocal8Bit(), q); |
170 | mContents.append(content); | 183 | mContent.append(content); |
171 | } | 184 | } |
172 | } | 185 | } |
173 | 186 | ||
@@ -181,6 +194,22 @@ void ContentPartPrivate::fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr pa | |||
181 | mTypes = ContentPart::Html | ContentPart::PlainText; | 194 | mTypes = ContentPart::Html | ContentPart::PlainText; |
182 | } | 195 | } |
183 | 196 | ||
197 | ContentPart::Types ContentPartPrivate::types() const | ||
198 | { | ||
199 | return mTypes; | ||
200 | } | ||
201 | |||
202 | QVector<Content::Ptr> ContentPartPrivate::content() const | ||
203 | { | ||
204 | return mContent; | ||
205 | } | ||
206 | |||
207 | QVector<Content::Ptr> ContentPart::content(ContentPart::Type ct) const | ||
208 | { | ||
209 | return d->content(); | ||
210 | } | ||
211 | |||
212 | |||
184 | ContentPart::ContentPart() | 213 | ContentPart::ContentPart() |
185 | : d(std::unique_ptr<ContentPartPrivate>(new ContentPartPrivate)) | 214 | : d(std::unique_ptr<ContentPartPrivate>(new ContentPartPrivate)) |
186 | { | 215 | { |
@@ -197,6 +226,11 @@ QByteArray ContentPart::type() const | |||
197 | return "ContentPart"; | 226 | return "ContentPart"; |
198 | } | 227 | } |
199 | 228 | ||
229 | ContentPart::Types ContentPart::availableContents() const | ||
230 | { | ||
231 | return d->types(); | ||
232 | } | ||
233 | |||
200 | class MimePartPrivate | 234 | class MimePartPrivate |
201 | { | 235 | { |
202 | public: | 236 | public: |
@@ -230,7 +264,7 @@ public: | |||
230 | ParserPrivate(Parser *parser); | 264 | ParserPrivate(Parser *parser); |
231 | 265 | ||
232 | void setMessage(const QByteArray &mimeMessage); | 266 | void setMessage(const QByteArray &mimeMessage); |
233 | void createTree(MimeTreeParser::MessagePart::Ptr start, Part::Ptr tree); | 267 | void createTree(const MimeTreeParser::MessagePart::Ptr& start, const Part::Ptr& tree); |
234 | 268 | ||
235 | Part::Ptr mTree; | 269 | Part::Ptr mTree; |
236 | private: | 270 | private: |
@@ -273,9 +307,8 @@ void ParserPrivate::setMessage(const QByteArray& mimeMessage) | |||
273 | } | 307 | } |
274 | 308 | ||
275 | 309 | ||
276 | void ParserPrivate::createTree(MimeTreeParser::MessagePart::Ptr start, Part::Ptr tree) | 310 | void ParserPrivate::createTree(const MimeTreeParser::MessagePart::Ptr &start, const Part::Ptr &tree) |
277 | { | 311 | { |
278 | |||
279 | foreach (const auto &mp, start->subParts()) { | 312 | foreach (const auto &mp, start->subParts()) { |
280 | const auto m = mp.dynamicCast<MimeTreeParser::MessagePart>(); | 313 | const auto m = mp.dynamicCast<MimeTreeParser::MessagePart>(); |
281 | const auto text = mp.dynamicCast<MimeTreeParser::TextMessagePart>(); | 314 | const auto text = mp.dynamicCast<MimeTreeParser::TextMessagePart>(); |
@@ -316,16 +349,10 @@ Parser::~Parser() | |||
316 | 349 | ||
317 | ContentPart::Ptr Parser::collectContentPart(const Part::Ptr &start) const | 350 | ContentPart::Ptr Parser::collectContentPart(const Part::Ptr &start) const |
318 | { | 351 | { |
319 | foreach (const auto &part, start->subParts()) { | 352 | const auto ret = collect<ContentPart>(start, [](const Part::Ptr &p){return p->type() == "ContentPart";}, [](const ContentPart::Ptr &p){return true;}); |
320 | if (part->type() == "ContentPart") { | 353 | if (ret.size() > 0) { |
321 | return std::dynamic_pointer_cast<ContentPart>(part); | 354 | return ret[0]; |
322 | } else { | 355 | }; |
323 | auto ret = collectContentPart(part); | ||
324 | if (ret) { | ||
325 | return ret; | ||
326 | } | ||
327 | } | ||
328 | } | ||
329 | return ContentPart::Ptr(); | 356 | return ContentPart::Ptr(); |
330 | } | 357 | } |
331 | 358 | ||
@@ -333,3 +360,19 @@ ContentPart::Ptr Parser::collectContentPart() const | |||
333 | { | 360 | { |
334 | return collectContentPart(d->mTree); | 361 | return collectContentPart(d->mTree); |
335 | } | 362 | } |
363 | |||
364 | template <typename T> | ||
365 | QVector<typename T::Ptr> Parser::collect(const Part::Ptr &start, std::function<bool(const Part::Ptr &)> select, std::function<bool(const typename T::Ptr &)> filter) const | ||
366 | { | ||
367 | QVector<typename T::Ptr> ret; | ||
368 | foreach (const auto &part, start->subParts()) { | ||
369 | if (select(part)){ | ||
370 | const auto p = std::dynamic_pointer_cast<T>(part); | ||
371 | if (p && filter(p)) { | ||
372 | ret.append(p); | ||
373 | } | ||
374 | ret += collect<T>(part, select, filter); | ||
375 | } | ||
376 | } | ||
377 | return ret; | ||
378 | } | ||