File indexing completed on 2024-05-12 05:28:17
0001 // SPDX-FileCopyrightText: 2016 Christian Mollekopf <mollekopf@kolabsys.com> 0002 // SPDX-License-Identifier: LGPL-2.0-or-later 0003 0004 #include "messageparser.h" 0005 0006 #include "../mimetreeparser/objecttreeparser.h" 0007 #include <Akonadi/Item> 0008 #include <Akonadi/ItemFetchJob> 0009 #include <Akonadi/ItemFetchScope> 0010 #include <QElapsedTimer> 0011 0012 #include "async.h" 0013 #include "attachmentmodel.h" 0014 #include "partmodel.h" 0015 0016 class MessagePartPrivate 0017 { 0018 public: 0019 std::shared_ptr<MimeTreeParser::ObjectTreeParser> mParser; 0020 }; 0021 0022 MessageParser::MessageParser(QObject *parent) 0023 : QObject(parent) 0024 , d(std::unique_ptr<MessagePartPrivate>(new MessagePartPrivate)) 0025 { 0026 } 0027 0028 MessageParser::~MessageParser() 0029 { 0030 } 0031 0032 Akonadi::Item MessageParser::item() const 0033 { 0034 return {}; 0035 } 0036 0037 void MessageParser::setItem(const Akonadi::Item &item) 0038 { 0039 auto job = new Akonadi::ItemFetchJob(item); 0040 job->fetchScope().fetchFullPayload(); 0041 connect(job, &Akonadi::ItemFetchJob::result, this, [this](KJob *job) { 0042 auto fetchJob = qobject_cast<Akonadi::ItemFetchJob *>(job); 0043 const auto items = fetchJob->items(); 0044 if (items.count() == 0) { 0045 qWarning() << "Empty fetch job result"; 0046 return; 0047 } 0048 const auto item = items.at(0); 0049 if (item.hasPayload<KMime::Message::Ptr>()) { 0050 const auto message = item.payload<KMime::Message::Ptr>(); 0051 QElapsedTimer time; 0052 time.start(); 0053 auto parser = std::make_shared<MimeTreeParser::ObjectTreeParser>(); 0054 parser->parseObjectTree(message.data()); 0055 qDebug() << "Message parsing took: " << time.elapsed(); 0056 parser->decryptParts(); 0057 qDebug() << "Message parsing and decryption/verification: " << time.elapsed(); 0058 d->mParser = parser; 0059 Q_EMIT htmlChanged(); 0060 } else { 0061 qWarning() << "This is not a mime item."; 0062 } 0063 }); 0064 } 0065 0066 QString MessageParser::rawContent() const 0067 { 0068 return mRawContent; 0069 } 0070 0071 bool MessageParser::loaded() const 0072 { 0073 return bool{d->mParser}; 0074 } 0075 0076 QString MessageParser::structureAsString() const 0077 { 0078 if (!d->mParser) { 0079 return QString(); 0080 } 0081 return d->mParser->structureAsString(); 0082 } 0083 0084 QAbstractItemModel *MessageParser::parts() const 0085 { 0086 if (!d->mParser) { 0087 return nullptr; 0088 } 0089 const auto model = new PartModel(d->mParser); 0090 return model; 0091 } 0092 0093 QAbstractItemModel *MessageParser::attachments() const 0094 { 0095 if (!d->mParser) { 0096 return nullptr; 0097 } 0098 const auto model = new AttachmentModel(d->mParser); 0099 return model; 0100 }