1 /*
2   SPDX-FileCopyrightText: 2010 Tobias Koenig <tokoe@kde.org>
3 
4   SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "openemailaddressjob.h"
8 
9 #include "job/addemailaddressjob.h"
10 
11 #include <Akonadi/CollectionDialog>
12 #include <Akonadi/Contact/ContactEditorDialog>
13 #include <Akonadi/Contact/ContactSearchJob>
14 #include <Akonadi/Item>
15 #include <Akonadi/ItemCreateJob>
16 #include <KContacts/Addressee>
17 #include <QPointer>
18 
19 using namespace Akonadi;
20 
21 class Akonadi::OpenEmailAddressJobPrivate
22 {
23 public:
OpenEmailAddressJobPrivate(OpenEmailAddressJob * qq,const QString & emailString,QWidget * parentWidget)24     OpenEmailAddressJobPrivate(OpenEmailAddressJob *qq, const QString &emailString, QWidget *parentWidget)
25         : q(qq)
26         , mCompleteAddress(emailString)
27         , mParentWidget(parentWidget)
28     {
29         KContacts::Addressee::parseEmailAddress(emailString, mName, mEmail);
30     }
31 
slotSearchDone(KJob * job)32     void slotSearchDone(KJob *job)
33     {
34         if (job->error()) {
35             q->setError(job->error());
36             q->setErrorText(job->errorText());
37             q->emitResult();
38             return;
39         }
40 
41         const Akonadi::ContactSearchJob *searchJob = qobject_cast<Akonadi::ContactSearchJob *>(job);
42 
43         const Akonadi::Item::List contacts = searchJob->items();
44         if (!contacts.isEmpty()) {
45             // open the editor with the matching item
46             QPointer<Akonadi::ContactEditorDialog> dlg = new Akonadi::ContactEditorDialog(Akonadi::ContactEditorDialog::EditMode, mParentWidget);
47             dlg->setContact(contacts.first());
48             dlg->exec();
49             delete dlg;
50 
51             q->emitResult();
52             return;
53         }
54 
55         auto createJob = new AddEmailAddressJob(mCompleteAddress, mParentWidget, q);
56         q->connect(createJob, &AddEmailAddressJob::result, q, [this](KJob *job) {
57             slotAddContactDone(job);
58         });
59         createJob->start();
60     }
61 
slotAddContactDone(KJob * job)62     void slotAddContactDone(KJob *job)
63     {
64         if (job->error()) {
65             q->setError(job->error());
66             q->setErrorText(job->errorText());
67             q->emitResult();
68             return;
69         }
70 
71         const AddEmailAddressJob *createJob = qobject_cast<AddEmailAddressJob *>(job);
72 
73         // open the editor with the matching item
74         QPointer<Akonadi::ContactEditorDialog> dlg = new Akonadi::ContactEditorDialog(Akonadi::ContactEditorDialog::EditMode, mParentWidget);
75         dlg->setContact(createJob->contact());
76         dlg->exec();
77         delete dlg;
78 
79         q->emitResult();
80     }
81 
82     OpenEmailAddressJob *const q;
83     const QString mCompleteAddress;
84     QString mEmail;
85     QString mName;
86     QWidget *const mParentWidget;
87 };
88 
OpenEmailAddressJob(const QString & email,QWidget * parentWidget,QObject * parent)89 OpenEmailAddressJob::OpenEmailAddressJob(const QString &email, QWidget *parentWidget, QObject *parent)
90     : KJob(parent)
91     , d(new OpenEmailAddressJobPrivate(this, email, parentWidget))
92 {
93 }
94 
95 OpenEmailAddressJob::~OpenEmailAddressJob() = default;
96 
start()97 void OpenEmailAddressJob::start()
98 {
99     // first check whether a contact with the same email exists already
100     auto searchJob = new Akonadi::ContactSearchJob(this);
101     searchJob->setLimit(1);
102     searchJob->setQuery(Akonadi::ContactSearchJob::Email, d->mEmail.toLower(), Akonadi::ContactSearchJob::ExactMatch);
103     connect(searchJob, &Akonadi::ContactSearchJob::result, this, [this](KJob *job) {
104         d->slotSearchDone(job);
105     });
106 }
107 
108 #include "moc_openemailaddressjob.cpp"
109