summaryrefslogtreecommitdiffstats
path: root/framework/domain/mimetreeparser/interface.cpp
diff options
context:
space:
mode:
authorSandro Knauß <sknauss@kde.org>2016-07-19 14:46:23 +0200
committerSandro Knauß <sknauss@kde.org>2016-07-19 14:51:28 +0200
commit9516f3b02f74f239ce2776abf7cf1147952065cd (patch)
tree45c02205335e2d5e8796adc7e75489a1d365d33c /framework/domain/mimetreeparser/interface.cpp
parent2fdddd2f795da4645dc9a48fee4865324143a21b (diff)
downloadkube-9516f3b02f74f239ce2776abf7cf1147952065cd.tar.gz
kube-9516f3b02f74f239ce2776abf7cf1147952065cd.zip
new mimetreeparser interface
Reviewers: cmollekopf Maniphest Tasks: T3208 Differential Revision: https://phabricator.kde.org/D2221
Diffstat (limited to 'framework/domain/mimetreeparser/interface.cpp')
-rw-r--r--framework/domain/mimetreeparser/interface.cpp89
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;
42private: 42private:
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
48PartPrivate::PartPrivate(Part* part) 48PartPrivate::PartPrivate(Part* part)
49 :q(part) 49 : q(part)
50 , mParent(Q_NULLPTR)
50{ 51{
51 52
52} 53}
53 54
54void PartPrivate::appendSubPart(Part::Ptr subpart) 55void 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
60const std::weak_ptr<Part> &PartPrivate::parent() const 61Part *PartPrivate::parent() const
61{ 62{
62 return mParent; 63 return mParent;
63} 64}
@@ -90,7 +91,7 @@ QByteArray Part::type() const
90 91
91QVector<Encryption> Part::encryptions() const 92QVector<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
101QVector<Signature> Part::signatures() const 102QVector<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
150QByteArray Content::content() const
151{
152 return d->mContent;
153}
154
155QByteArray Content::charset() const
156{
157 return d->mCodec;
158}
159
149class ContentPartPrivate 160class ContentPartPrivate
150{ 161{
151public: 162public:
@@ -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
160private: 173private:
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
197ContentPart::Types ContentPartPrivate::types() const
198{
199 return mTypes;
200}
201
202QVector<Content::Ptr> ContentPartPrivate::content() const
203{
204 return mContent;
205}
206
207QVector<Content::Ptr> ContentPart::content(ContentPart::Type ct) const
208{
209 return d->content();
210}
211
212
184ContentPart::ContentPart() 213ContentPart::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
229ContentPart::Types ContentPart::availableContents() const
230{
231 return d->types();
232}
233
200class MimePartPrivate 234class MimePartPrivate
201{ 235{
202public: 236public:
@@ -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;
236private: 270private:
@@ -273,9 +307,8 @@ void ParserPrivate::setMessage(const QByteArray& mimeMessage)
273} 307}
274 308
275 309
276void ParserPrivate::createTree(MimeTreeParser::MessagePart::Ptr start, Part::Ptr tree) 310void 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
317ContentPart::Ptr Parser::collectContentPart(const Part::Ptr &start) const 350ContentPart::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
364template <typename T>
365QVector<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}