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