summaryrefslogtreecommitdiff
path: root/src/CommonAPI/DBus/DBusInstanceAvailabilityStatusChangedEvent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/CommonAPI/DBus/DBusInstanceAvailabilityStatusChangedEvent.cpp')
-rw-r--r--src/CommonAPI/DBus/DBusInstanceAvailabilityStatusChangedEvent.cpp49
1 files changed, 30 insertions, 19 deletions
diff --git a/src/CommonAPI/DBus/DBusInstanceAvailabilityStatusChangedEvent.cpp b/src/CommonAPI/DBus/DBusInstanceAvailabilityStatusChangedEvent.cpp
index 93cd84b..a8d538d 100644
--- a/src/CommonAPI/DBus/DBusInstanceAvailabilityStatusChangedEvent.cpp
+++ b/src/CommonAPI/DBus/DBusInstanceAvailabilityStatusChangedEvent.cpp
@@ -10,10 +10,24 @@
namespace CommonAPI {
namespace DBus {
+DBusInstanceAvailabilityStatusChangedEvent::SignalHandler::SignalHandler(DBusInstanceAvailabilityStatusChangedEvent* _instanceAvblStatusEvent) :
+ instanceAvblStatusEvent_(_instanceAvblStatusEvent) {
+
+}
+
+void DBusInstanceAvailabilityStatusChangedEvent::SignalHandler::onSignalDBusMessage(const DBusMessage& dbusMessage) {
+ if (dbusMessage.hasMemberName("InterfacesAdded")) {
+ instanceAvblStatusEvent_->onInterfacesAddedSignal(dbusMessage);
+ } else if (dbusMessage.hasMemberName("InterfacesRemoved")) {
+ instanceAvblStatusEvent_->onInterfacesRemovedSignal(dbusMessage);
+ }
+}
+
DBusInstanceAvailabilityStatusChangedEvent::DBusInstanceAvailabilityStatusChangedEvent(
DBusProxy &_proxy,
const std::string &_dbusInterfaceName,
const std::string &_capiInterfaceName) :
+ signalHandler_(std::make_shared<SignalHandler>(this)),
proxy_(_proxy),
observedCapiInterfaceName_(_capiInterfaceName),
registry_(DBusServiceRegistry::get(_proxy.getDBusConnection())) {
@@ -25,16 +39,8 @@ DBusInstanceAvailabilityStatusChangedEvent::DBusInstanceAvailabilityStatusChange
}
DBusInstanceAvailabilityStatusChangedEvent::~DBusInstanceAvailabilityStatusChangedEvent() {
- proxy_.removeSignalMemberHandler(interfacesAddedSubscription_, this);
- proxy_.removeSignalMemberHandler(interfacesRemovedSubscription_, this);
-}
-
-void DBusInstanceAvailabilityStatusChangedEvent::onSignalDBusMessage(const DBusMessage& dbusMessage) {
- if (dbusMessage.hasMemberName("InterfacesAdded")) {
- onInterfacesAddedSignal(dbusMessage);
- } else if (dbusMessage.hasMemberName("InterfacesRemoved")) {
- onInterfacesRemovedSignal(dbusMessage);
- }
+ proxy_.removeSignalMemberHandler(interfacesAddedSubscription_, signalHandler_.get());
+ proxy_.removeSignalMemberHandler(interfacesRemovedSubscription_, signalHandler_.get());
}
void DBusInstanceAvailabilityStatusChangedEvent::getAvailableServiceInstances(
@@ -105,12 +111,14 @@ std::future<CallStatus> DBusInstanceAvailabilityStatusChangedEvent::getServiceIn
void DBusInstanceAvailabilityStatusChangedEvent::onFirstListenerAdded(const Listener&) {
+ proxyWeakPtr_ = proxy_.shared_from_this();
+
interfacesAddedSubscription_ = proxy_.addSignalMemberHandler(
proxy_.getDBusAddress().getObjectPath(),
DBusObjectManagerStub::getInterfaceName(),
"InterfacesAdded",
"oa{sa{sv}}",
- this,
+ signalHandler_,
false);
interfacesRemovedSubscription_ = proxy_.addSignalMemberHandler(
@@ -118,7 +126,7 @@ void DBusInstanceAvailabilityStatusChangedEvent::onFirstListenerAdded(const List
DBusObjectManagerStub::getInterfaceName(),
"InterfacesRemoved",
"oas",
- this,
+ signalHandler_,
false);
getAvailableServiceInstancesAsync([&](const CallStatus &_status,
@@ -135,8 +143,8 @@ void DBusInstanceAvailabilityStatusChangedEvent::onFirstListenerAdded(const List
}
void DBusInstanceAvailabilityStatusChangedEvent::onLastListenerRemoved(const Listener&) {
- proxy_.removeSignalMemberHandler(interfacesAddedSubscription_, this);
- proxy_.removeSignalMemberHandler(interfacesRemovedSubscription_, this);
+ proxy_.removeSignalMemberHandler(interfacesAddedSubscription_, signalHandler_.get());
+ proxy_.removeSignalMemberHandler(interfacesRemovedSubscription_, signalHandler_.get());
}
void DBusInstanceAvailabilityStatusChangedEvent::onInterfacesAddedSignal(const DBusMessage &_message) {
@@ -158,7 +166,10 @@ void DBusInstanceAvailabilityStatusChangedEvent::onInterfacesAddedSignal(const D
if (dbusInputStream.hasError()) {
COMMONAPI_ERROR(std::string(__FUNCTION__) + " failed to read interface name");
}
- if(dbusInterfaceName == observedDbusInterfaceName_ && addInterface(dbusObjectPath, dbusInterfaceName)) {
+ if(auto itsProxy = proxyWeakPtr_.lock() &&
+ dbusInterfaceName == observedDbusInterfaceName_ &&
+ addInterface(dbusObjectPath, dbusInterfaceName)) {
+ (void)itsProxy;
notifyInterfaceStatusChanged(dbusObjectPath, dbusInterfaceName, AvailabilityStatus::AVAILABLE);
}
}
@@ -181,7 +192,10 @@ void DBusInstanceAvailabilityStatusChangedEvent::onInterfacesRemovedSignal(const
}
for (const auto& dbusInterfaceName : dbusInterfaceNames) {
- if(dbusInterfaceName == observedDbusInterfaceName_ && removeInterface(dbusObjectPath, dbusInterfaceName)) {
+ if(auto itsProxy = proxyWeakPtr_.lock() &&
+ dbusInterfaceName == observedDbusInterfaceName_ &&
+ removeInterface(dbusObjectPath, dbusInterfaceName)) {
+ (void)itsProxy;
notifyInterfaceStatusChanged(dbusObjectPath, dbusInterfaceName, AvailabilityStatus::NOT_AVAILABLE);
}
}
@@ -198,9 +212,6 @@ void DBusInstanceAvailabilityStatusChangedEvent::notifyInterfaceStatusChanged(
DBusAddressTranslator::get()->translate(itsDBusAddress, itsAddress);
- // ensure, the proxy and the event survives until notification is done
- auto itsProxy = proxy_.shared_from_this();
-
notifyListeners(itsAddress.getAddress(), _availability);
}