From 1974c19eadd497e355ac985a00d0571f3e6c7712 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Tue, 11 Oct 2016 16:18:50 +0200 Subject: create model for new mailviewer --- framework/domain/messageparser_new.cpp | 148 +++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 framework/domain/messageparser_new.cpp (limited to 'framework/domain/messageparser_new.cpp') diff --git a/framework/domain/messageparser_new.cpp b/framework/domain/messageparser_new.cpp new file mode 100644 index 00000000..d1b956f5 --- /dev/null +++ b/framework/domain/messageparser_new.cpp @@ -0,0 +1,148 @@ + +/* + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "messageparser.h" +#include "mimetreeparser/interface.h" + +#include + +NewModel::NewModel(std::shared_ptr parser) + : mParser(parser) +{ + mParts = mParser->collectContentParts(); + foreach(const auto &part, mParts) { + mContentMap.insert(part.get(), std::shared_ptr(new NewContentModel(part))); + } +} + +QHash NewModel::roleNames() const +{ + QHash roles; + roles[TypeRole] = "type"; + roles[ContentsRole] = "contents"; + roles[IsEmbededRole] = "embeded"; + roles[SecurityLevelRole] = "securityLevel"; + return roles; +} + +QModelIndex NewModel::index(int row, int column, const QModelIndex &parent) const +{ + if (!parent.isValid()) { + if (row < mParts.size()) { + auto part = mParts.at(row); + return createIndex(row, column, part.get()); + } + } + return QModelIndex(); +} + +QVariant NewModel::data(const QModelIndex &index, int role) const +{ + if (!index.parent().isValid()) { + auto part = static_cast(index.internalPointer()); + switch (role) { + case TypeRole: + return QString::fromLatin1(part->type()); + case IsEmbededRole: + return index.parent().isValid(); + case SecurityLevelRole: + return QStringLiteral("GRAY"); + case ContentsRole: + return QVariant::fromValue(mContentMap.value(part).get()); + } + } + return QVariant(); +} + +QModelIndex NewModel::parent(const QModelIndex &index) const +{ + return QModelIndex(); +} + +int NewModel::rowCount(const QModelIndex &parent) const +{ + if (!parent.isValid()) { + return mParts.size(); + } + return 0; +} + +int NewModel::columnCount(const QModelIndex &parent) const +{ + return 1; +} + +NewContentModel::NewContentModel(const Part::Ptr &part) + : mPart(part) +{ +} + +QHash NewContentModel::roleNames() const +{ + QHash roles; + roles[TypeRole] = "type"; + roles[ContentRole] = "content"; + roles[IsEmbededRole] = "embeded"; + roles[SecurityLevelRole] = "securityLevel"; + return roles; +} + +QModelIndex NewContentModel::index(int row, int column, const QModelIndex &parent) const +{ + if (!parent.isValid()) { + if (row < mPart->content().size()) { + auto part = mPart->content().at(row); + return createIndex(row, column, part.get()); + } + } + return QModelIndex(); +} + +QVariant NewContentModel::data(const QModelIndex &index, int role) const +{ + auto content = static_cast(index.internalPointer()); + switch (role) { + case TypeRole: + return QString::fromLatin1(content->type()); + case IsEmbededRole: + return false; + case ContentRole: + return content->encodedContent(); + case SecurityLevelRole: + return content->encryptions().size() > mPart->encryptions().size() ? "red": "black"; //test for gpg inline + } + return QVariant(); +} + +QModelIndex NewContentModel::parent(const QModelIndex &index) const +{ + return QModelIndex(); +} + +int NewContentModel::rowCount(const QModelIndex &parent) const +{ + if (!parent.isValid()) { + return mPart->content().size(); + } + return 0; +} + +int NewContentModel::columnCount(const QModelIndex &parent) const +{ + return 1; +} -- cgit v1.2.3 From 1fe0ab05ae2bfe6505736f598bd535a71fb86a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Mon, 17 Oct 2016 15:35:49 +0200 Subject: replace cid links with actuall content of the images --- framework/domain/messageparser_new.cpp | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'framework/domain/messageparser_new.cpp') diff --git a/framework/domain/messageparser_new.cpp b/framework/domain/messageparser_new.cpp index d1b956f5..4395f2e3 100644 --- a/framework/domain/messageparser_new.cpp +++ b/framework/domain/messageparser_new.cpp @@ -26,7 +26,7 @@ NewModel::NewModel(std::shared_ptr parser) { mParts = mParser->collectContentParts(); foreach(const auto &part, mParts) { - mContentMap.insert(part.get(), std::shared_ptr(new NewContentModel(part))); + mContentMap.insert(part.get(), std::shared_ptr(new NewContentModel(part, mParser))); } } @@ -87,8 +87,9 @@ int NewModel::columnCount(const QModelIndex &parent) const return 1; } -NewContentModel::NewContentModel(const Part::Ptr &part) +NewContentModel::NewContentModel(const Part::Ptr &part, const std::shared_ptr &parser) : mPart(part) + , mParser(parser) { } @@ -121,8 +122,32 @@ QVariant NewContentModel::data(const QModelIndex &index, int role) const return QString::fromLatin1(content->type()); case IsEmbededRole: return false; - case ContentRole: - return content->encodedContent(); + case ContentRole: { + auto text = content->encodedContent(); + if (data(index, TypeRole).toString() == "HtmlContent") { + const auto rx = QRegExp("(src)\\s*=\\s*(\"|')(cid:[^\"']+)\\2"); + int pos = 0; + while ((pos = rx.indexIn(text, pos)) != -1) { + const auto link = QUrl(rx.cap(3).toUtf8()); + pos += rx.matchedLength(); + const auto repl = mParser->getPart(link); + if (!repl) { + continue; + } + const auto content = repl->content(); + if(content.size() < 1) { + continue; + } + const auto mailMime = content.first()->mailMime(); + const auto mimetype = mailMime->mimetype().name(); + if (mimetype.startsWith("image/")) { + const auto data = content.first()->content(); + text.replace(rx.cap(0), QString("src=\"data:%1;base64,%2\"").arg(mimetype, QString::fromLatin1(data.toBase64()))); + } + } + } + return text; + } case SecurityLevelRole: return content->encryptions().size() > mPart->encryptions().size() ? "red": "black"; //test for gpg inline } -- cgit v1.2.3 From d708e1310cc8e65fab078eb6b5b4a325de462a24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Tue, 18 Oct 2016 15:30:11 +0200 Subject: start implementing a nested model with sig->enc->part->content --- framework/domain/messageparser_new.cpp | 313 +++++++++++++++++++++++++++++++-- 1 file changed, 296 insertions(+), 17 deletions(-) (limited to 'framework/domain/messageparser_new.cpp') diff --git a/framework/domain/messageparser_new.cpp b/framework/domain/messageparser_new.cpp index 4395f2e3..ffe7550f 100644 --- a/framework/domain/messageparser_new.cpp +++ b/framework/domain/messageparser_new.cpp @@ -21,8 +21,38 @@ #include -NewModel::NewModel(std::shared_ptr parser) - : mParser(parser) +Q_DECLARE_METATYPE(Part *) +Q_DECLARE_METATYPE(Content *) +Q_DECLARE_METATYPE(Signature *) +Q_DECLARE_METATYPE(Encryption *) + +class NewModelPrivate +{ +public: + NewModelPrivate(NewModel *q_ptr, const std::shared_ptr &parser); + + QSharedPointer getVar(const std::shared_ptr &sig); + QSharedPointer getVar(const std::shared_ptr &enc); + QSharedPointer getVar(const std::shared_ptr &part); + + int getPos(Signature *sig); + int getPos(Encryption *enc); + int getPos(Part *part); + + NewModel *q; + QVector mParts; + + std::shared_ptr mParser; + QMap> mContentMap; +private: + QMap, QSharedPointer> mSignatureMap; + QMap, QSharedPointer> mEncryptionMap; + QMap, QSharedPointer> mPartMap; +}; + +NewModelPrivate::NewModelPrivate(NewModel *q_ptr, const std::shared_ptr &parser) + : q(q_ptr) + , mParser(parser) { mParts = mParser->collectContentParts(); foreach(const auto &part, mParts) { @@ -30,6 +60,84 @@ NewModel::NewModel(std::shared_ptr parser) } } +QSharedPointer NewModelPrivate::getVar(const std::shared_ptr &sig) +{ + if (!mSignatureMap.contains(sig)) { + auto var = new QVariant(); + var->setValue(sig.get()); + mSignatureMap.insert(sig, QSharedPointer(var)); + } + return mSignatureMap.value(sig); +} + +QSharedPointer NewModelPrivate::getVar(const std::shared_ptr &enc) +{ + if (!mEncryptionMap.contains(enc)) { + auto var = new QVariant(); + var->setValue(enc.get()); + mEncryptionMap.insert(enc, QSharedPointer(var)); + } + return mEncryptionMap.value(enc); +} + +QSharedPointer NewModelPrivate::getVar(const std::shared_ptr &part) +{ + if (!mPartMap.contains(part)) { + auto var = new QVariant(); + var->setValue(part.get()); + mPartMap.insert(part, QSharedPointer(var)); + } + return mPartMap.value(part); +} + +int NewModelPrivate::getPos(Signature *signature) +{ + const auto first = mParts.first(); + int i = 0; + foreach(const auto &sig, first->signatures()) { + if (sig.get() == signature) { + break; + } + i++; + } + return i; +} + +int NewModelPrivate::getPos(Encryption *encryption) +{ + const auto first = mParts.first(); + int i = 0; + foreach(const auto &enc, first->encryptions()) { + if (enc.get() == encryption) { + break; + } + i++; + } + return i; +} + + +int NewModelPrivate::getPos(Part *part) +{ + int i = 0; + foreach(const auto &p, mParts) { + if (p.get() == part) { + break; + } + i++; + } + return i; +} + +NewModel::NewModel(std::shared_ptr parser) + : d(std::unique_ptr(new NewModelPrivate(this, parser))) +{ +} + +NewModel::~NewModel() +{ +} + QHash NewModel::roleNames() const { QHash roles; @@ -40,12 +148,71 @@ QHash NewModel::roleNames() const return roles; } + QModelIndex NewModel::index(int row, int column, const QModelIndex &parent) const { + if (row < 0 || column != 0) { + return QModelIndex(); + } if (!parent.isValid()) { - if (row < mParts.size()) { - auto part = mParts.at(row); - return createIndex(row, column, part.get()); + const auto first = d->mParts.first(); + if (first->signatures().size() > 0) { + if (row == 0) { + const auto sig = first->signatures().at(row); + return createIndex(row, column, d->getVar(sig).data()); + } + } else if (first->encryptions().size() > 0) { + if (row == 0) { + const auto enc = first->encryptions().at(row); + return createIndex(row, column, d->getVar(enc).data()); + } + } else { + if (row < d->mParts.size()) { + auto part = d->mParts.at(row); + return createIndex(row, column, d->getVar(part).data()); + } + } + } else { + if (!parent.internalPointer()) { + return QModelIndex(); + } + const auto data = static_cast(parent.internalPointer()); + const auto first = d->mParts.first(); + int encpos = -1; + int partpos = -1; + if (data->userType() == qMetaTypeId()) { + const auto signature = data->value(); + int i = d->getPos(signature); + + if (i+1 < first->signatures().size()) { + if (row != 0) { + return QModelIndex(); + } + const auto sig = first->signatures().at(i+1); + return createIndex(0,0, d->getVar(sig).data()); + } + + if (first->encryptions().size() > 0) { + encpos = 0; + } + } else if (data->userType() == qMetaTypeId()) { + const auto encryption = data->value(); + encpos = d->getPos(encryption) + 1; + } + + if (encpos > -1 && encpos < first->encryptions().size()) { + if (row != 0) { + return QModelIndex(); + } + const auto enc = first->encryptions().at(encpos); + return createIndex(0,0, d->getVar(enc).data()); + } + + if (row < d->mParts.size()) { + auto part = d->mParts.at(row); + auto var = new QVariant(); + var->setValue(part.get()); + return createIndex(row, column, d->getVar(part).data()); } } return QModelIndex(); @@ -53,17 +220,44 @@ QModelIndex NewModel::index(int row, int column, const QModelIndex &parent) cons QVariant NewModel::data(const QModelIndex &index, int role) const { - if (!index.parent().isValid()) { - auto part = static_cast(index.internalPointer()); - switch (role) { - case TypeRole: - return QString::fromLatin1(part->type()); - case IsEmbededRole: - return index.parent().isValid(); - case SecurityLevelRole: - return QStringLiteral("GRAY"); - case ContentsRole: - return QVariant::fromValue(mContentMap.value(part).get()); + if (!index.isValid()) { + if (role == Qt::DisplayRole) { + return QString("root"); + } + return QVariant(); + } + if (index.internalPointer()) { + const auto data = static_cast(index.internalPointer()); + if (data->userType() == qMetaTypeId()) { + const auto signature = data->value(); + int i = d->getPos(signature); + switch(role) { + case Qt::DisplayRole: + case TypeRole: + return QStringLiteral("Signature%1").arg(i); + } + } else if (data->userType() == qMetaTypeId()) { + const auto first = d->mParts.first(); + const auto encryption = data->value(); + int i = d->getPos(encryption); + switch(role) { + case Qt::DisplayRole: + case TypeRole: + return QStringLiteral("Encryption%1").arg(i); + } + } else if (data->userType() == qMetaTypeId()) { + const auto part = data->value(); + switch (role) { + case Qt::DisplayRole: + case TypeRole: + return QString::fromLatin1(part->type()); + case IsEmbededRole: + return index.parent().isValid(); + case SecurityLevelRole: + return QStringLiteral("GRAY"); + case ContentsRole: + return QVariant::fromValue(d->mContentMap.value(part).get()); + } } } return QVariant(); @@ -71,13 +265,98 @@ QVariant NewModel::data(const QModelIndex &index, int role) const QModelIndex NewModel::parent(const QModelIndex &index) const { + if (!index.internalPointer()) { + return QModelIndex(); + } + const auto data = static_cast(index.internalPointer()); + if (data->userType() == qMetaTypeId()) { + const auto signature = data->value(); + const auto first = d->mParts.first(); + int i = d->getPos(signature); + + if (i > 1) { + const auto sig = first->signatures().at(i-1); + return createIndex(0, 0, d->getVar(sig).data()); + } + + return QModelIndex(); + } else if (data->userType() == qMetaTypeId()) { + const auto encryption = data->value(); + const auto first = d->mParts.first(); + int i = d->getPos(encryption); + + if (i > 1) { + const auto enc = first->encryptions().at(i-1); + return createIndex(0, 0, d->getVar(enc).data()); + } + + if (first->signatures().size() > 0) { + const int row = first->signatures().size() - 1; + const auto sig = first->signatures().at(row); + return createIndex(0, 0, d->getVar(sig).data()); + } else { + return QModelIndex(); + } + } else if (data->userType() == qMetaTypeId()) { + const auto first = d->mParts.first(); + if (first->encryptions().size() > 0) { + const int row = first->encryptions().size() - 1; + const auto enc = first->encryptions().at(row); + auto var = new QVariant(); + var->setValue(enc.get()); + return createIndex(0, 0, d->getVar(enc).data()); + } + if (first->signatures().size() > 0) { + const int row = first->signatures().size() - 1; + const auto sig = first->signatures().at(row); + return createIndex(0, 0, d->getVar(sig).data()); + } + return QModelIndex(); + } return QModelIndex(); } int NewModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) { - return mParts.size(); + const auto first = d->mParts.first(); + if (first->signatures().size() > 0) { + return 1; + } else if (first->encryptions().size() > 0) { + return 1; + } else { + return d->mParts.size(); + } + } else { + if (!parent.internalPointer()) { + return 0; + } + const auto data = static_cast(parent.internalPointer()); + if (data->userType() == qMetaTypeId()) { + const auto signature = data->value(); + const auto first = d->mParts.first(); + int i = d->getPos(signature); + + if (i+1 < first->signatures().size()) { + return 1; + } + + if (first->encryptions().size() > 0) { + return 1; + } + + return d->mParts.size(); + } else if (data->userType() == qMetaTypeId()) { + const auto encryption = data->value(); + const auto first = d->mParts.first(); + int i = d->getPos(encryption); + + if (i+1 < first->encryptions().size()) { + return 1; + } + + return d->mParts.size(); + } } return 0; } -- cgit v1.2.3 From 6db3df1d512866da62241107aeebd27bd4e83237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Tue, 18 Oct 2016 17:45:06 +0200 Subject: add content level --- framework/domain/messageparser_new.cpp | 71 +++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) (limited to 'framework/domain/messageparser_new.cpp') diff --git a/framework/domain/messageparser_new.cpp b/framework/domain/messageparser_new.cpp index ffe7550f..44cd6b6b 100644 --- a/framework/domain/messageparser_new.cpp +++ b/framework/domain/messageparser_new.cpp @@ -34,10 +34,14 @@ public: QSharedPointer getVar(const std::shared_ptr &sig); QSharedPointer getVar(const std::shared_ptr &enc); QSharedPointer getVar(const std::shared_ptr &part); + QSharedPointer getVar(Part *part); + QSharedPointer getVar(const std::shared_ptr &content); + QSharedPointer getVar(Content *content); int getPos(Signature *sig); int getPos(Encryption *enc); int getPos(Part *part); + int getPos(Content *content); NewModel *q; QVector mParts; @@ -47,7 +51,8 @@ public: private: QMap, QSharedPointer> mSignatureMap; QMap, QSharedPointer> mEncryptionMap; - QMap, QSharedPointer> mPartMap; + QMap> mPartMap; + QMap> mCMap; }; NewModelPrivate::NewModelPrivate(NewModel *q_ptr, const std::shared_ptr &parser) @@ -80,16 +85,37 @@ QSharedPointer NewModelPrivate::getVar(const std::shared_ptr NewModelPrivate::getVar(const std::shared_ptr &part) +{ + return getVar(part.get()); +} + +QSharedPointer NewModelPrivate::getVar(Part *part) { if (!mPartMap.contains(part)) { auto var = new QVariant(); - var->setValue(part.get()); + var->setValue(part); mPartMap.insert(part, QSharedPointer(var)); } return mPartMap.value(part); } +QSharedPointer NewModelPrivate::getVar(const std::shared_ptr &content) +{ + return getVar(content.get()); +} + +QSharedPointer NewModelPrivate::getVar(Content *content) +{ + if (!mCMap.contains(content)) { + auto var = new QVariant(); + var->setValue(content); + mCMap.insert(content, QSharedPointer(var)); + } + return mCMap.value(content); +} + int NewModelPrivate::getPos(Signature *signature) { const auto first = mParts.first(); @@ -129,6 +155,18 @@ int NewModelPrivate::getPos(Part *part) return i; } +int NewModelPrivate::getPos(Content *content) +{ + int i = 0; + foreach(const auto &c, content->parent()->content()) { + if (c.get() == content) { + break; + } + i++; + } + return i; +} + NewModel::NewModel(std::shared_ptr parser) : d(std::unique_ptr(new NewModelPrivate(this, parser))) { @@ -198,6 +236,13 @@ QModelIndex NewModel::index(int row, int column, const QModelIndex &parent) cons } else if (data->userType() == qMetaTypeId()) { const auto encryption = data->value(); encpos = d->getPos(encryption) + 1; + } else if (data->userType() == qMetaTypeId()) { + const auto part = data->value(); + if (row < part->content().size()) { + auto c = part->content().at(row); + return createIndex(row, column, d->getVar(c).data()); + } + return QModelIndex(); } if (encpos > -1 && encpos < first->encryptions().size()) { @@ -258,6 +303,14 @@ QVariant NewModel::data(const QModelIndex &index, int role) const case ContentsRole: return QVariant::fromValue(d->mContentMap.value(part).get()); } + } else if (data->userType() == qMetaTypeId()) { + const auto content = data->value(); + int i = d->getPos(content); + switch(role) { + case Qt::DisplayRole: + case TypeRole: + return QStringLiteral("Content%1").arg(i); + } } } return QVariant(); @@ -312,6 +365,17 @@ QModelIndex NewModel::parent(const QModelIndex &index) const return createIndex(0, 0, d->getVar(sig).data()); } return QModelIndex(); + } else if (data->userType() == qMetaTypeId()) { + const auto content = data->value(); + const auto parent = content->parent(); + if (!parent) { + return QModelIndex(); + } + int pos = d->getPos(parent); + if (pos < 0 || pos >= d->mParts.size()) { + return QModelIndex(); + } + return createIndex(pos, 0, d->getVar(parent).data()); } return QModelIndex(); } @@ -356,6 +420,9 @@ int NewModel::rowCount(const QModelIndex &parent) const } return d->mParts.size(); + } else if (data->userType() == qMetaTypeId()) { + const auto part = data->value(); + return part->content().size(); } } return 0; -- cgit v1.2.3 From 2e83f97afb05d6475bc39375400e7846bd77bdff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Tue, 18 Oct 2016 19:00:23 +0200 Subject: create Tree beforehand --- framework/domain/messageparser_new.cpp | 292 +++++++++++++++------------------ 1 file changed, 132 insertions(+), 160 deletions(-) (limited to 'framework/domain/messageparser_new.cpp') diff --git a/framework/domain/messageparser_new.cpp b/framework/domain/messageparser_new.cpp index 44cd6b6b..2a3b68e9 100644 --- a/framework/domain/messageparser_new.cpp +++ b/framework/domain/messageparser_new.cpp @@ -26,11 +26,54 @@ Q_DECLARE_METATYPE(Content *) Q_DECLARE_METATYPE(Signature *) Q_DECLARE_METATYPE(Encryption *) +class Entry +{ +public: + ~Entry() + { + foreach(auto child, mChildren) { + delete child; + } + mChildren.clear(); + } + + void addChild(Entry *entry) + { + mChildren.append(entry); + entry->mParent = this; + } + + int pos() + { + if(!mParent) { + return -1; + } + int i=0; + foreach(const auto &child, mParent->mChildren) { + if (child == this) { + return i; + } + i++; + } + return -1; + } + + QSharedPointer mData; + + Entry *mParent; + QVector mChildren; +}; + class NewModelPrivate { public: NewModelPrivate(NewModel *q_ptr, const std::shared_ptr &parser); - + + void createTree(); + Entry *addSignatures(Entry *parent, QVector signatures); + Entry *addEncryptions(Entry *parent, QVector encryptions); + Entry *addPart(Entry *parent, Part *part); + QSharedPointer getVar(const std::shared_ptr &sig); QSharedPointer getVar(const std::shared_ptr &enc); QSharedPointer getVar(const std::shared_ptr &part); @@ -45,6 +88,7 @@ public: NewModel *q; QVector mParts; + Entry *mRoot; std::shared_ptr mParser; QMap> mContentMap; @@ -63,6 +107,79 @@ NewModelPrivate::NewModelPrivate(NewModel *q_ptr, const std::shared_ptr foreach(const auto &part, mParts) { mContentMap.insert(part.get(), std::shared_ptr(new NewContentModel(part, mParser))); } + createTree(); +} + +Entry * NewModelPrivate::addSignatures(Entry *parent, QVector signatures) +{ + auto ret = parent; + foreach(const auto &sig, signatures) { + auto entry = new Entry(); + entry->mData = getVar(sig); + ret = entry; + parent->addChild(entry); + } + return ret; +} + +Entry * NewModelPrivate::addEncryptions(Entry *parent, QVector encryptions) +{ + auto ret = parent; + foreach(const auto &enc, encryptions) { + auto entry = new Entry(); + entry->mData = getVar(enc); + parent->addChild(entry); + ret = entry; + } + return ret; +} + +Entry * NewModelPrivate::addPart(Entry *parent, Part *part) +{ + auto entry = new Entry(); + entry->mData = getVar(part); + parent->addChild(entry); + + foreach(const auto &content, part->content()) { + auto _entry = entry; + _entry = addSignatures(_entry, content->signatures().mid(part->signatures().size())); + _entry = addEncryptions(_entry, content->encryptions().mid(part->encryptions().size())); + auto c = new Entry(); + c->mData = getVar(content); + _entry->addChild(c); + } + + foreach(const auto &sp, part->subParts()) { + auto _entry = entry; + _entry = addSignatures(_entry, sp->signatures().mid(part->signatures().size())); + _entry = addEncryptions(_entry, sp->encryptions().mid(part->encryptions().size())); + addPart(_entry, sp.get()); + } + return entry; +} + +void NewModelPrivate::createTree() +{ + mRoot = new Entry(); + auto parent = mRoot; + Part *pPart = nullptr; + QVector signatures; + QVector encryptions; + foreach(const auto part, mParts) { + auto _parent = parent; + if (pPart != part->parent()) { + auto _parent = mRoot; + _parent = addSignatures(_parent, part->parent()->signatures()); + _parent = addEncryptions(_parent, part->parent()->encryptions()); + signatures = part->parent()->signatures(); + encryptions = part->parent()->encryptions(); + parent = _parent; + pPart = part->parent(); + } + _parent = addSignatures(_parent, part->signatures().mid(signatures.size())); + _parent = addEncryptions(_parent, part->encryptions().mid(encryptions.size())); + addPart(_parent, part.get()); + } } QSharedPointer NewModelPrivate::getVar(const std::shared_ptr &sig) @@ -192,73 +309,13 @@ QModelIndex NewModel::index(int row, int column, const QModelIndex &parent) cons if (row < 0 || column != 0) { return QModelIndex(); } - if (!parent.isValid()) { - const auto first = d->mParts.first(); - if (first->signatures().size() > 0) { - if (row == 0) { - const auto sig = first->signatures().at(row); - return createIndex(row, column, d->getVar(sig).data()); - } - } else if (first->encryptions().size() > 0) { - if (row == 0) { - const auto enc = first->encryptions().at(row); - return createIndex(row, column, d->getVar(enc).data()); - } - } else { - if (row < d->mParts.size()) { - auto part = d->mParts.at(row); - return createIndex(row, column, d->getVar(part).data()); - } - } - } else { - if (!parent.internalPointer()) { - return QModelIndex(); - } - const auto data = static_cast(parent.internalPointer()); - const auto first = d->mParts.first(); - int encpos = -1; - int partpos = -1; - if (data->userType() == qMetaTypeId()) { - const auto signature = data->value(); - int i = d->getPos(signature); - - if (i+1 < first->signatures().size()) { - if (row != 0) { - return QModelIndex(); - } - const auto sig = first->signatures().at(i+1); - return createIndex(0,0, d->getVar(sig).data()); - } - - if (first->encryptions().size() > 0) { - encpos = 0; - } - } else if (data->userType() == qMetaTypeId()) { - const auto encryption = data->value(); - encpos = d->getPos(encryption) + 1; - } else if (data->userType() == qMetaTypeId()) { - const auto part = data->value(); - if (row < part->content().size()) { - auto c = part->content().at(row); - return createIndex(row, column, d->getVar(c).data()); - } - return QModelIndex(); - } - - if (encpos > -1 && encpos < first->encryptions().size()) { - if (row != 0) { - return QModelIndex(); - } - const auto enc = first->encryptions().at(encpos); - return createIndex(0,0, d->getVar(enc).data()); - } + Entry *entry = d->mRoot; + if (parent.isValid()) { + entry = static_cast(parent.internalPointer()); + } - if (row < d->mParts.size()) { - auto part = d->mParts.at(row); - auto var = new QVariant(); - var->setValue(part.get()); - return createIndex(row, column, d->getVar(part).data()); - } + if (row < entry->mChildren.size()) { + return createIndex(row, column, entry->mChildren.at(row)); } return QModelIndex(); } @@ -272,7 +329,8 @@ QVariant NewModel::data(const QModelIndex &index, int role) const return QVariant(); } if (index.internalPointer()) { - const auto data = static_cast(index.internalPointer()); + const auto entry = static_cast(index.internalPointer()); + const auto data = entry->mData; if (data->userType() == qMetaTypeId()) { const auto signature = data->value(); int i = d->getPos(signature); @@ -321,61 +379,9 @@ QModelIndex NewModel::parent(const QModelIndex &index) const if (!index.internalPointer()) { return QModelIndex(); } - const auto data = static_cast(index.internalPointer()); - if (data->userType() == qMetaTypeId()) { - const auto signature = data->value(); - const auto first = d->mParts.first(); - int i = d->getPos(signature); - - if (i > 1) { - const auto sig = first->signatures().at(i-1); - return createIndex(0, 0, d->getVar(sig).data()); - } - - return QModelIndex(); - } else if (data->userType() == qMetaTypeId()) { - const auto encryption = data->value(); - const auto first = d->mParts.first(); - int i = d->getPos(encryption); - - if (i > 1) { - const auto enc = first->encryptions().at(i-1); - return createIndex(0, 0, d->getVar(enc).data()); - } - - if (first->signatures().size() > 0) { - const int row = first->signatures().size() - 1; - const auto sig = first->signatures().at(row); - return createIndex(0, 0, d->getVar(sig).data()); - } else { - return QModelIndex(); - } - } else if (data->userType() == qMetaTypeId()) { - const auto first = d->mParts.first(); - if (first->encryptions().size() > 0) { - const int row = first->encryptions().size() - 1; - const auto enc = first->encryptions().at(row); - auto var = new QVariant(); - var->setValue(enc.get()); - return createIndex(0, 0, d->getVar(enc).data()); - } - if (first->signatures().size() > 0) { - const int row = first->signatures().size() - 1; - const auto sig = first->signatures().at(row); - return createIndex(0, 0, d->getVar(sig).data()); - } - return QModelIndex(); - } else if (data->userType() == qMetaTypeId()) { - const auto content = data->value(); - const auto parent = content->parent(); - if (!parent) { - return QModelIndex(); - } - int pos = d->getPos(parent); - if (pos < 0 || pos >= d->mParts.size()) { - return QModelIndex(); - } - return createIndex(pos, 0, d->getVar(parent).data()); + const auto entry = static_cast(index.internalPointer()); + if (entry->mParent) { + return createIndex(entry->pos(), 0, entry->mParent); } return QModelIndex(); } @@ -383,47 +389,13 @@ QModelIndex NewModel::parent(const QModelIndex &index) const int NewModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) { - const auto first = d->mParts.first(); - if (first->signatures().size() > 0) { - return 1; - } else if (first->encryptions().size() > 0) { - return 1; - } else { - return d->mParts.size(); - } + return d->mRoot->mChildren.size(); } else { if (!parent.internalPointer()) { return 0; } - const auto data = static_cast(parent.internalPointer()); - if (data->userType() == qMetaTypeId()) { - const auto signature = data->value(); - const auto first = d->mParts.first(); - int i = d->getPos(signature); - - if (i+1 < first->signatures().size()) { - return 1; - } - - if (first->encryptions().size() > 0) { - return 1; - } - - return d->mParts.size(); - } else if (data->userType() == qMetaTypeId()) { - const auto encryption = data->value(); - const auto first = d->mParts.first(); - int i = d->getPos(encryption); - - if (i+1 < first->encryptions().size()) { - return 1; - } - - return d->mParts.size(); - } else if (data->userType() == qMetaTypeId()) { - const auto part = data->value(); - return part->content().size(); - } + const auto entry = static_cast(parent.internalPointer()); + return entry->mChildren.size(); } return 0; } -- cgit v1.2.3 From be38c2ebaa77b116028cbe34f777e3d8e5cbc776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Tue, 18 Oct 2016 20:33:00 +0200 Subject: output content from content item --- framework/domain/messageparser_new.cpp | 57 ++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 13 deletions(-) (limited to 'framework/domain/messageparser_new.cpp') diff --git a/framework/domain/messageparser_new.cpp b/framework/domain/messageparser_new.cpp index 2a3b68e9..db4b36c5 100644 --- a/framework/domain/messageparser_new.cpp +++ b/framework/domain/messageparser_new.cpp @@ -298,6 +298,7 @@ QHash NewModel::roleNames() const QHash roles; roles[TypeRole] = "type"; roles[ContentsRole] = "contents"; + roles[ContentRole] = "content"; roles[IsEmbededRole] = "embeded"; roles[SecurityLevelRole] = "securityLevel"; return roles; @@ -330,26 +331,27 @@ QVariant NewModel::data(const QModelIndex &index, int role) const } if (index.internalPointer()) { const auto entry = static_cast(index.internalPointer()); - const auto data = entry->mData; - if (data->userType() == qMetaTypeId()) { - const auto signature = data->value(); + const auto _data = entry->mData; + if (_data->userType() == qMetaTypeId()) { + const auto signature = _data->value(); int i = d->getPos(signature); switch(role) { case Qt::DisplayRole: - case TypeRole: return QStringLiteral("Signature%1").arg(i); + case TypeRole: + return QStringLiteral("Signature"); } - } else if (data->userType() == qMetaTypeId()) { - const auto first = d->mParts.first(); - const auto encryption = data->value(); + } else if (_data->userType() == qMetaTypeId()) { + const auto encryption = _data->value(); int i = d->getPos(encryption); switch(role) { case Qt::DisplayRole: - case TypeRole: return QStringLiteral("Encryption%1").arg(i); + case TypeRole: + return QStringLiteral("Encryption"); } - } else if (data->userType() == qMetaTypeId()) { - const auto part = data->value(); + } else if (_data->userType() == qMetaTypeId()) { + const auto part = _data->value(); switch (role) { case Qt::DisplayRole: case TypeRole: @@ -361,13 +363,42 @@ QVariant NewModel::data(const QModelIndex &index, int role) const case ContentsRole: return QVariant::fromValue(d->mContentMap.value(part).get()); } - } else if (data->userType() == qMetaTypeId()) { - const auto content = data->value(); + } else if (_data->userType() == qMetaTypeId()) { + const auto content = _data->value(); int i = d->getPos(content); switch(role) { case Qt::DisplayRole: - case TypeRole: return QStringLiteral("Content%1").arg(i); + case TypeRole: + return QString::fromLatin1(content->type()); + case IsEmbededRole: + return false; + case ContentRole: { + auto text = content->encodedContent(); + if (data(index, TypeRole).toString() == "HtmlContent") { + const auto rx = QRegExp("(src)\\s*=\\s*(\"|')(cid:[^\"']+)\\2"); + int pos = 0; + while ((pos = rx.indexIn(text, pos)) != -1) { + const auto link = QUrl(rx.cap(3).toUtf8()); + pos += rx.matchedLength(); + const auto repl = d->mParser->getPart(link); + if (!repl) { + continue; + } + const auto content = repl->content(); + if(content.size() < 1) { + continue; + } + const auto mailMime = content.first()->mailMime(); + const auto mimetype = mailMime->mimetype().name(); + if (mimetype.startsWith("image/")) { + const auto data = content.first()->content(); + text.replace(rx.cap(0), QString("src=\"data:%1;base64,%2\"").arg(mimetype, QString::fromLatin1(data.toBase64()))); + } + } + } + return text; + } } } } -- cgit v1.2.3 From d2fa9b2f152e223ec31dc2812ebbfaf109549939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Wed, 19 Oct 2016 14:28:48 +0200 Subject: swtch encryption and sign creation --- framework/domain/messageparser_new.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'framework/domain/messageparser_new.cpp') diff --git a/framework/domain/messageparser_new.cpp b/framework/domain/messageparser_new.cpp index db4b36c5..da5ab2e7 100644 --- a/framework/domain/messageparser_new.cpp +++ b/framework/domain/messageparser_new.cpp @@ -142,8 +142,8 @@ Entry * NewModelPrivate::addPart(Entry *parent, Part *part) foreach(const auto &content, part->content()) { auto _entry = entry; - _entry = addSignatures(_entry, content->signatures().mid(part->signatures().size())); _entry = addEncryptions(_entry, content->encryptions().mid(part->encryptions().size())); + _entry = addSignatures(_entry, content->signatures().mid(part->signatures().size())); auto c = new Entry(); c->mData = getVar(content); _entry->addChild(c); @@ -151,8 +151,8 @@ Entry * NewModelPrivate::addPart(Entry *parent, Part *part) foreach(const auto &sp, part->subParts()) { auto _entry = entry; - _entry = addSignatures(_entry, sp->signatures().mid(part->signatures().size())); _entry = addEncryptions(_entry, sp->encryptions().mid(part->encryptions().size())); + _entry = addSignatures(_entry, sp->signatures().mid(part->signatures().size())); addPart(_entry, sp.get()); } return entry; @@ -169,15 +169,15 @@ void NewModelPrivate::createTree() auto _parent = parent; if (pPart != part->parent()) { auto _parent = mRoot; - _parent = addSignatures(_parent, part->parent()->signatures()); _parent = addEncryptions(_parent, part->parent()->encryptions()); + _parent = addSignatures(_parent, part->parent()->signatures()); signatures = part->parent()->signatures(); encryptions = part->parent()->encryptions(); parent = _parent; pPart = part->parent(); } - _parent = addSignatures(_parent, part->signatures().mid(signatures.size())); _parent = addEncryptions(_parent, part->encryptions().mid(encryptions.size())); + _parent = addSignatures(_parent, part->signatures().mid(signatures.size())); addPart(_parent, part.get()); } } @@ -340,6 +340,8 @@ QVariant NewModel::data(const QModelIndex &index, int role) const return QStringLiteral("Signature%1").arg(i); case TypeRole: return QStringLiteral("Signature"); + case SecurityLevelRole: + return QStringLiteral("RED"); } } else if (_data->userType() == qMetaTypeId()) { const auto encryption = _data->value(); @@ -349,6 +351,8 @@ QVariant NewModel::data(const QModelIndex &index, int role) const return QStringLiteral("Encryption%1").arg(i); case TypeRole: return QStringLiteral("Encryption"); + case SecurityLevelRole: + return QStringLiteral("GREEN"); } } else if (_data->userType() == qMetaTypeId()) { const auto part = _data->value(); @@ -358,8 +362,6 @@ QVariant NewModel::data(const QModelIndex &index, int role) const return QString::fromLatin1(part->type()); case IsEmbededRole: return index.parent().isValid(); - case SecurityLevelRole: - return QStringLiteral("GRAY"); case ContentsRole: return QVariant::fromValue(d->mContentMap.value(part).get()); } -- cgit v1.2.3 From 17a926c2697143937b0c1700b1d1e8081f727059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Wed, 19 Oct 2016 15:22:31 +0200 Subject: delete useless NewContentModel --- framework/domain/messageparser_new.cpp | 153 +++++++++------------------------ 1 file changed, 43 insertions(+), 110 deletions(-) (limited to 'framework/domain/messageparser_new.cpp') diff --git a/framework/domain/messageparser_new.cpp b/framework/domain/messageparser_new.cpp index da5ab2e7..57f8172f 100644 --- a/framework/domain/messageparser_new.cpp +++ b/framework/domain/messageparser_new.cpp @@ -29,6 +29,11 @@ Q_DECLARE_METATYPE(Encryption *) class Entry { public: + Entry() + : mParent(nullptr) + { + } + ~Entry() { foreach(auto child, mChildren) { @@ -36,7 +41,7 @@ public: } mChildren.clear(); } - + void addChild(Entry *entry) { mChildren.append(entry); @@ -68,6 +73,7 @@ class NewModelPrivate { public: NewModelPrivate(NewModel *q_ptr, const std::shared_ptr &parser); + ~NewModelPrivate(); void createTree(); Entry *addSignatures(Entry *parent, QVector signatures); @@ -88,10 +94,9 @@ public: NewModel *q; QVector mParts; - Entry *mRoot; + std::unique_ptr mRoot; std::shared_ptr mParser; - QMap> mContentMap; private: QMap, QSharedPointer> mSignatureMap; QMap, QSharedPointer> mEncryptionMap; @@ -101,16 +106,18 @@ private: NewModelPrivate::NewModelPrivate(NewModel *q_ptr, const std::shared_ptr &parser) : q(q_ptr) + , mRoot(std::unique_ptr(new Entry)) , mParser(parser) { mParts = mParser->collectContentParts(); - foreach(const auto &part, mParts) { - mContentMap.insert(part.get(), std::shared_ptr(new NewContentModel(part, mParser))); - } createTree(); } -Entry * NewModelPrivate::addSignatures(Entry *parent, QVector signatures) +NewModelPrivate::~NewModelPrivate() +{ +} + +Entry *NewModelPrivate::addSignatures(Entry *parent, QVector signatures) { auto ret = parent; foreach(const auto &sig, signatures) { @@ -160,15 +167,15 @@ Entry * NewModelPrivate::addPart(Entry *parent, Part *part) void NewModelPrivate::createTree() { - mRoot = new Entry(); - auto parent = mRoot; + auto root = mRoot.get(); + auto parent = root; Part *pPart = nullptr; QVector signatures; QVector encryptions; foreach(const auto part, mParts) { auto _parent = parent; if (pPart != part->parent()) { - auto _parent = mRoot; + auto _parent = root; _parent = addEncryptions(_parent, part->parent()->encryptions()); _parent = addSignatures(_parent, part->parent()->signatures()); signatures = part->parent()->signatures(); @@ -202,7 +209,6 @@ QSharedPointer NewModelPrivate::getVar(const std::shared_ptr NewModelPrivate::getVar(const std::shared_ptr &part) { return getVar(part.get()); @@ -259,7 +265,6 @@ int NewModelPrivate::getPos(Encryption *encryption) return i; } - int NewModelPrivate::getPos(Part *part) { int i = 0; @@ -297,20 +302,18 @@ QHash NewModel::roleNames() const { QHash roles; roles[TypeRole] = "type"; - roles[ContentsRole] = "contents"; roles[ContentRole] = "content"; roles[IsEmbededRole] = "embeded"; roles[SecurityLevelRole] = "securityLevel"; return roles; } - QModelIndex NewModel::index(int row, int column, const QModelIndex &parent) const { if (row < 0 || column != 0) { return QModelIndex(); } - Entry *entry = d->mRoot; + Entry *entry = d->mRoot.get(); if (parent.isValid()) { entry = static_cast(parent.internalPointer()); } @@ -324,14 +327,27 @@ QModelIndex NewModel::index(int row, int column, const QModelIndex &parent) cons QVariant NewModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) { - if (role == Qt::DisplayRole) { + switch (role) { + case Qt::DisplayRole: return QString("root"); + case IsEmbededRole: + return false; } return QVariant(); } + if (index.internalPointer()) { const auto entry = static_cast(index.internalPointer()); const auto _data = entry->mData; + if (entry == d->mRoot.get()|| !_data) { + switch (role) { + case Qt::DisplayRole: + return QString("root"); + case IsEmbededRole: + return false; + } + return QVariant(); + } if (_data->userType() == qMetaTypeId()) { const auto signature = _data->value(); int i = d->getPos(signature); @@ -342,6 +358,8 @@ QVariant NewModel::data(const QModelIndex &index, int role) const return QStringLiteral("Signature"); case SecurityLevelRole: return QStringLiteral("RED"); + case IsEmbededRole: + return data(index.parent(), IsEmbededRole); } } else if (_data->userType() == qMetaTypeId()) { const auto encryption = _data->value(); @@ -353,17 +371,17 @@ QVariant NewModel::data(const QModelIndex &index, int role) const return QStringLiteral("Encryption"); case SecurityLevelRole: return QStringLiteral("GREEN"); + case IsEmbededRole: + return data(index.parent(), IsEmbededRole); } } else if (_data->userType() == qMetaTypeId()) { const auto part = _data->value(); switch (role) { - case Qt::DisplayRole: - case TypeRole: - return QString::fromLatin1(part->type()); - case IsEmbededRole: - return index.parent().isValid(); - case ContentsRole: - return QVariant::fromValue(d->mContentMap.value(part).get()); + case Qt::DisplayRole: + case TypeRole: + return QString::fromLatin1(part->type()); + case IsEmbededRole: + return data(index.parent(), IsEmbededRole); } } else if (_data->userType() == qMetaTypeId()) { const auto content = _data->value(); @@ -374,7 +392,7 @@ QVariant NewModel::data(const QModelIndex &index, int role) const case TypeRole: return QString::fromLatin1(content->type()); case IsEmbededRole: - return false; + return data(index.parent(), IsEmbededRole); case ContentRole: { auto text = content->encodedContent(); if (data(index, TypeRole).toString() == "HtmlContent") { @@ -413,7 +431,7 @@ QModelIndex NewModel::parent(const QModelIndex &index) const return QModelIndex(); } const auto entry = static_cast(index.internalPointer()); - if (entry->mParent) { + if (entry->mParent && entry->mParent != d->mRoot.get()) { return createIndex(entry->pos(), 0, entry->mParent); } return QModelIndex(); @@ -437,88 +455,3 @@ int NewModel::columnCount(const QModelIndex &parent) const { return 1; } - -NewContentModel::NewContentModel(const Part::Ptr &part, const std::shared_ptr &parser) - : mPart(part) - , mParser(parser) -{ -} - -QHash NewContentModel::roleNames() const -{ - QHash roles; - roles[TypeRole] = "type"; - roles[ContentRole] = "content"; - roles[IsEmbededRole] = "embeded"; - roles[SecurityLevelRole] = "securityLevel"; - return roles; -} - -QModelIndex NewContentModel::index(int row, int column, const QModelIndex &parent) const -{ - if (!parent.isValid()) { - if (row < mPart->content().size()) { - auto part = mPart->content().at(row); - return createIndex(row, column, part.get()); - } - } - return QModelIndex(); -} - -QVariant NewContentModel::data(const QModelIndex &index, int role) const -{ - auto content = static_cast(index.internalPointer()); - switch (role) { - case TypeRole: - return QString::fromLatin1(content->type()); - case IsEmbededRole: - return false; - case ContentRole: { - auto text = content->encodedContent(); - if (data(index, TypeRole).toString() == "HtmlContent") { - const auto rx = QRegExp("(src)\\s*=\\s*(\"|')(cid:[^\"']+)\\2"); - int pos = 0; - while ((pos = rx.indexIn(text, pos)) != -1) { - const auto link = QUrl(rx.cap(3).toUtf8()); - pos += rx.matchedLength(); - const auto repl = mParser->getPart(link); - if (!repl) { - continue; - } - const auto content = repl->content(); - if(content.size() < 1) { - continue; - } - const auto mailMime = content.first()->mailMime(); - const auto mimetype = mailMime->mimetype().name(); - if (mimetype.startsWith("image/")) { - const auto data = content.first()->content(); - text.replace(rx.cap(0), QString("src=\"data:%1;base64,%2\"").arg(mimetype, QString::fromLatin1(data.toBase64()))); - } - } - } - return text; - } - case SecurityLevelRole: - return content->encryptions().size() > mPart->encryptions().size() ? "red": "black"; //test for gpg inline - } - return QVariant(); -} - -QModelIndex NewContentModel::parent(const QModelIndex &index) const -{ - return QModelIndex(); -} - -int NewContentModel::rowCount(const QModelIndex &parent) const -{ - if (!parent.isValid()) { - return mPart->content().size(); - } - return 0; -} - -int NewContentModel::columnCount(const QModelIndex &parent) const -{ - return 1; -} -- cgit v1.2.3 From a93a649f34ffa794884019e05c57869bd3bd4672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Knau=C3=9F?= Date: Wed, 19 Oct 2016 15:40:25 +0200 Subject: Move addSignatures/addEncryptions/addPart to Entry class --- framework/domain/messageparser_new.cpp | 178 ++++++++++++++++----------------- 1 file changed, 89 insertions(+), 89 deletions(-) (limited to 'framework/domain/messageparser_new.cpp') diff --git a/framework/domain/messageparser_new.cpp b/framework/domain/messageparser_new.cpp index 57f8172f..b930f33d 100644 --- a/framework/domain/messageparser_new.cpp +++ b/framework/domain/messageparser_new.cpp @@ -26,11 +26,46 @@ Q_DECLARE_METATYPE(Content *) Q_DECLARE_METATYPE(Signature *) Q_DECLARE_METATYPE(Encryption *) +class Entry; + +class NewModelPrivate +{ +public: + NewModelPrivate(NewModel *q_ptr, const std::shared_ptr &parser); + ~NewModelPrivate(); + + void createTree(); + + QSharedPointer getVar(const std::shared_ptr &sig); + QSharedPointer getVar(const std::shared_ptr &enc); + QSharedPointer getVar(const std::shared_ptr &part); + QSharedPointer getVar(Part *part); + QSharedPointer getVar(const std::shared_ptr &content); + QSharedPointer getVar(Content *content); + + int getPos(Signature *sig); + int getPos(Encryption *enc); + int getPos(Part *part); + int getPos(Content *content); + + NewModel *q; + QVector mParts; + std::unique_ptr mRoot; + + std::shared_ptr mParser; +private: + QMap, QSharedPointer> mSignatureMap; + QMap, QSharedPointer> mEncryptionMap; + QMap> mPartMap; + QMap> mCMap; +}; + class Entry { public: - Entry() + Entry(NewModelPrivate *model) : mParent(nullptr) + , mNewModelPrivate(model) { } @@ -48,6 +83,52 @@ public: entry->mParent = this; } + Entry *addSignatures(QVector signatures) + { + auto ret = this; + foreach(const auto &sig, signatures) { + auto entry = new Entry(mNewModelPrivate); + entry->mData = mNewModelPrivate->getVar(sig); + ret->addChild(entry); + ret = entry; + } + return ret; + } + + Entry *addEncryptions(QVector encryptions) + { + auto ret = this; + foreach(const auto &enc, encryptions) { + auto entry = new Entry(mNewModelPrivate); + entry->mData = mNewModelPrivate->getVar(enc); + ret->addChild(entry); + ret = entry; + } + return ret; + } + + Entry *addPart(Part *part) + { + auto entry = new Entry(mNewModelPrivate); + entry->mData = mNewModelPrivate->getVar(part); + addChild(entry); + foreach(const auto &content, part->content()) { + auto _entry = entry; + _entry = _entry->addEncryptions(content->encryptions().mid(part->encryptions().size())); + _entry = _entry->addSignatures(content->signatures().mid(part->signatures().size())); + auto c = new Entry(mNewModelPrivate); + c->mData = mNewModelPrivate->getVar(content); + _entry->addChild(c); + } + foreach(const auto &sp, part->subParts()) { + auto _entry = entry; + _entry = _entry->addEncryptions(sp->encryptions().mid(part->encryptions().size())); + _entry = _entry->addSignatures(sp->signatures().mid(part->signatures().size())); + _entry->addPart(sp.get()); + } + return entry; + } + int pos() { if(!mParent) { @@ -67,46 +148,13 @@ public: Entry *mParent; QVector mChildren; + NewModelPrivate *mNewModelPrivate; }; -class NewModelPrivate -{ -public: - NewModelPrivate(NewModel *q_ptr, const std::shared_ptr &parser); - ~NewModelPrivate(); - - void createTree(); - Entry *addSignatures(Entry *parent, QVector signatures); - Entry *addEncryptions(Entry *parent, QVector encryptions); - Entry *addPart(Entry *parent, Part *part); - - QSharedPointer getVar(const std::shared_ptr &sig); - QSharedPointer getVar(const std::shared_ptr &enc); - QSharedPointer getVar(const std::shared_ptr &part); - QSharedPointer getVar(Part *part); - QSharedPointer getVar(const std::shared_ptr &content); - QSharedPointer getVar(Content *content); - - int getPos(Signature *sig); - int getPos(Encryption *enc); - int getPos(Part *part); - int getPos(Content *content); - - NewModel *q; - QVector mParts; - std::unique_ptr mRoot; - - std::shared_ptr mParser; -private: - QMap, QSharedPointer> mSignatureMap; - QMap, QSharedPointer> mEncryptionMap; - QMap> mPartMap; - QMap> mCMap; -}; NewModelPrivate::NewModelPrivate(NewModel *q_ptr, const std::shared_ptr &parser) : q(q_ptr) - , mRoot(std::unique_ptr(new Entry)) + , mRoot(std::unique_ptr(new Entry(this))) , mParser(parser) { mParts = mParser->collectContentParts(); @@ -117,54 +165,6 @@ NewModelPrivate::~NewModelPrivate() { } -Entry *NewModelPrivate::addSignatures(Entry *parent, QVector signatures) -{ - auto ret = parent; - foreach(const auto &sig, signatures) { - auto entry = new Entry(); - entry->mData = getVar(sig); - ret = entry; - parent->addChild(entry); - } - return ret; -} - -Entry * NewModelPrivate::addEncryptions(Entry *parent, QVector encryptions) -{ - auto ret = parent; - foreach(const auto &enc, encryptions) { - auto entry = new Entry(); - entry->mData = getVar(enc); - parent->addChild(entry); - ret = entry; - } - return ret; -} - -Entry * NewModelPrivate::addPart(Entry *parent, Part *part) -{ - auto entry = new Entry(); - entry->mData = getVar(part); - parent->addChild(entry); - - foreach(const auto &content, part->content()) { - auto _entry = entry; - _entry = addEncryptions(_entry, content->encryptions().mid(part->encryptions().size())); - _entry = addSignatures(_entry, content->signatures().mid(part->signatures().size())); - auto c = new Entry(); - c->mData = getVar(content); - _entry->addChild(c); - } - - foreach(const auto &sp, part->subParts()) { - auto _entry = entry; - _entry = addEncryptions(_entry, sp->encryptions().mid(part->encryptions().size())); - _entry = addSignatures(_entry, sp->signatures().mid(part->signatures().size())); - addPart(_entry, sp.get()); - } - return entry; -} - void NewModelPrivate::createTree() { auto root = mRoot.get(); @@ -176,16 +176,16 @@ void NewModelPrivate::createTree() auto _parent = parent; if (pPart != part->parent()) { auto _parent = root; - _parent = addEncryptions(_parent, part->parent()->encryptions()); - _parent = addSignatures(_parent, part->parent()->signatures()); + _parent = _parent->addEncryptions(part->parent()->encryptions()); + _parent = _parent->addSignatures(part->parent()->signatures()); signatures = part->parent()->signatures(); encryptions = part->parent()->encryptions(); parent = _parent; pPart = part->parent(); } - _parent = addEncryptions(_parent, part->encryptions().mid(encryptions.size())); - _parent = addSignatures(_parent, part->signatures().mid(signatures.size())); - addPart(_parent, part.get()); + _parent = _parent->addEncryptions(part->encryptions().mid(encryptions.size())); + _parent = _parent->addSignatures(part->signatures().mid(signatures.size())); + _parent->addPart(part.get()); } } -- cgit v1.2.3