diff options
Diffstat (limited to 'include/CommonAPI/DBus/DBusConnection.hpp')
-rw-r--r-- | include/CommonAPI/DBus/DBusConnection.hpp | 187 |
1 files changed, 101 insertions, 86 deletions
diff --git a/include/CommonAPI/DBus/DBusConnection.hpp b/include/CommonAPI/DBus/DBusConnection.hpp index 97cb069..e3608da 100644 --- a/include/CommonAPI/DBus/DBusConnection.hpp +++ b/include/CommonAPI/DBus/DBusConnection.hpp @@ -11,11 +11,13 @@ #define COMMONAPI_DBUS_DBUS_CONNECTION_HPP_ #include <atomic> +#include <mutex> #include <dbus/dbus.h> #include <CommonAPI/DBus/DBusConfig.hpp> #include <CommonAPI/DBus/DBusDaemonProxy.hpp> +#include <CommonAPI/DBus/DBusMainLoop.hpp> #include <CommonAPI/DBus/DBusMainLoopContext.hpp> #include <CommonAPI/DBus/DBusObjectManager.hpp> #include <CommonAPI/DBus/DBusProxyConnection.hpp> @@ -24,10 +26,11 @@ namespace CommonAPI { namespace DBus { +class DBusMainLoop; class DBusObjectManager; class DBusConnectionStatusEvent - : public DBusProxyConnection::ConnectionStatusEvent { + : public DBusProxyConnection::ConnectionStatusEvent { public: DBusConnectionStatusEvent(DBusConnection* dbusConnection); virtual ~DBusConnectionStatusEvent() {} @@ -51,56 +54,56 @@ struct WatchContext { }; class DBusConnection - : public DBusProxyConnection, - public std::enable_shared_from_this<DBusConnection> { + : public DBusProxyConnection, + public std::enable_shared_from_this<DBusConnection> { public: - COMMONAPI_EXPORT static std::shared_ptr<DBusConnection> getBus(const DBusType_t &_type); - COMMONAPI_EXPORT static std::shared_ptr<DBusConnection> wrap(::DBusConnection *_connection); + COMMONAPI_EXPORT static std::shared_ptr<DBusConnection> getBus(const DBusType_t &_type); + COMMONAPI_EXPORT static std::shared_ptr<DBusConnection> wrap(::DBusConnection *_connection); - COMMONAPI_EXPORT DBusConnection(DBusType_t _type); - COMMONAPI_EXPORT DBusConnection(const DBusConnection&) = delete; - COMMONAPI_EXPORT DBusConnection(::DBusConnection* libDbusConnection); - COMMONAPI_EXPORT virtual ~DBusConnection(); + COMMONAPI_EXPORT DBusConnection(DBusType_t _type); + COMMONAPI_EXPORT DBusConnection(const DBusConnection&) = delete; + COMMONAPI_EXPORT DBusConnection(::DBusConnection* libDbusConnection); + COMMONAPI_EXPORT virtual ~DBusConnection(); - COMMONAPI_EXPORT DBusConnection& operator=(const DBusConnection&) = delete; + COMMONAPI_EXPORT DBusConnection& operator=(const DBusConnection&) = delete; - COMMONAPI_EXPORT DBusType_t getBusType() const; + COMMONAPI_EXPORT DBusType_t getBusType() const; - COMMONAPI_EXPORT bool connect(bool startDispatchThread = true); - COMMONAPI_EXPORT bool connect(DBusError& dbusError, bool startDispatchThread = true); - COMMONAPI_EXPORT void disconnect(); + COMMONAPI_EXPORT bool connect(bool startDispatchThread = true); + COMMONAPI_EXPORT bool connect(DBusError& dbusError, bool startDispatchThread = true); + COMMONAPI_EXPORT void disconnect(); - COMMONAPI_EXPORT virtual bool isConnected() const; + COMMONAPI_EXPORT virtual bool isConnected() const; - COMMONAPI_EXPORT virtual ConnectionStatusEvent& getConnectionStatusEvent(); + COMMONAPI_EXPORT virtual ConnectionStatusEvent& getConnectionStatusEvent(); - COMMONAPI_EXPORT virtual bool requestServiceNameAndBlock(const std::string& serviceName) const; - COMMONAPI_EXPORT virtual bool releaseServiceName(const std::string& serviceName) const; + COMMONAPI_EXPORT virtual bool requestServiceNameAndBlock(const std::string& serviceName) const; + COMMONAPI_EXPORT virtual bool releaseServiceName(const std::string& serviceName) const; - COMMONAPI_EXPORT bool sendDBusMessage(const DBusMessage& dbusMessage/*, uint32_t* allocatedSerial = NULL*/) const; + COMMONAPI_EXPORT bool sendDBusMessage(const DBusMessage& dbusMessage/*, uint32_t* allocatedSerial = NULL*/) const; - COMMONAPI_EXPORT std::future<CallStatus> sendDBusMessageWithReplyAsync( + COMMONAPI_EXPORT std::future<CallStatus> sendDBusMessageWithReplyAsync( const DBusMessage& dbusMessage, std::unique_ptr<DBusMessageReplyAsyncHandler> dbusMessageReplyAsyncHandler, - const CommonAPI::CallInfo *_info) const; + const CommonAPI::CallInfo *_info) const; - COMMONAPI_EXPORT DBusMessage sendDBusMessageWithReplyAndBlock(const DBusMessage& dbusMessage, + COMMONAPI_EXPORT DBusMessage sendDBusMessageWithReplyAndBlock(const DBusMessage& dbusMessage, DBusError& dbusError, - const CommonAPI::CallInfo *_info) const; + const CommonAPI::CallInfo *_info) const; - COMMONAPI_EXPORT virtual bool addObjectManagerSignalMemberHandler(const std::string& dbusBusName, + COMMONAPI_EXPORT virtual bool addObjectManagerSignalMemberHandler(const std::string& dbusBusName, DBusSignalHandler* dbusSignalHandler); - COMMONAPI_EXPORT virtual bool removeObjectManagerSignalMemberHandler(const std::string& dbusBusName, + COMMONAPI_EXPORT virtual bool removeObjectManagerSignalMemberHandler(const std::string& dbusBusName, DBusSignalHandler* dbusSignalHandler); - COMMONAPI_EXPORT DBusSignalHandlerToken addSignalMemberHandler(const std::string& objectPath, + COMMONAPI_EXPORT DBusSignalHandlerToken addSignalMemberHandler(const std::string& objectPath, const std::string& interfaceName, const std::string& interfaceMemberName, const std::string& inuint32_tterfaceMemberSignature, DBusSignalHandler* dbusSignalHandler, const bool justAddFilter = false); - COMMONAPI_EXPORT DBusProxyConnection::DBusSignalHandlerToken subscribeForSelectiveBroadcast(bool& subscriptionAccepted, + COMMONAPI_EXPORT DBusProxyConnection::DBusSignalHandlerToken subscribeForSelectiveBroadcast(bool& subscriptionAccepted, const std::string& objectPath, const std::string& interfaceName, const std::string& interfaceMemberName, @@ -108,37 +111,41 @@ public: DBusSignalHandler* dbusSignalHandler, DBusProxy* callingProxy); - COMMONAPI_EXPORT void unsubscribeFromSelectiveBroadcast(const std::string& eventName, + COMMONAPI_EXPORT void unsubscribeFromSelectiveBroadcast(const std::string& eventName, DBusProxyConnection::DBusSignalHandlerToken subscription, DBusProxy* callingProxy, const DBusSignalHandler* dbusSignalHandler); - COMMONAPI_EXPORT void registerObjectPath(const std::string& objectPath); - COMMONAPI_EXPORT void unregisterObjectPath(const std::string& objectPath); + COMMONAPI_EXPORT void registerObjectPath(const std::string& objectPath); + COMMONAPI_EXPORT void unregisterObjectPath(const std::string& objectPath); - COMMONAPI_EXPORT bool removeSignalMemberHandler(const DBusSignalHandlerToken& dbusSignalHandlerToken, + COMMONAPI_EXPORT bool removeSignalMemberHandler(const DBusSignalHandlerToken& dbusSignalHandlerToken, const DBusSignalHandler* dbusSignalHandler = NULL); - COMMONAPI_EXPORT bool readWriteDispatch(int timeoutMilliseconds = -1); + COMMONAPI_EXPORT bool readWriteDispatch(int timeoutMilliseconds = -1); - COMMONAPI_EXPORT virtual const std::shared_ptr<DBusObjectManager> getDBusObjectManager(); + COMMONAPI_EXPORT virtual const std::shared_ptr<DBusObjectManager> getDBusObjectManager(); - COMMONAPI_EXPORT void setObjectPathMessageHandler(DBusObjectPathMessageHandler); - COMMONAPI_EXPORT bool isObjectPathMessageHandlerSet(); + COMMONAPI_EXPORT void setObjectPathMessageHandler(DBusObjectPathMessageHandler); + COMMONAPI_EXPORT bool isObjectPathMessageHandlerSet(); - COMMONAPI_EXPORT virtual bool attachMainLoopContext(std::weak_ptr<MainLoopContext>); + COMMONAPI_EXPORT virtual bool attachMainLoopContext(std::weak_ptr<MainLoopContext>); - COMMONAPI_EXPORT bool isDispatchReady(); - COMMONAPI_EXPORT bool singleDispatch(); + COMMONAPI_EXPORT bool isDispatchReady(); + COMMONAPI_EXPORT bool singleDispatch(); - COMMONAPI_EXPORT virtual bool hasDispatchThread(); + COMMONAPI_EXPORT virtual bool hasDispatchThread(); - typedef std::tuple<std::string, std::string, std::string> DBusSignalMatchRuleTuple; - typedef std::pair<uint32_t, std::string> DBusSignalMatchRuleMapping; - typedef std::unordered_map<DBusSignalMatchRuleTuple, DBusSignalMatchRuleMapping> DBusSignalMatchRulesMap; +#ifdef COMMONAPI_DBUS_TEST + inline std::weak_ptr<DBusMainloop> getLoop() { return loop_; } +#endif + + typedef std::tuple<std::string, std::string, std::string> DBusSignalMatchRuleTuple; + typedef std::pair<uint32_t, std::string> DBusSignalMatchRuleMapping; + typedef std::unordered_map<DBusSignalMatchRuleTuple, DBusSignalMatchRuleMapping> DBusSignalMatchRulesMap; private: - COMMONAPI_EXPORT void dispatch(); - COMMONAPI_EXPORT void suspendDispatching() const; - COMMONAPI_EXPORT void resumeDispatching() const; + COMMONAPI_EXPORT void dispatch(); + COMMONAPI_EXPORT void suspendDispatching() const; + COMMONAPI_EXPORT void resumeDispatching() const; std::thread* dispatchThread_; bool stopDispatching_; @@ -151,46 +158,46 @@ public: mutable bool pauseDispatching_; mutable std::mutex dispatchSuspendLock_; - COMMONAPI_EXPORT void addLibdbusSignalMatchRule(const std::string& objectPath, + COMMONAPI_EXPORT void addLibdbusSignalMatchRule(const std::string& objectPath, const std::string& interfaceName, const std::string& interfaceMemberName, const bool justAddFilter = false); - COMMONAPI_EXPORT void removeLibdbusSignalMatchRule(const std::string& objectPath, + COMMONAPI_EXPORT void removeLibdbusSignalMatchRule(const std::string& objectPath, const std::string& interfaceName, const std::string& interfaceMemberName); - COMMONAPI_EXPORT void initLibdbusSignalFilterAfterConnect(); + COMMONAPI_EXPORT void initLibdbusSignalFilterAfterConnect(); ::DBusHandlerResult onLibdbusSignalFilter(::DBusMessage* libdbusMessage); - COMMONAPI_EXPORT void initLibdbusObjectPathHandlerAfterConnect(); + COMMONAPI_EXPORT void initLibdbusObjectPathHandlerAfterConnect(); ::DBusHandlerResult onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage); COMMONAPI_EXPORT static DBusMessage convertToDBusMessage(::DBusPendingCall* _libdbusPendingCall, - CallStatus& _callStatus); - COMMONAPI_EXPORT static void onLibdbusPendingCallNotifyThunk(::DBusPendingCall* libdbusPendingCall, void* userData); - COMMONAPI_EXPORT static void onLibdbusDataCleanup(void* userData); + CallStatus& _callStatus); + COMMONAPI_EXPORT static void onLibdbusPendingCallNotifyThunk(::DBusPendingCall* libdbusPendingCall, void* userData); + COMMONAPI_EXPORT static void onLibdbusDataCleanup(void* userData); - COMMONAPI_EXPORT static ::DBusHandlerResult onLibdbusObjectPathMessageThunk(::DBusConnection* libdbusConnection, + COMMONAPI_EXPORT static ::DBusHandlerResult onLibdbusObjectPathMessageThunk(::DBusConnection* libdbusConnection, ::DBusMessage* libdbusMessage, void* userData); - COMMONAPI_EXPORT static ::DBusHandlerResult onLibdbusSignalFilterThunk(::DBusConnection* libdbusConnection, + COMMONAPI_EXPORT static ::DBusHandlerResult onLibdbusSignalFilterThunk(::DBusConnection* libdbusConnection, ::DBusMessage* libdbusMessage, void* userData); - COMMONAPI_EXPORT static dbus_bool_t onAddWatch(::DBusWatch* libdbusWatch, void* data); - COMMONAPI_EXPORT static void onRemoveWatch(::DBusWatch* libdbusWatch, void* data); - COMMONAPI_EXPORT static void onToggleWatch(::DBusWatch* libdbusWatch, void* data); + COMMONAPI_EXPORT static dbus_bool_t onAddWatch(::DBusWatch* libdbusWatch, void* data); + COMMONAPI_EXPORT static void onRemoveWatch(::DBusWatch* libdbusWatch, void* data); + COMMONAPI_EXPORT static void onToggleWatch(::DBusWatch* libdbusWatch, void* data); - COMMONAPI_EXPORT static dbus_bool_t onAddTimeout(::DBusTimeout* dbus_timeout, void* data); - COMMONAPI_EXPORT static void onRemoveTimeout(::DBusTimeout* dbus_timeout, void* data); - COMMONAPI_EXPORT static void onToggleTimeout(::DBusTimeout* dbus_timeout, void* data); + COMMONAPI_EXPORT static dbus_bool_t onAddTimeout(::DBusTimeout* dbus_timeout, void* data); + COMMONAPI_EXPORT static void onRemoveTimeout(::DBusTimeout* dbus_timeout, void* data); + COMMONAPI_EXPORT static void onToggleTimeout(::DBusTimeout* dbus_timeout, void* data); - COMMONAPI_EXPORT static void onWakeupMainContext(void* data); + COMMONAPI_EXPORT static void onWakeupMainContext(void* data); - COMMONAPI_EXPORT void enforceAsynchronousTimeouts() const; - COMMONAPI_EXPORT static const DBusObjectPathVTable* getDBusObjectPathVTable(); + COMMONAPI_EXPORT void enforceAsynchronousTimeouts() const; + COMMONAPI_EXPORT static const DBusObjectPathVTable* getDBusObjectPathVTable(); ::DBusConnection* connection_; mutable std::mutex connectionGuard_; @@ -213,11 +220,11 @@ public: std::unordered_multimap<std::string, DBusSignalHandler*> dbusObjectManagerSignalHandlerTable_; std::mutex dbusObjectManagerSignalGuard_; - COMMONAPI_EXPORT bool addObjectManagerSignalMatchRule(const std::string& dbusBusName); - COMMONAPI_EXPORT bool removeObjectManagerSignalMatchRule(const std::string& dbusBusName); + COMMONAPI_EXPORT bool addObjectManagerSignalMatchRule(const std::string& dbusBusName); + COMMONAPI_EXPORT bool removeObjectManagerSignalMatchRule(const std::string& dbusBusName); - COMMONAPI_EXPORT bool addLibdbusSignalMatchRule(const std::string& dbusMatchRule); - COMMONAPI_EXPORT bool removeLibdbusSignalMatchRule(const std::string& dbusMatchRule); + COMMONAPI_EXPORT bool addLibdbusSignalMatchRule(const std::string& dbusMatchRule); + COMMONAPI_EXPORT bool removeLibdbusSignalMatchRule(const std::string& dbusMatchRule); std::atomic_size_t libdbusSignalMatchRulesCount_; @@ -230,29 +237,30 @@ public: mutable std::unordered_map<std::string, uint16_t> connectionNameCount_; typedef std::pair< - DBusPendingCall*, - std::tuple< - std::chrono::time_point<std::chrono::high_resolution_clock>, - DBusMessageReplyAsyncHandler*, - DBusMessage - > - > TimeoutMapElement; + DBusPendingCall*, + std::tuple< + std::chrono::time_point<std::chrono::high_resolution_clock>, + DBusMessageReplyAsyncHandler*, + DBusMessage + > + > TimeoutMapElement; mutable std::map< - DBusPendingCall*, - std::tuple< - std::chrono::time_point<std::chrono::high_resolution_clock>, - DBusMessageReplyAsyncHandler*, - DBusMessage - > - > timeoutMap_; + DBusPendingCall*, + std::tuple< + std::chrono::time_point<std::chrono::high_resolution_clock>, + DBusMessageReplyAsyncHandler*, + DBusMessage + > + > timeoutMap_; typedef std::tuple< - DBusMessageReplyAsyncHandler *, - DBusMessage, - CommonAPI::CallStatus, - ::DBusPendingCall* - > MainloopTimeout_t; + DBusMessageReplyAsyncHandler *, + DBusMessage, + CommonAPI::CallStatus, + ::DBusPendingCall* + > MainloopTimeout_t; mutable std::list<MainloopTimeout_t> mainloopTimeouts_; + mutable std::mutex mainloopTimeoutsMutex_; mutable std::mutex enforceTimeoutMutex_; mutable std::condition_variable enforceTimeoutCondition_; @@ -260,6 +268,13 @@ public: mutable std::shared_ptr<std::thread> enforcerThread_; mutable std::mutex enforcerThreadMutex_; bool enforcerThreadCancelled_; + + std::shared_ptr<DBusMainLoop> loop_; + + // set contains asyncHandlers with infinite timeout + mutable std::set<DBusMessageReplyAsyncHandler*> timeoutInfiniteAsyncHandlers_; + mutable std::mutex timeoutInfiniteAsyncHandlersMutex_; + }; |