summaryrefslogtreecommitdiffstats
path: root/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-06-07 22:17:12 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-06-07 22:17:12 +0200
commit23132b14e9bf3e1ec1f7720bbe28a2051508bd0f (patch)
treec5989b95fb805b7b770453a01fbff74fc76e43f0 /framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp
parente683f8ebdadd5bfc5a32d6be126c46ec2c3a26e5 (diff)
downloadkube-23132b14e9bf3e1ec1f7720bbe28a2051508bd0f.tar.gz
kube-23132b14e9bf3e1ec1f7720bbe28a2051508bd0f.zip
Encapsulated parts
Diffstat (limited to 'framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp')
-rw-r--r--framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp38
1 files changed, 25 insertions, 13 deletions
diff --git a/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp b/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp
index b137be87..8d8ddf12 100644
--- a/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp
+++ b/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp
@@ -190,20 +190,17 @@ KMime::Content *ObjectTreeParser::find(const std::function<bool(KMime::Content *
190 * Filter to avoid evaluating a subtree. 190 * Filter to avoid evaluating a subtree.
191 * Select parts to include it in the result set. Selecting a part in a branch will keep any parent parts from being selected. 191 * Select parts to include it in the result set. Selecting a part in a branch will keep any parent parts from being selected.
192 */ 192 */
193static QVector<MessagePart::Ptr> collect(MessagePart::Ptr start, const std::function<bool(const MessagePartPtr &)> &filter, const std::function<bool(const MessagePartPtr &)> &select) 193static QVector<MessagePart::Ptr> collect(MessagePart::Ptr start, const std::function<bool(const MessagePartPtr &)> &evaluateSubtree, const std::function<bool(const MessagePartPtr &)> &select)
194{ 194{
195 MessagePartPtr ptr = start.dynamicCast<MessagePart>(); 195 MessagePartPtr ptr = start.dynamicCast<MessagePart>();
196 Q_ASSERT(ptr); 196 Q_ASSERT(ptr);
197 if (!filter(ptr)) {
198 return {};
199 }
200
201 QVector<MessagePart::Ptr> list; 197 QVector<MessagePart::Ptr> list;
202 if (ptr) { 198 if (evaluateSubtree(ptr)) {
203 for (const auto &p: ptr->subParts()) { 199 for (const auto &p: ptr->subParts()) {
204 list << ::collect(p, filter, select); 200 list << ::collect(p, evaluateSubtree, select);
205 } 201 }
206 } 202 }
203
207 //Don't consider this part if we already selected a subpart 204 //Don't consider this part if we already selected a subpart
208 if (list.isEmpty()) { 205 if (list.isEmpty()) {
209 if (select(ptr)) { 206 if (select(ptr)) {
@@ -213,14 +210,25 @@ static QVector<MessagePart::Ptr> collect(MessagePart::Ptr start, const std::func
213 return list; 210 return list;
214} 211}
215 212
216QVector<MessagePart::Ptr> ObjectTreeParser::collectContentParts() 213QVector<MessagePartPtr> ObjectTreeParser::collectContentParts()
217{ 214{
218 QVector<MessagePart::Ptr> contentParts = ::collect(mParsedPart, 215 return collectContentParts(mParsedPart);
219 [] (const MessagePartPtr &part) { 216}
220 // return p->type() != "EncapsulatedPart"; 217
218QVector<MessagePart::Ptr> ObjectTreeParser::collectContentParts(MessagePart::Ptr start)
219{
220 return ::collect(start,
221 [start] (const MessagePartPtr &part) {
222 //Ignore the top-level
223 if (start.data() == part.data()) {
224 return true;
225 }
226 if (auto e = part.dynamicCast<MimeTreeParser::EncapsulatedRfc822MessagePart>()) {
227 return false;
228 }
221 return true; 229 return true;
222 }, 230 },
223 [] (const MessagePartPtr &part) { 231 [start] (const MessagePartPtr &part) {
224 if (dynamic_cast<MimeTreeParser::AttachmentMessagePart*>(part.data())) { 232 if (dynamic_cast<MimeTreeParser::AttachmentMessagePart*>(part.data())) {
225 return false; 233 return false;
226 } else if (const auto text = dynamic_cast<MimeTreeParser::TextMessagePart*>(part.data())) { 234 } else if (const auto text = dynamic_cast<MimeTreeParser::TextMessagePart*>(part.data())) {
@@ -233,6 +241,11 @@ QVector<MessagePart::Ptr> ObjectTreeParser::collectContentParts()
233 return true; 241 return true;
234 } else if (dynamic_cast<MimeTreeParser::HtmlMessagePart*>(part.data())) { 242 } else if (dynamic_cast<MimeTreeParser::HtmlMessagePart*>(part.data())) {
235 return true; 243 return true;
244 } else if (dynamic_cast<MimeTreeParser::EncapsulatedRfc822MessagePart*>(part.data())) {
245 if (start.data() == part.data()) {
246 return false;
247 }
248 return true;
236 } else if (const auto enc = dynamic_cast<MimeTreeParser::EncryptedMessagePart*>(part.data())) { 249 } else if (const auto enc = dynamic_cast<MimeTreeParser::EncryptedMessagePart*>(part.data())) {
237 if (enc->error()) { 250 if (enc->error()) {
238 return true; 251 return true;
@@ -247,7 +260,6 @@ QVector<MessagePart::Ptr> ObjectTreeParser::collectContentParts()
247 } 260 }
248 return false; 261 return false;
249 }); 262 });
250 return contentParts;
251} 263}
252 264
253QVector<MessagePart::Ptr> ObjectTreeParser::collectAttachmentParts() 265QVector<MessagePart::Ptr> ObjectTreeParser::collectAttachmentParts()