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"