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"