Initial import to Git
[profile/ivi/common-api-dbus-runtime.git] / src / CommonAPI / DBus / DBusProxy.h
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_PROXY_H_
5 #define COMMONAPI_DBUS_DBUS_PROXY_H_
6
7 #include "DBusProxyConnection.h"
8 #include "DBusAttribute.h"
9
10 #include <CommonAPI/Proxy.h>
11 #include <CommonAPI/types.h>
12
13 #include <functional>
14 #include <memory>
15 #include <string>
16
17 namespace CommonAPI {
18 namespace DBus {
19
20 class DBusProxy;
21
22 typedef Event<AvailabilityStatus> ProxyStatusEvent;
23
24 class DBusProxyStatusEvent: public ProxyStatusEvent {
25  public:
26     DBusProxyStatusEvent(DBusProxy* dbusProxy);
27
28     void onFirstListenerAdded(const Listener& listener);
29     void onLastListenerRemoved(const Listener& listener);
30
31     Subscription subscribe(Listener listener);
32
33  private:
34     SubscriptionStatus onServiceAvailableSignalHandler(const std::string& name, const AvailabilityStatus& availabilityStatus);
35
36     DBusProxy* dbusProxy_;
37     DBusServiceStatusEvent::Subscription subscription_;
38
39     friend class DBusProxy;
40
41 };
42
43
44 class DBusProxy: public virtual CommonAPI::Proxy {
45  public:
46     DBusProxy(const std::string& dbusBusName,
47               const std::string& dbusObjectPath,
48               const std::string& interfaceName,
49               const std::shared_ptr<DBusProxyConnection>& dbusProxyConnection);
50
51     virtual std::string getAddress() const;
52     virtual const std::string& getDomain() const;
53     virtual const std::string& getServiceId() const;
54     virtual const std::string& getInstanceId() const;
55     virtual bool isAvailable() const;
56     virtual bool isAvailableBlocking() const;
57     virtual ProxyStatusEvent& getProxyStatusEvent();
58     virtual InterfaceVersionAttribute& getInterfaceVersionAttribute();
59
60     inline const std::string& getDBusBusName() const;
61     inline const std::string& getDBusObjectPath() const;
62     inline const std::string& getInterfaceName() const;
63     inline const std::shared_ptr<DBusProxyConnection>& getDBusConnection() const;
64
65     DBusMessage createMethodCall(const char* methodName,
66                                  const char* methodSignature = NULL) const;
67
68     inline DBusProxyConnection::DBusSignalHandlerToken addSignalMemberHandler(
69                 const std::string& signalName,
70                 const std::string& signalSignature,
71                 DBusProxyConnection::DBusSignalHandler* dbusSignalHandler);
72
73     inline void removeSignalMemberHandler(const DBusProxyConnection::DBusSignalHandlerToken& dbusSignalHandlerToken);
74
75  protected:
76     DBusProxy(const DBusProxy& abstractProxy) = delete;
77
78     DBusProxy(const std::string& busName,
79               const std::string& objectId,
80               const std::string& interfaceName,
81               const std::shared_ptr<DBusProxyConnection>& connection,
82               const bool isAlwaysAvailable);
83
84     virtual void getOwnVersion(uint16_t& ownVersionMajor, uint16_t& ownVersionMinor) const = 0;
85
86     DBusProxyStatusEvent statusEvent_;
87     DBusProxyStatusEvent::Subscription remoteStatusSubscription_;
88
89  private:
90     void onServiceAlive(bool alive);
91
92     const std::string dbusBusName_;
93     const std::string dbusObjectPath_;
94     const std::string interfaceName_;
95
96     mutable bool available_;
97     mutable bool availableSet_;
98
99     std::shared_ptr<DBusProxyConnection> connection_;
100
101     DBusReadonlyAttribute<InterfaceVersionAttribute> interfaceVersionAttribute_;
102
103     static const std::string domain_;
104
105     friend class DBusProxyStatusEvent;
106 };
107
108 const std::string& DBusProxy::getDBusBusName() const {
109     return dbusBusName_;
110 }
111
112 const std::string& DBusProxy::getDBusObjectPath() const {
113     return dbusObjectPath_;
114 }
115
116 const std::string& DBusProxy::getInterfaceName() const {
117     return interfaceName_;
118 }
119
120 const std::shared_ptr<DBusProxyConnection>& DBusProxy::getDBusConnection() const {
121     return connection_;
122 }
123
124 DBusProxyConnection::DBusSignalHandlerToken DBusProxy::addSignalMemberHandler(
125         const std::string& signalName,
126         const std::string& signalSignature,
127         DBusProxyConnection::DBusSignalHandler* dbusSignalHandler) {
128     return connection_->addSignalMemberHandler(dbusObjectPath_, getInterfaceName(), signalName, signalSignature, dbusSignalHandler);
129 }
130
131 void DBusProxy::removeSignalMemberHandler(const DBusProxyConnection::DBusSignalHandlerToken& dbusSignalHandlerToken) {
132     return connection_->removeSignalMemberHandler(dbusSignalHandlerToken);
133 }
134
135 } // namespace DBus
136 } // namespace CommonAPI
137
138 #endif // COMMONAPI_DBUS_DBUS_PROXY_H_
139