File indexing completed on 2024-06-23 05:18:28
0001 /* 0002 SPDX-FileCopyrightText: 2014-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "savecontactpreferencejob.h" 0008 0009 #include <KJob> 0010 #include <KLocalizedString> 0011 0012 #include <QInputDialog> 0013 0014 #include <Akonadi/CollectionDialog> 0015 #include <Akonadi/ContactSearchJob> 0016 #include <Akonadi/ItemCreateJob> 0017 #include <Akonadi/ItemModifyJob> 0018 0019 #include "messagecomposer_debug.h" 0020 #include <QPointer> 0021 0022 using namespace MessageComposer; 0023 0024 class MessageComposer::SaveContactPreferenceJobPrivate 0025 { 0026 public: 0027 explicit SaveContactPreferenceJobPrivate(SaveContactPreferenceJob *qq, const QString &email, const ContactPreference &pref) 0028 : q_ptr(qq) 0029 , mEmail(email) 0030 , mPref(pref) 0031 { 0032 } 0033 0034 SaveContactPreferenceJob *q_ptr; 0035 Q_DECLARE_PUBLIC(SaveContactPreferenceJob) 0036 0037 const QString mEmail; 0038 const ContactPreference mPref; 0039 }; 0040 0041 SaveContactPreferenceJob::SaveContactPreferenceJob(const QString &email, const ContactPreference &pref, QObject *parent) 0042 : QObject(parent) 0043 , d_ptr(std::unique_ptr<SaveContactPreferenceJobPrivate>(new SaveContactPreferenceJobPrivate(this, email, pref))) 0044 { 0045 } 0046 0047 SaveContactPreferenceJob::~SaveContactPreferenceJob() = default; 0048 0049 void SaveContactPreferenceJob::start() 0050 { 0051 Q_D(SaveContactPreferenceJob); 0052 0053 auto job = new Akonadi::ContactSearchJob(this); 0054 connect(job, &Akonadi::ContactSearchJob::result, this, &SaveContactPreferenceJob::slotSearchContact); 0055 job->setLimit(1); 0056 job->setQuery(Akonadi::ContactSearchJob::Email, d->mEmail); 0057 job->start(); 0058 } 0059 0060 void SaveContactPreferenceJob::slotSearchContact(KJob *job) 0061 { 0062 Q_D(SaveContactPreferenceJob); 0063 auto contactSearchJob = qobject_cast<Akonadi::ContactSearchJob *>(job); 0064 0065 const Akonadi::Item::List items = contactSearchJob->items(); 0066 0067 if (items.isEmpty()) { 0068 bool ok = true; 0069 const QString fullName = QInputDialog::getText(nullptr, 0070 i18n("Name Selection"), 0071 i18n("Which name shall the contact '%1' have in your address book?", d->mEmail), 0072 QLineEdit::Normal, 0073 QString(), 0074 &ok); 0075 if (!ok) { 0076 deleteLater(); 0077 return; 0078 } 0079 0080 QPointer<Akonadi::CollectionDialog> dlg = new Akonadi::CollectionDialog(Akonadi::CollectionDialog::KeepTreeExpanded); 0081 dlg->setMimeTypeFilter(QStringList() << KContacts::Addressee::mimeType()); 0082 dlg->setAccessRightsFilter(Akonadi::Collection::CanCreateItem); 0083 dlg->setDescription(i18n("Select the address book folder to store the new contact in:")); 0084 if (!dlg->exec()) { 0085 delete dlg; 0086 deleteLater(); 0087 return; 0088 } 0089 0090 const Akonadi::Collection targetCollection = dlg->selectedCollection(); 0091 delete dlg; 0092 0093 KContacts::Addressee contact; 0094 contact.setNameFromString(fullName); 0095 KContacts::Email email(d->mEmail); 0096 email.setPreferred(true); 0097 contact.addEmail(email); 0098 d->mPref.fillAddressee(contact); 0099 0100 Akonadi::Item item(KContacts::Addressee::mimeType()); 0101 item.setPayload<KContacts::Addressee>(contact); 0102 0103 auto createJob = new Akonadi::ItemCreateJob(item, targetCollection); 0104 connect(createJob, &Akonadi::ContactSearchJob::result, this, &SaveContactPreferenceJob::slotModifyCreateItem); 0105 } else { 0106 Akonadi::Item item = items.first(); 0107 0108 auto contact = item.payload<KContacts::Addressee>(); 0109 d->mPref.fillAddressee(contact); 0110 0111 item.setPayload<KContacts::Addressee>(contact); 0112 0113 auto itemModifyJob = new Akonadi::ItemModifyJob(item); 0114 connect(itemModifyJob, &Akonadi::ContactSearchJob::result, this, &SaveContactPreferenceJob::slotModifyCreateItem); 0115 } 0116 } 0117 0118 void SaveContactPreferenceJob::slotModifyCreateItem(KJob *job) 0119 { 0120 if (job->error()) { 0121 qCDebug(MESSAGECOMPOSER_LOG) << "modify item failed " << job->errorString(); 0122 } 0123 deleteLater(); 0124 } 0125 0126 #include "moc_savecontactpreferencejob.cpp"