From 9516f3b02f74f239ce2776abf7cf1147952065cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Tue, 19 Jul 2016 14:46:23 +0200 Subject: new mimetreeparser interface Reviewers: cmollekopf Maniphest Tasks: T3208 Differential Revision: https://phabricator.kde.org/D2221 --- framework/domain/mimetreeparser/interface.cpp | 89 ++++++++++++++++++++------- 1 file changed, 66 insertions(+), 23 deletions(-) (limited to 'framework/domain/mimetreeparser/interface.cpp') 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: QVector subParts(); - const std::weak_ptr &parent() const; + Part *parent() const; private: Part *q; - std::weak_ptr mParent; + Part *mParent; QVector mSubParts; }; PartPrivate::PartPrivate(Part* part) - :q(part) + : q(part) + , mParent(Q_NULLPTR) { } void PartPrivate::appendSubPart(Part::Ptr subpart) { - subpart->d->mParent = Part::Ptr(q); + subpart->d->mParent = q; mSubParts.append(subpart); } -const std::weak_ptr &PartPrivate::parent() const +Part *PartPrivate::parent() const { return mParent; } @@ -90,7 +91,7 @@ QByteArray Part::type() const QVector Part::encryptions() const { - auto parent = d->parent().lock(); + auto parent = d->parent(); if (parent) { return parent->encryptions(); } else { @@ -100,7 +101,7 @@ QVector Part::encryptions() const QVector Part::signatures() const { - auto parent = d->parent().lock(); + auto parent = d->parent(); if (parent) { return parent->signatures(); } else { @@ -146,6 +147,16 @@ QVector< Signature > Content::signatures() const return QVector(); } +QByteArray Content::content() const +{ + return d->mContent; +} + +QByteArray Content::charset() const +{ + return d->mCodec; +} + class ContentPartPrivate { public: @@ -153,12 +164,14 @@ public: void fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part); void fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr part); - QVector contents() const; + QVector content() const; ContentPart *q; + + ContentPart::Types types() const; private: - QVector mContents; + QVector mContent; ContentPart::Types mTypes; }; @@ -167,7 +180,7 @@ void ContentPartPrivate::fillFrom(MimeTreeParser::TextMessagePart::Ptr part) mTypes = ContentPart::PlainText; foreach (const auto &mp, part->subParts()) { auto content = std::make_shared(mp->text().toLocal8Bit(), q); - mContents.append(content); + mContent.append(content); } } @@ -181,6 +194,22 @@ void ContentPartPrivate::fillFrom(MimeTreeParser::AlternativeMessagePart::Ptr pa mTypes = ContentPart::Html | ContentPart::PlainText; } +ContentPart::Types ContentPartPrivate::types() const +{ + return mTypes; +} + +QVector ContentPartPrivate::content() const +{ + return mContent; +} + +QVector ContentPart::content(ContentPart::Type ct) const +{ + return d->content(); +} + + ContentPart::ContentPart() : d(std::unique_ptr(new ContentPartPrivate)) { @@ -197,6 +226,11 @@ QByteArray ContentPart::type() const return "ContentPart"; } +ContentPart::Types ContentPart::availableContents() const +{ + return d->types(); +} + class MimePartPrivate { public: @@ -230,7 +264,7 @@ public: ParserPrivate(Parser *parser); void setMessage(const QByteArray &mimeMessage); - void createTree(MimeTreeParser::MessagePart::Ptr start, Part::Ptr tree); + void createTree(const MimeTreeParser::MessagePart::Ptr& start, const Part::Ptr& tree); Part::Ptr mTree; private: @@ -273,9 +307,8 @@ void ParserPrivate::setMessage(const QByteArray& mimeMessage) } -void ParserPrivate::createTree(MimeTreeParser::MessagePart::Ptr start, Part::Ptr tree) +void ParserPrivate::createTree(const MimeTreeParser::MessagePart::Ptr &start, const Part::Ptr &tree) { - foreach (const auto &mp, start->subParts()) { const auto m = mp.dynamicCast(); const auto text = mp.dynamicCast(); @@ -316,16 +349,10 @@ Parser::~Parser() ContentPart::Ptr Parser::collectContentPart(const Part::Ptr &start) const { - foreach (const auto &part, start->subParts()) { - if (part->type() == "ContentPart") { - return std::dynamic_pointer_cast(part); - } else { - auto ret = collectContentPart(part); - if (ret) { - return ret; - } - } - } + const auto ret = collect(start, [](const Part::Ptr &p){return p->type() == "ContentPart";}, [](const ContentPart::Ptr &p){return true;}); + if (ret.size() > 0) { + return ret[0]; + }; return ContentPart::Ptr(); } @@ -333,3 +360,19 @@ ContentPart::Ptr Parser::collectContentPart() const { return collectContentPart(d->mTree); } + +template +QVector Parser::collect(const Part::Ptr &start, std::function select, std::function filter) const +{ + QVector ret; + foreach (const auto &part, start->subParts()) { + if (select(part)){ + const auto p = std::dynamic_pointer_cast(part); + if (p && filter(p)) { + ret.append(p); + } + ret += collect(part, select, filter); + } + } + return ret; +} -- cgit v1.2.3