1 /*
2 SPDX-FileCopyrightText: 2014-2021 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "manageserversidesubscriptionjob.h"
8 #include "pimcommonakonadi_debug.h"
9 #include "util/mailutil.h"
10
11 #include <Akonadi/ServerManager>
12
13 #include <KLocalizedString>
14 #include <KMessageBox>
15
16 #include <QDBusConnection>
17 #include <QDBusInterface>
18 #include <QDBusPendingCall>
19 #include <QDBusPendingReply>
20
21 using namespace PimCommon;
22
23 class PimCommon::ManageServerSideSubscriptionJobPrivate
24 {
25 public:
ManageServerSideSubscriptionJobPrivate()26 ManageServerSideSubscriptionJobPrivate()
27 {
28 }
29
30 Akonadi::Collection mCurrentCollection;
31 QWidget *mParentWidget = nullptr;
32 };
33
ManageServerSideSubscriptionJob(QObject * parent)34 ManageServerSideSubscriptionJob::ManageServerSideSubscriptionJob(QObject *parent)
35 : QObject(parent)
36 , d(new PimCommon::ManageServerSideSubscriptionJobPrivate)
37 {
38 }
39
40 ManageServerSideSubscriptionJob::~ManageServerSideSubscriptionJob() = default;
41
start()42 void ManageServerSideSubscriptionJob::start()
43 {
44 if (!d->mCurrentCollection.isValid()) {
45 qCDebug(PIMCOMMONAKONADI_LOG) << " collection not defined";
46 deleteLater();
47 return;
48 }
49 bool isImapOnline = false;
50 if (PimCommon::MailUtil::isImapFolder(d->mCurrentCollection, isImapOnline)) {
51 const QString service = Akonadi::ServerManager::agentServiceName(Akonadi::ServerManager::Resource, d->mCurrentCollection.resource());
52 QDBusInterface iface(service, QStringLiteral("/"), QStringLiteral("org.kde.Akonadi.ImapResourceBase"), QDBusConnection::sessionBus(), this);
53 if (!iface.isValid()) {
54 qCDebug(PIMCOMMONAKONADI_LOG) << "Cannot create imap dbus interface for service " << service;
55 deleteLater();
56 return;
57 }
58 QDBusPendingCall call = iface.asyncCall(QStringLiteral("configureSubscription"), (qlonglong)d->mParentWidget->winId());
59 auto watcher = new QDBusPendingCallWatcher(call, this);
60 connect(watcher, &QDBusPendingCallWatcher::finished, this, &ManageServerSideSubscriptionJob::slotConfigureSubscriptionFinished);
61 }
62 }
63
slotConfigureSubscriptionFinished(QDBusPendingCallWatcher * watcher)64 void ManageServerSideSubscriptionJob::slotConfigureSubscriptionFinished(QDBusPendingCallWatcher *watcher)
65 {
66 QDBusPendingReply<int> reply = *watcher;
67 if (reply.isValid()) {
68 if (reply == -2) {
69 KMessageBox::error(
70 d->mParentWidget,
71 i18n("IMAP server not configured yet. Please configure the server in the IMAP account before setting up server-side subscription."));
72 } else if (reply == -1) {
73 KMessageBox::error(d->mParentWidget, i18n("Log in failed, please configure the IMAP account before setting up server-side subscription."));
74 }
75 } else {
76 qCDebug(PIMCOMMONAKONADI_LOG) << "ManageServerSideSubscriptionJob return an invalid reply";
77 }
78 watcher->deleteLater();
79 deleteLater();
80 }
81
setParentWidget(QWidget * parentWidget)82 void ManageServerSideSubscriptionJob::setParentWidget(QWidget *parentWidget)
83 {
84 d->mParentWidget = parentWidget;
85 }
86
setCurrentCollection(const Akonadi::Collection & col)87 void ManageServerSideSubscriptionJob::setCurrentCollection(const Akonadi::Collection &col)
88 {
89 d->mCurrentCollection = col;
90 }
91