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