File indexing completed on 2025-02-16 04:50:18

0001 /*
0002     SPDX-FileCopyrightText: 2014 Christian Mollekopf <mollekopf@kolabsys.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 #include "messagehelper.h"
0007 
0008 #include <Akonadi/MessageFlags>
0009 
0010 #include "resourcetask.h"
0011 
0012 #include "imapresource_debug.h"
0013 
0014 MessageHelper::~MessageHelper() = default;
0015 
0016 Akonadi::Item MessageHelper::createItemFromMessage(const KMime::Message::Ptr &message,
0017                                                    const qint64 uid,
0018                                                    const qint64 size,
0019                                                    const QMap<QByteArray, QVariant> &attrs,
0020                                                    const QList<QByteArray> &flags,
0021                                                    const KIMAP::FetchJob::FetchScope &scope,
0022                                                    bool &ok) const
0023 {
0024     Q_UNUSED(attrs)
0025 
0026     Akonadi::Item i;
0027     if (scope.mode == KIMAP::FetchJob::FetchScope::Flags) {
0028         i.setRemoteId(QString::number(uid));
0029         i.setMimeType(KMime::Message::mimeType());
0030         i.setFlags(ResourceTask::toAkonadiFlags(flags));
0031     } else {
0032         if (!message) {
0033             qCWarning(IMAPRESOURCE_LOG) << "Got empty message: " << uid;
0034             ok = false;
0035             return {};
0036         }
0037         // Sometimes messages might not have a body at all
0038         if (message->body().isEmpty() && (scope.mode == KIMAP::FetchJob::FetchScope::Full || scope.mode == KIMAP::FetchJob::FetchScope::Content)) {
0039             // In that case put a space in as body so that it gets cached
0040             // otherwise we'll wrongly believe the body part is missing from the cache
0041             message->setBody(" ");
0042         }
0043         i.setRemoteId(QString::number(uid));
0044         i.setMimeType(KMime::Message::mimeType());
0045         i.setPayload(KMime::Message::Ptr(message));
0046         i.setSize(size);
0047 
0048         Akonadi::MessageFlags::copyMessageFlags(*message, i);
0049         const auto flagsLst = ResourceTask::toAkonadiFlags(flags);
0050         for (const QByteArray &flag : flagsLst) {
0051             i.setFlag(flag);
0052         }
0053     }
0054     ok = true;
0055     return i;
0056 }