summaryrefslogtreecommitdiff
path: root/include/CommonAPI/DBus/DBusConnection.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/CommonAPI/DBus/DBusConnection.hpp')
-rw-r--r--include/CommonAPI/DBus/DBusConnection.hpp187
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_;
+
};