File indexing completed on 2024-06-23 05:18:32

0001 /*
0002   SPDX-FileCopyrightText: 2023 Daniel Vrátil <dvratil@kde.org>
0003 
0004   SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "job/itipjob.h"
0008 
0009 #include "contentjobbase_p.h"
0010 #include "job/multipartjob.h"
0011 #include "job/singlepartjob.h"
0012 #include "part/itippart.h"
0013 
0014 #include <KLocalizedString>
0015 #include <KMessageBox>
0016 
0017 #include <KMime/Content>
0018 
0019 using namespace MessageComposer;
0020 
0021 class MessageComposer::ItipJobPrivate : public ContentJobBasePrivate
0022 {
0023 public:
0024     ItipJobPrivate(ItipJob *qq)
0025         : ContentJobBasePrivate(qq)
0026     {
0027     }
0028 
0029     ContentJobBase *createStandardItipJob();
0030     SinglepartJob *createOutlookItipJob();
0031     SinglepartJob *createInvitationBodyJob();
0032     SinglepartJob *createInvitationJob();
0033 
0034     ItipPart *itipPart = nullptr;
0035 
0036     Q_DECLARE_PUBLIC(ItipJob)
0037 };
0038 
0039 SinglepartJob *ItipJobPrivate::createInvitationBodyJob()
0040 {
0041     auto job = new SinglepartJob; // No parent.
0042     job->contentType()->setMimeType("text/plain");
0043     job->contentType()->setCharset("utf-8");
0044     job->contentType()->setParameter(QStringLiteral("method"), itipPart->method());
0045     job->contentTransferEncoding()->setEncoding(KMime::Headers::CEquPr);
0046     job->contentDisposition()->setDisposition(KMime::Headers::CDinline);
0047     job->setData(KMime::CRLFtoLF(itipPart->invitationBody().toUtf8()));
0048     return job;
0049 }
0050 
0051 SinglepartJob *ItipJobPrivate::createInvitationJob()
0052 {
0053     auto job = new SinglepartJob;
0054     job->contentType()->setMimeType("text/calendar");
0055     job->contentType()->setCharset("utf-8");
0056     job->contentType()->setName(QStringLiteral("cal.ics"), "utf-8");
0057     job->contentType()->setParameter(QStringLiteral("method"), itipPart->method());
0058     job->contentDisposition()->setDisposition(KMime::Headers::CDattachment);
0059     job->contentTransferEncoding()->setEncoding(KMime::Headers::CEquPr);
0060     job->setData(KMime::CRLFtoLF(itipPart->invitation().toUtf8()));
0061     return job;
0062 }
0063 
0064 ContentJobBase *ItipJobPrivate::createStandardItipJob()
0065 {
0066     auto bodyJob = createInvitationBodyJob();
0067     if (itipPart->invitation().isEmpty()) {
0068         return bodyJob;
0069     }
0070 
0071     auto mpJob = new MultipartJob;
0072     mpJob->setMultipartSubtype("mixed");
0073     mpJob->appendSubjob(bodyJob);
0074     mpJob->appendSubjob(createInvitationJob());
0075     return mpJob;
0076 }
0077 
0078 SinglepartJob *ItipJobPrivate::createOutlookItipJob()
0079 {
0080     auto job = new SinglepartJob;
0081     job->contentType()->setMimeType("text/calendar");
0082     job->contentType()->setName(QStringLiteral("cal.ics"), "utf-8");
0083     job->contentType()->setParameter(QStringLiteral("method"), QStringLiteral("request"));
0084     job->contentType()->setCharset("utf-8");
0085 
0086     if (!itipPart->invitation().isEmpty()) {
0087         job->contentDisposition()->setDisposition(KMime::Headers::CDinline);
0088         job->contentTransferEncoding()->setEncoding(KMime::Headers::CEquPr);
0089         job->setData(KMime::CRLFtoLF(itipPart->invitation().toUtf8()));
0090     }
0091 
0092     return job;
0093 }
0094 
0095 ItipJob::ItipJob(ItipPart *itipPart, QObject *parent)
0096     : ContentJobBase(*new ItipJobPrivate(this), parent)
0097 {
0098     Q_D(ItipJob);
0099     d->itipPart = itipPart;
0100 }
0101 
0102 ItipJob::~ItipJob() = default;
0103 
0104 ItipPart *ItipJob::itipPart() const
0105 {
0106     Q_D(const ItipJob);
0107     return d->itipPart;
0108 }
0109 
0110 void ItipJob::setItipPart(ItipPart *part)
0111 {
0112     Q_D(ItipJob);
0113     d->itipPart = part;
0114 }
0115 
0116 void ItipJob::doStart()
0117 {
0118     Q_D(ItipJob);
0119     Q_ASSERT(d->itipPart);
0120 
0121     if (d->itipPart->outlookConformInvitation()) {
0122         appendSubjob(d->createOutlookItipJob());
0123     } else {
0124         appendSubjob(d->createStandardItipJob());
0125     }
0126 
0127     ContentJobBase::doStart();
0128 }
0129 
0130 void ItipJob::process()
0131 {
0132     Q_D(ItipJob);
0133     // The content has been created by our subjob.
0134     Q_ASSERT(d->subjobContents.count() == 1);
0135     d->resultContent = d->subjobContents.constFirst();
0136     emitResult();
0137 }
0138 
0139 #include "moc_itipjob.cpp"