diff options
Diffstat (limited to 'src/CommonAPI/DBus')
-rw-r--r-- | src/CommonAPI/DBus/DBusConnection.cpp | 30 | ||||
-rw-r--r-- | src/CommonAPI/DBus/DBusConnection.h | 8 | ||||
-rw-r--r-- | src/CommonAPI/DBus/DBusProxy.cpp | 7 | ||||
-rw-r--r-- | src/CommonAPI/DBus/DBusProxy.h | 5 | ||||
-rw-r--r-- | src/CommonAPI/DBus/DBusProxyConnection.h | 12 | ||||
-rw-r--r-- | src/CommonAPI/DBus/DBusSelectiveEvent.h | 5 | ||||
-rw-r--r-- | src/CommonAPI/DBus/DBusServiceRegistry.cpp | 43 |
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++) { |