diff --git a/akonadi/changenotificationdependenciesfactory.cpp b/akonadi/changenotificationdependenciesfactory.cpp --- a/akonadi/changenotificationdependenciesfactory.cpp +++ b/akonadi/changenotificationdependenciesfactory.cpp @@ -73,7 +73,7 @@ // :TODO: error handling return 0; } - return new NotificationSource(notificationSource); + return new NotificationSource(notificationSource, name); } QObject *ChangeNotificationDependenciesFactory::createChangeMediator(QObject *parent) diff --git a/akonadi/monitor_p.h b/akonadi/monitor_p.h --- a/akonadi/monitor_p.h +++ b/akonadi/monitor_p.h @@ -52,11 +52,7 @@ { public: MonitorPrivate(ChangeNotificationDependenciesFactory *dependenciesFactory_, Monitor *parent); - virtual ~MonitorPrivate() { - delete dependenciesFactory; - delete collectionCache; - delete itemCache; - } + virtual ~MonitorPrivate(); void init(); Monitor *q_ptr; @@ -308,6 +304,8 @@ void notifyCollectionStatisticsWatchers(Collection::Id collection, const QByteArray &resource); bool fetchCollections() const; bool fetchItems() const; + + void unregisterNotificationSource(); }; } diff --git a/akonadi/monitor_p.cpp b/akonadi/monitor_p.cpp --- a/akonadi/monitor_p.cpp +++ b/akonadi/monitor_p.cpp @@ -32,6 +32,7 @@ #include #include +#include using namespace Akonadi; @@ -55,6 +56,41 @@ { } +MonitorPrivate::~MonitorPrivate() { + unregisterNotificationSource(); + delete dependenciesFactory; + delete collectionCache; + delete itemCache; +} + +void MonitorPrivate::unregisterNotificationSource() +{ + if (!notificationSource) { + return; + } + + const QString &name = notificationSource->name(); + + delete notificationSource; + notificationSource = 0; + + if (!Akonadi::ServerManager::self()->isRunning()) { + return; + } + + org::freedesktop::Akonadi::NotificationManager *manager = + new org::freedesktop::Akonadi::NotificationManager( + ServerManager::serviceName(Akonadi::ServerManager::Server), + QLatin1String("/notifications"), + DBusConnectionPool::threadConnection()); + + if (!manager) { + return; + } + manager->unsubscribe(name); + +} + void MonitorPrivate::init() { // needs to be at least 3x pipeline size for the collection move case @@ -81,8 +117,7 @@ bool MonitorPrivate::connectToNotificationManager() { - delete notificationSource; - notificationSource = 0; + unregisterNotificationSource(); notificationSource = dependenciesFactory->createNotificationSource(q_ptr); diff --git a/akonadi/notificationsource.cpp b/akonadi/notificationsource.cpp --- a/akonadi/notificationsource.cpp +++ b/akonadi/notificationsource.cpp @@ -21,8 +21,9 @@ using namespace Akonadi; -NotificationSource::NotificationSource(QObject *source) +NotificationSource::NotificationSource(QObject *source, const QString &name) : QObject(source) + , mName(name) { Q_ASSERT(source); @@ -125,3 +126,8 @@ { return parent(); } + +QString NotificationSource::name() const +{ + return mName; +} \ No newline at end of file diff --git a/akonadi/notificationsource_p.h b/akonadi/notificationsource_p.h --- a/akonadi/notificationsource_p.h +++ b/akonadi/notificationsource_p.h @@ -35,7 +35,7 @@ Q_OBJECT public: - NotificationSource(QObject *source); + NotificationSource(QObject *source, const QString &name); ~NotificationSource(); void setAllMonitored(bool allMonitored); @@ -50,9 +50,12 @@ void setSession(const QByteArray &session); QObject *source() const; + QString name() const; Q_SIGNALS: void notifyV3(const Akonadi::NotificationMessageV3::List &msgs); +private: + QString mName; }; } diff --git a/akonadi/tests/fakeentitycache.h b/akonadi/tests/fakeentitycache.h --- a/akonadi/tests/fakeentitycache.h +++ b/akonadi/tests/fakeentitycache.h @@ -129,7 +129,7 @@ virtual Akonadi::NotificationSource* createNotificationSource(QObject *parent) { - return new Akonadi::NotificationSource( new FakeNotificationSource( parent ) ); + return new Akonadi::NotificationSource( new FakeNotificationSource( parent ), QString() ); } virtual Akonadi::CollectionCache* createCollectionCache(int maxCapacity, Akonadi::Session *session)