Changeset View
Changeset View
Standalone View
Standalone View
src/server/storage/itemretrievalmanager.cpp
Show All 19 Lines | |||||
20 | #include "itemretrievalmanager.h" | 20 | #include "itemretrievalmanager.h" | ||
21 | #include "itemretrievalrequest.h" | 21 | #include "itemretrievalrequest.h" | ||
22 | #include "itemretrievaljob.h" | 22 | #include "itemretrievaljob.h" | ||
23 | #include "dbusconnectionpool.h" | 23 | #include "dbusconnectionpool.h" | ||
24 | #include "akonadiserver_debug.h" | 24 | #include "akonadiserver_debug.h" | ||
25 | 25 | | |||
26 | #include "resourceinterface.h" | 26 | #include "resourceinterface.h" | ||
27 | 27 | | |||
28 | #include <memory> | ||||
28 | #include <private/dbus_p.h> | 29 | #include <private/dbus_p.h> | ||
29 | 30 | | |||
30 | #include <QReadWriteLock> | 31 | #include <QReadWriteLock> | ||
31 | #include <QScopedPointer> | 32 | #include <QScopedPointer> | ||
32 | #include <QWaitCondition> | 33 | #include <QWaitCondition> | ||
33 | #include <QDBusConnection> | 34 | #include <QDBusConnection> | ||
34 | #include <QDBusConnectionInterface> | 35 | #include <QDBusServiceWatcher> | ||
35 | 36 | | |||
36 | using namespace Akonadi; | 37 | using namespace Akonadi; | ||
37 | using namespace Akonadi::Server; | 38 | using namespace Akonadi::Server; | ||
38 | 39 | | |||
39 | ItemRetrievalManager *ItemRetrievalManager::sInstance = nullptr; | 40 | ItemRetrievalManager *ItemRetrievalManager::sInstance = nullptr; | ||
40 | 41 | | |||
41 | class ItemRetrievalJobFactory : public AbstractItemRetrievalJobFactory | 42 | class ItemRetrievalJobFactory : public AbstractItemRetrievalJobFactory | ||
42 | { | 43 | { | ||
Show All 24 Lines | 65 | { | |||
67 | sInstance = nullptr; | 68 | sInstance = nullptr; | ||
68 | } | 69 | } | ||
69 | 70 | | |||
70 | void ItemRetrievalManager::init() | 71 | void ItemRetrievalManager::init() | ||
71 | { | 72 | { | ||
72 | AkThread::init(); | 73 | AkThread::init(); | ||
73 | 74 | | |||
74 | QDBusConnection conn = DBusConnectionPool::threadConnection(); | 75 | QDBusConnection conn = DBusConnectionPool::threadConnection(); | ||
75 | connect(conn.interface(), &QDBusConnectionInterface::serviceOwnerChanged, | 76 | mDBusWatcher = std::make_unique<QDBusServiceWatcher>( | ||
76 | this, &ItemRetrievalManager::serviceOwnerChanged); | 77 | QStringLiteral("org.freedesktop.Akonadi.Resource*"), conn, | ||
78 | QDBusServiceWatcher::WatchForUnregistration); | ||||
79 | connect(mDBusWatcher.get(), &QDBusServiceWatcher::serviceUnregistered, | ||||
80 | this, [this](const QString &serviceName) { | ||||
81 | const auto service = DBus::parseAgentServiceName(serviceName); | ||||
82 | if (service.has_value() && service->agentType == DBus::Resource) { | ||||
83 | qCInfo(AKONADISERVER_LOG) << "ItemRetrievalManager has lost connection to resource" << serviceName << ", discarding cached interface."; | ||||
84 | mResourceInterfaces.erase(service->identifier); | ||||
85 | } | ||||
86 | }); | ||||
77 | connect(this, &ItemRetrievalManager::requestAdded, | 87 | connect(this, &ItemRetrievalManager::requestAdded, | ||
78 | this, &ItemRetrievalManager::processRequest, | 88 | this, &ItemRetrievalManager::processRequest, | ||
79 | Qt::QueuedConnection); | 89 | Qt::QueuedConnection); | ||
80 | } | 90 | } | ||
81 | 91 | | |||
82 | ItemRetrievalManager *ItemRetrievalManager::instance() | 92 | ItemRetrievalManager *ItemRetrievalManager::instance() | ||
83 | { | 93 | { | ||
84 | Q_ASSERT(sInstance); | 94 | Q_ASSERT(sInstance); | ||
85 | return sInstance; | 95 | return sInstance; | ||
86 | } | 96 | } | ||
87 | 97 | | |||
88 | // called within the retrieval thread | 98 | // called within the retrieval thread | ||
89 | void ItemRetrievalManager::serviceOwnerChanged(const QString &serviceName, const QString &oldOwner, const QString &newOwner) | | |||
90 | { | | |||
91 | Q_UNUSED(newOwner); | | |||
92 | if (oldOwner.isEmpty()) { | | |||
93 | return; | | |||
94 | } | | |||
95 | const auto service = DBus::parseAgentServiceName(serviceName); | | |||
96 | if (!service.has_value() || service->agentType != DBus::Resource) { | | |||
97 | return; | | |||
98 | } | | |||
99 | qCDebug(AKONADISERVER_LOG) << "ItemRetrievalManager lost connection to resource" << serviceName << ", discarding cached interface"; | | |||
100 | mResourceInterfaces.erase(service->identifier); | | |||
101 | } | | |||
102 | | ||||
103 | // called within the retrieval thread | | |||
104 | org::freedesktop::Akonadi::Resource *ItemRetrievalManager::resourceInterface(const QString &id) | 99 | org::freedesktop::Akonadi::Resource *ItemRetrievalManager::resourceInterface(const QString &id) | ||
105 | { | 100 | { | ||
106 | if (id.isEmpty()) { | 101 | if (id.isEmpty()) { | ||
107 | return nullptr; | 102 | return nullptr; | ||
108 | } | 103 | } | ||
109 | 104 | | |||
110 | auto ifaceIt = mResourceInterfaces.find(id); | 105 | auto ifaceIt = mResourceInterfaces.find(id); | ||
111 | if (ifaceIt != mResourceInterfaces.cend() && ifaceIt->second->isValid()) { | 106 | if (ifaceIt != mResourceInterfaces.cend() && ifaceIt->second->isValid()) { | ||
▲ Show 20 Lines • Show All 111 Lines • Show Last 20 Lines |