diff --git a/src/xswiftbus/dbusconnection.cpp b/src/xswiftbus/dbusconnection.cpp index 657e93861..a4567a3f5 100644 --- a/src/xswiftbus/dbusconnection.cpp +++ b/src/xswiftbus/dbusconnection.cpp @@ -99,9 +99,16 @@ namespace XSwiftBus return m_connection && dbus_connection_get_is_connected(m_connection.get()); } - void CDBusConnection::registerDisconnectedCallback(DisconnectedCallback func) + void CDBusConnection::registerDisconnectedCallback(CDBusObject *obj, DisconnectedCallback func) { - m_disconnectedCallbacks.push_back(func); + m_disconnectedCallbacks[obj] = func; + } + + void CDBusConnection::unregisterDisconnectedCallback(CDBusObject *obj) + { + auto it = m_disconnectedCallbacks.find(obj); + if (it == m_disconnectedCallbacks.end()) { return; } + m_disconnectedCallbacks.erase(it); } void CDBusConnection::registerObjectPath(CDBusObject *object, const std::string &interfaceName, const std::string &objectPath, const DBusObjectPathVTable &dbusObjectPathVTable) @@ -166,9 +173,9 @@ namespace XSwiftBus if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")) { - for (const auto &cb : obj->m_disconnectedCallbacks) + for (auto it = obj->m_disconnectedCallbacks.begin(); it != obj->m_disconnectedCallbacks.end(); ++it) { - cb(); + it->second(); } return DBUS_HANDLER_RESULT_HANDLED; } diff --git a/src/xswiftbus/dbusconnection.h b/src/xswiftbus/dbusconnection.h index 2a26d1234..c71747007 100644 --- a/src/xswiftbus/dbusconnection.h +++ b/src/xswiftbus/dbusconnection.h @@ -19,7 +19,6 @@ #include #include #include -#include #include namespace XSwiftBus @@ -64,7 +63,10 @@ namespace XSwiftBus bool isConnected() const; //! Register a disconnected callback - void registerDisconnectedCallback(DisconnectedCallback func); + void registerDisconnectedCallback(CDBusObject *obj, DisconnectedCallback func); + + //! Register a disconnected callback + void unregisterDisconnectedCallback(CDBusObject *obj); //! Register DBus object with interfaceName and objectPath. //! \param object @@ -98,7 +100,7 @@ namespace XSwiftBus CDBusDispatcher *m_dispatcher = nullptr; std::unique_ptr m_connection; CDBusError m_lastError; - std::vector m_disconnectedCallbacks; + std::unordered_map m_disconnectedCallbacks; }; } diff --git a/src/xswiftbus/dbusobject.cpp b/src/xswiftbus/dbusobject.cpp index b494bf6ba..ae7bc53d5 100644 --- a/src/xswiftbus/dbusobject.cpp +++ b/src/xswiftbus/dbusobject.cpp @@ -15,14 +15,17 @@ namespace XSwiftBus CDBusObject::CDBusObject() { } - CDBusObject::~CDBusObject() = default; + CDBusObject::~CDBusObject() + { + m_dbusConnection->unregisterDisconnectedCallback(this); + }; void CDBusObject::setDBusConnection(const std::shared_ptr &dbusConnection) { m_dbusConnection = dbusConnection; dbusConnectedHandler(); CDBusConnection::DisconnectedCallback disconnectedHandler = std::bind(&CDBusObject::dbusDisconnectedHandler, this); - m_dbusConnection->registerDisconnectedCallback(disconnectedHandler); + m_dbusConnection->registerDisconnectedCallback(this, disconnectedHandler); } void CDBusObject::registerDBusObjectPath(const std::string &interfaceName, const std::string &objectPath)