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"