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 }