Pimcommon

imapresourcecapabilitiesmanager.cpp
1/*
2 SPDX-FileCopyrightText: 2015-2024 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "imapresourcecapabilitiesmanager.h"
8#include "pimcommonakonadi_debug.h"
9#include "util/pimutil.h"
10
11#include <Akonadi/AgentManager>
12#include <Akonadi/ServerManager>
13
14#include <QDBusConnection>
15#include <QDBusInterface>
16#include <QDBusPendingCall>
17#include <QDBusPendingReply>
18
19using namespace PimCommon;
20ImapResourceCapabilitiesManager::ImapResourceCapabilitiesManager(QObject *parent)
21 : QObject(parent)
22{
23 init();
24}
25
26ImapResourceCapabilitiesManager::~ImapResourceCapabilitiesManager() = default;
27
28void ImapResourceCapabilitiesManager::slotInstanceAdded(const Akonadi::AgentInstance &instance)
29{
30 searchCapabilities(instance.identifier());
31}
32
33void ImapResourceCapabilitiesManager::slotInstanceRemoved(const Akonadi::AgentInstance &instance)
34{
35 mImapResource.remove(instance.identifier());
36}
37
38void ImapResourceCapabilitiesManager::searchCapabilities(const QString &identifier)
39{
40 // By default makes it as true.
41 mImapResource.insert(identifier, true);
42 const QString service = Akonadi::ServerManager::agentServiceName(Akonadi::ServerManager::Resource, identifier);
43 QDBusInterface iface(service, QStringLiteral("/"), QStringLiteral("org.kde.Akonadi.ImapResourceBase"), QDBusConnection::sessionBus(), this);
44
45 if (iface.isValid()) {
46 QDBusPendingCall call = iface.asyncCall(QStringLiteral("serverCapabilities"));
47 auto watcher = new QDBusPendingCallWatcher(call, this);
48 watcher->setProperty("identifier", identifier);
49 connect(watcher, &QDBusPendingCallWatcher::finished, this, &ImapResourceCapabilitiesManager::slotCapabilities);
50 } else {
51 qCDebug(PIMCOMMONAKONADI_LOG) << "interface not valid";
52 }
53}
54
55void ImapResourceCapabilitiesManager::slotCapabilities(QDBusPendingCallWatcher *watcher)
56{
57 QDBusPendingReply<QStringList> reply = *watcher;
58 if (reply.isValid()) {
59 if (watcher->property("identifier").isValid()) {
60 const QStringList capabilities = reply.value();
61 mImapResource.insert(watcher->property("identifier").toString(), capabilities.contains(QLatin1StringView("ANNOTATEMORE")));
62 }
63 }
64 watcher->deleteLater();
65 watcher = nullptr;
66}
67
68void ImapResourceCapabilitiesManager::init()
69{
71 for (const Akonadi::AgentInstance &instance : lstInstances) {
72 const QString identifier = instance.identifier();
73 if (PimCommon::Util::isImapResource(identifier)) {
74 searchCapabilities(identifier);
75 }
76 }
77 connect(Akonadi::AgentManager::self(), &Akonadi::AgentManager::instanceAdded, this, &ImapResourceCapabilitiesManager::slotInstanceAdded);
78 connect(Akonadi::AgentManager::self(), &Akonadi::AgentManager::instanceRemoved, this, &ImapResourceCapabilitiesManager::slotInstanceRemoved);
79}
80
81bool ImapResourceCapabilitiesManager::hasAnnotationSupport(const QString &identifier) const
82{
83 if (!PimCommon::Util::isImapResource(identifier)) {
84 return false;
85 }
86 return mImapResource.value(identifier, true);
87}
88
89#include "moc_imapresourcecapabilitiesmanager.cpp"
QString identifier() const
static AgentManager * self()
void instanceRemoved(const Akonadi::AgentInstance &instance)
void instanceAdded(const Akonadi::AgentInstance &instance)
AgentInstance::List instances() const
static QString agentServiceName(ServiceAgentType agentType, const QString &identifier)
Capabilities capabilities()
folderdialogacltab.h
QCA_EXPORT void init()
QDBusConnection sessionBus()
void finished(QDBusPendingCallWatcher *self)
bool isValid() const const
typename Select< 0 >::Type value() const const
iterator insert(const Key &key, const T &value)
bool remove(const Key &key)
T value(const Key &key) const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void deleteLater()
QVariant property(const char *name) const const
bool isValid() const const
QString toString() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:17:23 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.