1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 #ifndef COMMONAPI_DBUS_DBUS_CONNECTION_H_
5 #define COMMONAPI_DBUS_DBUS_CONNECTION_H_
7 #include "DBusProxyConnection.h"
8 #include "DBusDaemonProxy.h"
9 #include "DBusServiceRegistry.h"
10 #include "DBusObjectManager.h"
12 #include <dbus/dbus.h>
19 class DBusObjectManager;
21 class DBusConnectionStatusEvent: public Event<AvailabilityStatus> {
22 friend class DBusConnection;
26 class DBusConnection: public DBusProxyConnection, public std::enable_shared_from_this<DBusConnection> {
29 SESSION = DBUS_BUS_SESSION,
30 SYSTEM = DBUS_BUS_SYSTEM,
31 STARTER = DBUS_BUS_STARTER,
35 inline static std::shared_ptr<DBusConnection> getBus(const BusType& busType);
36 inline static std::shared_ptr<DBusConnection> wrapLibDBus(::DBusConnection* libDbusConnection);
37 inline static std::shared_ptr<DBusConnection> getSessionBus();
38 inline static std::shared_ptr<DBusConnection> getSystemBus();
39 inline static std::shared_ptr<DBusConnection> getStarterBus();
41 DBusConnection(const DBusConnection&) = delete;
42 DBusConnection(::DBusConnection* libDbusConnection);
44 DBusConnection& operator=(const DBusConnection&) = delete;
45 virtual ~DBusConnection();
47 BusType getBusType() const;
50 bool connect(DBusError& dbusError);
53 virtual bool isConnected() const;
55 virtual DBusConnectionStatusEvent& getConnectionStatusEvent();
57 virtual bool requestServiceNameAndBlock(const std::string& serviceName) const;
58 virtual bool releaseServiceName(const std::string& serviceName) const;
60 bool sendDBusMessage(const DBusMessage& dbusMessage, uint32_t* allocatedSerial = NULL) const;
62 static const int kDefaultSendTimeoutMs = 100 * 1000;
64 std::future<CallStatus> sendDBusMessageWithReplyAsync(
65 const DBusMessage& dbusMessage,
66 std::unique_ptr<DBusMessageReplyAsyncHandler> dbusMessageReplyAsyncHandler,
67 int timeoutMilliseconds = kDefaultSendTimeoutMs) const;
69 DBusMessage sendDBusMessageWithReplyAndBlock(const DBusMessage& dbusMessage,
71 int timeoutMilliseconds = kDefaultSendTimeoutMs) const;
73 DBusSignalHandlerToken addSignalMemberHandler(const std::string& objectPath,
74 const std::string& interfaceName,
75 const std::string& interfaceMemberName,
76 const std::string& interfaceMemberSignature,
77 DBusSignalHandler* dbusSignalHandler);
79 void registerObjectPath(const std::string& objectPath);
80 void unregisterObjectPath(const std::string& objectPath);
82 void removeSignalMemberHandler(const DBusSignalHandlerToken& dbusSignalHandlerToken);
84 bool readWriteDispatch(int timeoutMilliseconds = -1);
86 virtual const std::shared_ptr<DBusDaemonProxy>& getDBusDaemonProxy();
87 virtual const std::shared_ptr<DBusServiceRegistry>& getDBusServiceRegistry();
88 virtual const std::shared_ptr<DBusObjectManager>& getDBusObjectManager();
93 std::thread dispatchThread_;
94 bool stopDispatching_;
96 DBusConnection(BusType busType);
98 void addLibdbusSignalMatchRule(const std::string& objectPath,
99 const std::string& interfaceName,
100 const std::string& interfaceMemberName);
102 void removeLibdbusSignalMatchRule(const std::string& objectPath,
103 const std::string& interfaceName,
104 const std::string& interfaceMemberName);
106 void initLibdbusObjectPathHandlerAfterConnect();
108 void initLibdbusSignalFilterAfterConnect();
110 ::DBusHandlerResult onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage) const;
112 ::DBusHandlerResult onLibdbusSignalFilter(::DBusMessage* libdbusMessage);
114 static void onLibdbusPendingCallNotifyThunk(::DBusPendingCall* libdbusPendingCall, void *userData);
115 static void onLibdbusDataCleanup(void* userData);
117 static ::DBusHandlerResult onLibdbusObjectPathMessageThunk(::DBusConnection* libdbusConnection,
118 ::DBusMessage* libdbusMessage,
121 static ::DBusHandlerResult onLibdbusSignalFilterThunk(::DBusConnection* libdbusConnection,
122 ::DBusMessage* libdbusMessage,
127 ::DBusConnection* libdbusConnection_;
129 std::shared_ptr<DBusDaemonProxy> dbusDaemonProxy_;
130 std::shared_ptr<DBusServiceRegistry> dbusServiceRegistry_;
131 std::shared_ptr<DBusObjectManager> dbusObjectManager_;
133 DBusConnectionStatusEvent dbusConnectionStatusEvent_;
135 typedef std::tuple<std::string, std::string, std::string> DBusSignalMatchRuleTuple;
136 typedef std::pair<uint32_t, std::string> DBusSignalMatchRuleMapping;
137 typedef std::unordered_map<DBusSignalMatchRuleTuple, DBusSignalMatchRuleMapping> DBusSignalMatchRulesMap;
138 DBusSignalMatchRulesMap dbusSignalMatchRulesMap_;
140 bool isLibdbusSignalFilterAdded_;
142 DBusSignalHandlerTable dbusSignalHandlerTable_;
144 // referenceCount, objectPath
145 typedef std::unordered_map<std::string, uint32_t> LibdbusRegisteredObjectPathHandlersTable;
146 LibdbusRegisteredObjectPathHandlersTable libdbusRegisteredObjectPaths_;
148 static DBusObjectPathVTable libdbusObjectPathVTable_;
151 std::shared_ptr<DBusConnection> DBusConnection::getBus(const BusType& busType) {
152 return std::shared_ptr<DBusConnection>(new DBusConnection(busType));
155 std::shared_ptr<DBusConnection> DBusConnection::wrapLibDBus(::DBusConnection* libDbusConnection) {
156 return std::shared_ptr<DBusConnection>(new DBusConnection(libDbusConnection));
159 std::shared_ptr<DBusConnection> DBusConnection::getSessionBus() {
160 return getBus(BusType::SESSION);
163 std::shared_ptr<DBusConnection> DBusConnection::getSystemBus() {
164 return getBus(BusType::SYSTEM);
167 std::shared_ptr<DBusConnection> DBusConnection::getStarterBus() {
168 return getBus(BusType::STARTER);
173 } // namespace CommonAPI
175 #endif // COMMONAPI_DBUS_DBUS_CONNECTION_H_