summaryrefslogtreecommitdiff
path: root/src/CommonAPI/DBus
diff options
context:
space:
mode:
Diffstat (limited to 'src/CommonAPI/DBus')
-rw-r--r--src/CommonAPI/DBus/DBusConnection.cpp30
-rw-r--r--src/CommonAPI/DBus/DBusConnection.h8
-rw-r--r--src/CommonAPI/DBus/DBusProxy.cpp7
-rw-r--r--src/CommonAPI/DBus/DBusProxy.h5
-rw-r--r--src/CommonAPI/DBus/DBusProxyConnection.h12
-rw-r--r--src/CommonAPI/DBus/DBusSelectiveEvent.h5
-rw-r--r--src/CommonAPI/DBus/DBusServiceRegistry.cpp43
7 files changed, 61 insertions, 49 deletions
diff --git a/src/CommonAPI/DBus/DBusConnection.cpp b/src/CommonAPI/DBus/DBusConnection.cpp
index 6736834..1d95989 100644
--- a/src/CommonAPI/DBus/DBusConnection.cpp
+++ b/src/CommonAPI/DBus/DBusConnection.cpp
@@ -668,10 +668,11 @@ DBusProxyConnection::DBusSignalHandlerToken DBusConnection::subscribeForSelectiv
return (subscriptionToken);
}
-void DBusConnection::unsubsribeFromSelectiveBroadcast(const std::string& eventName,
+void DBusConnection::unsubscribeFromSelectiveBroadcast(const std::string& eventName,
DBusProxyConnection::DBusSignalHandlerToken subscription,
- DBusProxy* callingProxy) {
- bool lastListenerOnConnectionRemoved = removeSignalMemberHandler(subscription);
+ DBusProxy* callingProxy,
+ const DBusSignalHandler* dbusSignalHandler) {
+ bool lastListenerOnConnectionRemoved = removeSignalMemberHandler(subscription, dbusSignalHandler);
if (lastListenerOnConnectionRemoved) {
// send unsubscribe message to stub
@@ -706,17 +707,19 @@ DBusProxyConnection::DBusSignalHandlerToken DBusConnection::addSignalMemberHandl
return dbusSignalHandlerPath;
}
-bool DBusConnection::removeSignalMemberHandler(const DBusSignalHandlerToken& dbusSignalHandlerToken) {
+bool DBusConnection::removeSignalMemberHandler(const DBusSignalHandlerToken& dbusSignalHandlerToken,
+ const DBusSignalHandler* dbusSignalHandler) {
bool lastHandlerRemoved = false;
std::lock_guard<std::mutex> dbusSignalLock(signalGuard_);
auto equalRangeIteratorPair = dbusSignalHandlerTable_.equal_range(dbusSignalHandlerToken);
if (equalRangeIteratorPair.first != equalRangeIteratorPair.second) {
// advance to the next element
- equalRangeIteratorPair.first++;
+ auto iteratorToNextElement = equalRangeIteratorPair.first;
+ iteratorToNextElement++;
// check if the first element was the only element
- const bool isLastSignalMemberHandler = equalRangeIteratorPair.first == equalRangeIteratorPair.second;
+ const bool isLastSignalMemberHandler = iteratorToNextElement == equalRangeIteratorPair.second;
if (isLastSignalMemberHandler) {
const std::string& objectPath = std::get<0>(dbusSignalHandlerToken);
@@ -727,7 +730,20 @@ bool DBusConnection::removeSignalMemberHandler(const DBusSignalHandlerToken& dbu
lastHandlerRemoved = true;
}
- dbusSignalHandlerTable_.erase(equalRangeIteratorPair.first, equalRangeIteratorPair.first);
+ if(dbusSignalHandler == NULL) {
+ // remove all handlers
+ dbusSignalHandlerTable_.erase(dbusSignalHandlerToken);
+ } else {
+ // just remove specific handler
+ while(equalRangeIteratorPair.first != equalRangeIteratorPair.second) {
+ if(equalRangeIteratorPair.first->second == dbusSignalHandler) {
+ equalRangeIteratorPair.first = dbusSignalHandlerTable_.erase(equalRangeIteratorPair.first);
+ }
+ else {
+ equalRangeIteratorPair.first++;
+ }
+ }
+ }
}
return lastHandlerRemoved;
diff --git a/src/CommonAPI/DBus/DBusConnection.h b/src/CommonAPI/DBus/DBusConnection.h
index b86fd1e..54b94d1 100644
--- a/src/CommonAPI/DBus/DBusConnection.h
+++ b/src/CommonAPI/DBus/DBusConnection.h
@@ -112,14 +112,16 @@ class DBusConnection: public DBusProxyConnection, public std::enable_shared_from
DBusSignalHandler* dbusSignalHandler,
DBusProxy* callingProxy);
- void unsubsribeFromSelectiveBroadcast(const std::string& eventName,
+ void unsubscribeFromSelectiveBroadcast(const std::string& eventName,
DBusProxyConnection::DBusSignalHandlerToken subscription,
- DBusProxy* callingProxy);
+ DBusProxy* callingProxy,
+ const DBusSignalHandler* dbusSignalHandler);
void registerObjectPath(const std::string& objectPath);
void unregisterObjectPath(const std::string& objectPath);
- bool removeSignalMemberHandler(const DBusSignalHandlerToken& dbusSignalHandlerToken);
+ bool removeSignalMemberHandler(const DBusSignalHandlerToken& dbusSignalHandlerToken,
+ const DBusSignalHandler* dbusSignalHandler = NULL);
bool readWriteDispatch(int timeoutMilliseconds = -1);
virtual const std::shared_ptr<DBusServiceRegistry> getDBusServiceRegistry();
diff --git a/src/CommonAPI/DBus/DBusProxy.cpp b/src/CommonAPI/DBus/DBusProxy.cpp
index 0962788..24e39a1 100644
--- a/src/CommonAPI/DBus/DBusProxy.cpp
+++ b/src/CommonAPI/DBus/DBusProxy.cpp
@@ -139,9 +139,10 @@ DBusProxyConnection::DBusSignalHandlerToken DBusProxy::subscribeForSelectiveBroa
this);
}
-void DBusProxy::unsubsribeFromSelectiveBroadcast(const std::string& eventName,
- DBusProxyConnection::DBusSignalHandlerToken subscription) {
- getDBusConnection()->unsubsribeFromSelectiveBroadcast(eventName, subscription, this);
+void DBusProxy::unsubscribeFromSelectiveBroadcast(const std::string& eventName,
+ DBusProxyConnection::DBusSignalHandlerToken subscription,
+ const DBusProxyConnection::DBusSignalHandler* dbusSignalHandler) {
+ getDBusConnection()->unsubscribeFromSelectiveBroadcast(eventName, subscription, this, dbusSignalHandler);
}
} // namespace DBus
diff --git a/src/CommonAPI/DBus/DBusProxy.h b/src/CommonAPI/DBus/DBusProxy.h
index 3ee3f68..81b97ea 100644
--- a/src/CommonAPI/DBus/DBusProxy.h
+++ b/src/CommonAPI/DBus/DBusProxy.h
@@ -70,8 +70,9 @@ class DBusProxy: public DBusProxyBase {
const std::string& interfaceMemberName,
const std::string& interfaceMemberSignature,
DBusProxyConnection::DBusSignalHandler* dbusSignalHandler);
- void unsubsribeFromSelectiveBroadcast(const std::string& eventName,
- DBusProxyConnection::DBusSignalHandlerToken subscription);
+ void unsubscribeFromSelectiveBroadcast(const std::string& eventName,
+ DBusProxyConnection::DBusSignalHandlerToken subscription,
+ const DBusProxyConnection::DBusSignalHandler* dbusSignalHandler);
void init();
private:
diff --git a/src/CommonAPI/DBus/DBusProxyConnection.h b/src/CommonAPI/DBus/DBusProxyConnection.h
index 4f17512..d7c88d8 100644
--- a/src/CommonAPI/DBus/DBusProxyConnection.h
+++ b/src/CommonAPI/DBus/DBusProxyConnection.h
@@ -64,8 +64,7 @@ class DBusProxyConnection {
typedef Event<AvailabilityStatus> ConnectionStatusEvent;
- virtual ~DBusProxyConnection() {
- }
+ virtual ~DBusProxyConnection() { }
virtual bool isConnected() const = 0;
@@ -101,10 +100,13 @@ class DBusProxyConnection {
DBusSignalHandler* dbusSignalHandler,
DBusProxy* callingProxy) = 0;
- virtual void unsubsribeFromSelectiveBroadcast(const std::string& eventName,
+ virtual void unsubscribeFromSelectiveBroadcast(const std::string& eventName,
DBusProxyConnection::DBusSignalHandlerToken subscription,
- DBusProxy* callingProxy) = 0;
- virtual bool removeSignalMemberHandler(const DBusSignalHandlerToken& dbusSignalHandlerToken) = 0;
+ DBusProxy* callingProxy,
+ const DBusSignalHandler* dbusSignalHandler) = 0;
+
+ virtual bool removeSignalMemberHandler(const DBusSignalHandlerToken& dbusSignalHandlerToken,
+ const DBusSignalHandler* dbusSignalHandler = NULL) = 0;
virtual bool addObjectManagerSignalMemberHandler(const std::string& dbusBusName,
DBusSignalHandler* dbusSignalHandler) = 0;
diff --git a/src/CommonAPI/DBus/DBusSelectiveEvent.h b/src/CommonAPI/DBus/DBusSelectiveEvent.h
index e3f2484..313ad9c 100644
--- a/src/CommonAPI/DBus/DBusSelectiveEvent.h
+++ b/src/CommonAPI/DBus/DBusSelectiveEvent.h
@@ -85,7 +85,10 @@ public:
protected:
virtual void onLastListenerRemoved(const CancellableListener&) {
- associatedDbusProxy_.unsubsribeFromSelectiveBroadcast(DBusEventBase::eventName_, DBusEventBase::subscription_);
+ associatedDbusProxy_.unsubscribeFromSelectiveBroadcast(
+ DBusEventBase::eventName_,
+ DBusEventBase::subscription_,
+ this);
}
private:
diff --git a/src/CommonAPI/DBus/DBusServiceRegistry.cpp b/src/CommonAPI/DBus/DBusServiceRegistry.cpp
index 98c5896..e5952de 100644
--- a/src/CommonAPI/DBus/DBusServiceRegistry.cpp
+++ b/src/CommonAPI/DBus/DBusServiceRegistry.cpp
@@ -10,7 +10,6 @@
#include "DBusProxyAsyncCallbackHandler.h"
#include "DBusUtils.h"
-#include <iostream>
#include <iterator>
namespace CommonAPI {
@@ -36,7 +35,13 @@ DBusServiceRegistry::~DBusServiceRegistry() {
// fulfill all open promises
std::promise<DBusRecordState> promiseOnResolve = std::move(dbusServiceListenersRecord.promiseOnResolve);
- promiseOnResolve.set_value(DBusRecordState::NOT_AVAILABLE);
+
+ try {
+ std::future<DBusRecordState> futureOnResolve = promiseOnResolve.get_future();
+ if(!futureOnResolve.valid()) {
+ promiseOnResolve.set_value(DBusRecordState::NOT_AVAILABLE);
+ }
+ } catch (std::future_error& e) { }
if (dbusServiceListenersRecord.uniqueBusNameState == DBusRecordState::RESOLVED) {
onDBusServiceNotAvailable(dbusServiceListenersRecord);
@@ -58,7 +63,7 @@ DBusServiceRegistry::~DBusServiceRegistry() {
void DBusServiceRegistry::init() {
dbusDaemonProxyStatusEventSubscription_ =
dbusDaemonProxy_->getProxyStatusEvent().subscribeCancellableListener(
- std::bind(&DBusServiceRegistry::onDBusDaemonProxyStatusEvent, shared_from_this(), std::placeholders::_1));
+ std::bind(&DBusServiceRegistry::onDBusDaemonProxyStatusEvent, this, std::placeholders::_1));
dbusDaemonProxyNameOwnerChangedEventSubscription_ =
dbusDaemonProxy_->getNameOwnerChangedEvent().subscribeCancellableListener(
@@ -128,7 +133,6 @@ DBusServiceRegistry::DBusServiceSubscription DBusServiceRegistry::subscribeAvail
}
}
-
if (availabilityStatus != AvailabilityStatus::UNKNOWN) {
notificationThread_ = std::this_thread::get_id();
SubscriptionStatus subscriptionStatus = serviceListener(availabilityStatus);
@@ -518,28 +522,7 @@ SubscriptionStatus DBusServiceRegistry::onSignalDBusMessage(const DBusMessage& d
auto& dbusUniqueNameRecord = dbusServiceUniqueNameIterator->second;
- //auto dbusObjectPathIterator = dbusUniqueNameRecord.dbusObjectPathsCache.find(dbusObjectPath);
- //const bool isDBusObjectPathFound = (dbusObjectPathIterator != dbusUniqueNameRecord.dbusObjectPathsCache.end());
-
- /*
- if (!isDBusObjectPathFound) {
- return SubscriptionStatus::RETAIN;
- }
- */
-
DBusObjectPathCache& dbusObjectPathRecord = dbusUniqueNameRecord.dbusObjectPathsCache[dbusObjectPath];
-/*
- if (isDBusObjectPathFound) {
- dbusObjectPathRecord = &dbusObjectPathIterator->second;
- }
- else
- {
- DBusObjectPathCache dbusObjectPathRecord;
- auto insertionResult = dbusUniqueNameRecord.dbusObjectPathsCache.insert(std::make_pair(dbusObjectPath, std::move(dbusObjectPath)));
- auto objectPathCacheIterator = insertionResult.first;
- dbusObjectPathRecord = &(objectPathCacheIterator->second);
- }
-*/
if (dbusObjectPathRecord.state != DBusRecordState::RESOLVED) {
return SubscriptionStatus::RETAIN;
@@ -873,7 +856,7 @@ void DBusServiceRegistry::parseIntrospectionData(const std::string& xmlData,
parseIntrospectionNode(rootNode, rootObjectPath, rootObjectPath, dbusServiceUniqueName);
- DBusUniqueNameRecord& dbusUniqueNameRecord = dbusUniqueNamesMap_[dbusServiceUniqueName];
+ dbusUniqueNamesMap_[dbusServiceUniqueName];
dbusServicesMutex_.unlock();
}
@@ -982,7 +965,7 @@ void DBusServiceRegistry::onDBusServiceNotAvailable(DBusServiceListenersRecord&
const DBusUniqueNamesMapIterator dbusUniqueNameRecordIterator = dbusUniqueNamesMap_.find(dbusServiceListenersRecord.uniqueBusName);
// fulfill all open promises on object path resolution
- if(dbusUniqueNameRecordIterator != dbusUniqueNamesMap_.end()) {
+ if (dbusUniqueNameRecordIterator != dbusUniqueNamesMap_.end()) {
DBusUniqueNameRecord& dbusUniqueNameRecord = dbusUniqueNameRecordIterator->second;
for (auto dbusObjectPathsCacheIterator = dbusUniqueNameRecord.dbusObjectPathsCache.begin();
dbusObjectPathsCacheIterator != dbusUniqueNameRecord.dbusObjectPathsCache.end();
@@ -998,7 +981,6 @@ void DBusServiceRegistry::onDBusServiceNotAvailable(DBusServiceListenersRecord&
promiseOnResolve.set_value(DBusRecordState::NOT_AVAILABLE);
}
} catch (std::future_error& e) { }
-
}
removeUniqueName(dbusUniqueNameRecordIterator);
@@ -1134,6 +1116,11 @@ void DBusServiceRegistry::notifyDBusInterfaceNameListeners(DBusInterfaceNameList
}
void DBusServiceRegistry::removeUniqueName(const DBusUniqueNamesMapIterator& dbusUniqueNamesIterator) {
+ const bool isSubscriptionCancelled = dbusDaemonProxy_->getDBusConnection()->removeObjectManagerSignalMemberHandler(
+ dbusUniqueNamesIterator->first,
+ this);
+ assert(isSubscriptionCancelled);
+
for (auto dbusServiceNamesIterator = dbusUniqueNamesIterator->second.ownedBusNames.begin();
dbusServiceNamesIterator != dbusUniqueNamesIterator->second.ownedBusNames.end();
dbusServiceNamesIterator++) {