File indexing completed on 2025-03-09 04:54:12

0001 /*
0002    SPDX-FileCopyrightText: 2014-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "attachmentupdatejob.h"
0008 #include "MessageCore/AttachmentFromUrlBaseJob"
0009 #include "attachmentfromurlutils.h"
0010 #include "messagecore_debug.h"
0011 #include <KLocalizedString>
0012 #include <QTimer>
0013 
0014 using namespace MessageCore;
0015 
0016 class Q_DECL_HIDDEN MessageCore::AttachmentUpdateJob::AttachmentUpdateJobPrivate
0017 {
0018 public:
0019     AttachmentUpdateJobPrivate(AttachmentUpdateJob *qq);
0020 
0021     void doStart(); // slot
0022     void loadJobResult(KJob *);
0023 
0024     AttachmentUpdateJob *const q;
0025     AttachmentPart::Ptr mOriginalPart;
0026     AttachmentPart::Ptr mUpdatedPart;
0027 };
0028 
0029 AttachmentUpdateJob::AttachmentUpdateJobPrivate::AttachmentUpdateJobPrivate(AttachmentUpdateJob *qq)
0030     : q(qq)
0031 {
0032 }
0033 
0034 void AttachmentUpdateJob::AttachmentUpdateJobPrivate::doStart()
0035 {
0036     Q_ASSERT(mOriginalPart);
0037     if (mOriginalPart->url().isEmpty()) {
0038         qCDebug(MESSAGECORE_LOG) << " url is empty. We can't update file";
0039         q->setError(KJob::UserDefinedError);
0040         q->setErrorText(i18n("URL is empty."));
0041         q->emitResult();
0042         return;
0043     }
0044     MessageCore::AttachmentFromUrlBaseJob *job = MessageCore::AttachmentFromUrlUtils::createAttachmentJob(mOriginalPart->url(), q);
0045     connect(job, &AttachmentFromUrlBaseJob::result, q, [this](KJob *job) {
0046         loadJobResult(job);
0047     });
0048     job->start();
0049 }
0050 
0051 void AttachmentUpdateJob::AttachmentUpdateJobPrivate::loadJobResult(KJob *job)
0052 {
0053     if (job->error()) {
0054         q->setError(KJob::UserDefinedError);
0055         q->setErrorText(job->errorString());
0056         q->emitResult();
0057         return;
0058     }
0059 
0060     Q_ASSERT(dynamic_cast<AttachmentLoadJob *>(job));
0061     auto ajob = static_cast<AttachmentLoadJob *>(job);
0062     mUpdatedPart = ajob->attachmentPart();
0063     mUpdatedPart->setName(q->originalPart()->name());
0064     mUpdatedPart->setFileName(q->originalPart()->fileName());
0065     mUpdatedPart->setDescription(q->originalPart()->description());
0066     mUpdatedPart->setSigned(q->originalPart()->isSigned());
0067     mUpdatedPart->setEncrypted(q->originalPart()->isEncrypted());
0068     mUpdatedPart->setEncoding(q->originalPart()->encoding());
0069     mUpdatedPart->setMimeType(q->originalPart()->mimeType());
0070     mUpdatedPart->setInline(q->originalPart()->isInline());
0071     q->emitResult(); // Success.
0072 }
0073 
0074 AttachmentUpdateJob::AttachmentUpdateJob(const AttachmentPart::Ptr &part, QObject *parent)
0075     : KJob(parent)
0076     , d(new AttachmentUpdateJobPrivate(this))
0077 {
0078     d->mOriginalPart = part;
0079 }
0080 
0081 AttachmentUpdateJob::~AttachmentUpdateJob() = default;
0082 
0083 void AttachmentUpdateJob::start()
0084 {
0085     QTimer::singleShot(0, this, [this]() {
0086         d->doStart();
0087     });
0088 }
0089 
0090 AttachmentPart::Ptr AttachmentUpdateJob::originalPart() const
0091 {
0092     return d->mOriginalPart;
0093 }
0094 
0095 AttachmentPart::Ptr AttachmentUpdateJob::updatedPart() const
0096 {
0097     return d->mUpdatedPart;
0098 }
0099 
0100 #include "moc_attachmentupdatejob.cpp"