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

0001 /*
0002   SPDX-FileCopyrightText: 2015-2024 Laurent Montel <montel@kde.org>
0003 
0004   SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "attachmentvcardfromaddressbookjob.h"
0008 #include <Akonadi/ContactGroupExpandJob>
0009 #include <KContacts/Addressee>
0010 #include <KContacts/ContactGroup>
0011 #include <KContacts/VCardConverter>
0012 #include <KLocalizedString>
0013 
0014 using namespace MessageComposer;
0015 
0016 class MessageComposer::AttachmentVcardFromAddressBookJobPrivate
0017 {
0018 public:
0019     explicit AttachmentVcardFromAddressBookJobPrivate(const Akonadi::Item &item)
0020         : mItem(item)
0021     {
0022     }
0023 
0024     Akonadi::Item mItem;
0025 };
0026 
0027 AttachmentVcardFromAddressBookJob::AttachmentVcardFromAddressBookJob(const Akonadi::Item &item, QObject *parent)
0028     : MessageCore::AttachmentLoadJob(parent)
0029     , d(new MessageComposer::AttachmentVcardFromAddressBookJobPrivate(item))
0030 {
0031 }
0032 
0033 AttachmentVcardFromAddressBookJob::~AttachmentVcardFromAddressBookJob() = default;
0034 
0035 void AttachmentVcardFromAddressBookJob::addAttachment(const QByteArray &data, const QString &attachmentName)
0036 {
0037     MessageCore::AttachmentPart::Ptr attachment = MessageCore::AttachmentPart::Ptr(new MessageCore::AttachmentPart());
0038     if (!data.isEmpty()) {
0039         attachment->setName(attachmentName);
0040         attachment->setFileName(attachmentName);
0041         attachment->setData(data);
0042         attachment->setMimeType("text/x-vcard");
0043         // TODO what about the other fields?
0044     }
0045     setAttachmentPart(attachment);
0046     emitResult(); // Success.
0047 }
0048 
0049 void AttachmentVcardFromAddressBookJob::doStart()
0050 {
0051     if (d->mItem.isValid()) {
0052         if (d->mItem.hasPayload<KContacts::Addressee>()) {
0053             const auto contact = d->mItem.payload<KContacts::Addressee>();
0054             if (contact.isEmpty()) {
0055                 invalidContact();
0056             } else {
0057                 const QString contactRealName(contact.realName());
0058                 const QString attachmentName = (contactRealName.isEmpty() ? QStringLiteral("vcard") : contactRealName) + QLatin1StringView(".vcf");
0059 
0060                 QByteArray data = d->mItem.payloadData();
0061                 // Workaround about broken kaddressbook fields.
0062                 KContacts::adaptIMAttributes(data);
0063                 addAttachment(data, attachmentName);
0064             }
0065         } else if (d->mItem.hasPayload<KContacts::ContactGroup>()) {
0066             const auto group = d->mItem.payload<KContacts::ContactGroup>();
0067             const QString groupName(group.name());
0068             const QString attachmentName = (groupName.isEmpty() ? QStringLiteral("vcard") : groupName) + QLatin1StringView(".vcf");
0069             auto expandJob = new Akonadi::ContactGroupExpandJob(group, this);
0070             expandJob->setProperty("groupName", attachmentName);
0071             connect(expandJob, &KJob::result, this, &AttachmentVcardFromAddressBookJob::slotExpandGroupResult);
0072             expandJob->start();
0073         } else {
0074             setError(KJob::UserDefinedError);
0075             setErrorText(i18n("Unknown Contact Type"));
0076             emitResult();
0077         }
0078     } else {
0079         invalidContact();
0080     }
0081 }
0082 
0083 void AttachmentVcardFromAddressBookJob::invalidContact()
0084 {
0085     setError(KJob::UserDefinedError);
0086     setErrorText(i18n("Invalid Contact"));
0087     emitResult();
0088 }
0089 
0090 void AttachmentVcardFromAddressBookJob::slotExpandGroupResult(KJob *job)
0091 {
0092     auto expandJob = qobject_cast<Akonadi::ContactGroupExpandJob *>(job);
0093     Q_ASSERT(expandJob);
0094 
0095     const QString attachmentName = expandJob->property("groupName").toString();
0096     KContacts::VCardConverter converter;
0097     const QByteArray groupData = converter.exportVCards(expandJob->contacts(), KContacts::VCardConverter::v3_0);
0098     if (!groupData.isEmpty()) {
0099         addAttachment(groupData, attachmentName);
0100     } else {
0101         setError(KJob::UserDefinedError);
0102         setErrorText(i18n("Impossible to generate vCard."));
0103         emitResult();
0104     }
0105 }
0106 
0107 #include "moc_attachmentvcardfromaddressbookjob.cpp"