Correct instantiation of internal attribute
[profile/ivi/common-api-dbus-runtime.git] / src / CommonAPI / DBus / DBusProxy.cpp
1 /* Copyright (C) 2013 BMW Group
2  * Author: Manfred Bathelt (manfred.bathelt@bmw.de)
3  * Author: Juergen Gehring (juergen.gehring@bmw.de)
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 // Workaround for libstdc++ bug
8 #ifndef _GLIBCXX_USE_NANOSLEEP
9 #define _GLIBCXX_USE_NANOSLEEP
10 #endif
11
12 #include "DBusProxy.h"
13 #include "DBusUtils.h"
14
15 #include <cassert>
16
17
18 namespace CommonAPI {
19 namespace DBus {
20
21 DBusProxyStatusEvent::DBusProxyStatusEvent(DBusProxy* dbusProxy) :
22                 dbusProxy_(dbusProxy) {
23 }
24
25 void DBusProxyStatusEvent::onListenerAdded(const CancellableListener& listener) {
26     if (dbusProxy_->isAvailable())
27         listener(AvailabilityStatus::AVAILABLE);
28 }
29
30
31 DBusProxy::DBusProxy(const std::string& commonApiAddress,
32                      const std::string& dbusInterfaceName,
33                      const std::string& dbusBusName,
34                      const std::string& dbusObjectPath,
35                      const std::shared_ptr<DBusProxyConnection>& dbusConnection):
36                 DBusProxyBase(dbusConnection),
37                 commonApiServiceId_(split(commonApiAddress, ':')[1]),
38                 commonApiParticipantId_(split(commonApiAddress, ':')[2]),
39                 dbusBusName_(dbusBusName),
40                 dbusObjectPath_(dbusObjectPath),
41                 dbusInterfaceName_(dbusInterfaceName),
42                 dbusProxyStatusEvent_(this),
43                 availabilityStatus_(AvailabilityStatus::UNKNOWN),
44                 interfaceVersionAttribute_(*this, "getInterfaceVersion", "uu"),
45                 dbusServiceRegistry_(dbusConnection->getDBusServiceRegistry()) {
46
47     const std::string commonApiDomain = split(commonApiAddress, ':')[0];
48     assert(commonApiDomain == "local");
49
50     dbusServiceRegistrySubscription_ = dbusServiceRegistry_->subscribeAvailabilityListener(
51                     commonApiAddress,
52                     std::bind(&DBusProxy::onDBusServiceInstanceStatus, this, std::placeholders::_1));
53 }
54
55 DBusProxy::~DBusProxy() {
56     dbusServiceRegistry_->unsubscribeAvailabilityListener(
57                     getAddress(),
58                     dbusServiceRegistrySubscription_);
59 }
60
61 bool DBusProxy::isAvailable() const {
62     return (availabilityStatus_ == AvailabilityStatus::AVAILABLE);
63 }
64
65 bool DBusProxy::isAvailableBlocking() const {
66     if (availabilityStatus_ == AvailabilityStatus::UNKNOWN) {
67         std::chrono::milliseconds singleWaitDuration(2);
68
69         // Wait for the service registry
70         while (availabilityStatus_ == AvailabilityStatus::UNKNOWN) {
71             std::this_thread::sleep_for(singleWaitDuration);
72         }
73     }
74
75     return isAvailable();
76 }
77
78 ProxyStatusEvent& DBusProxy::getProxyStatusEvent() {
79     return dbusProxyStatusEvent_;
80 }
81
82 InterfaceVersionAttribute& DBusProxy::getInterfaceVersionAttribute() {
83     return interfaceVersionAttribute_;
84 }
85
86 void DBusProxy::onDBusServiceInstanceStatus(const AvailabilityStatus& availabilityStatus) {
87     availabilityStatus_ = availabilityStatus;
88     dbusProxyStatusEvent_.notifyListeners(availabilityStatus);
89 }
90
91 const std::string& DBusProxy::getDBusBusName() const {
92     return dbusBusName_;
93 }
94
95 const std::string& DBusProxy::getDBusObjectPath() const {
96     return dbusObjectPath_;
97 }
98
99 const std::string& DBusProxy::getInterfaceName() const {
100     return dbusInterfaceName_;
101 }
102
103 const std::string& DBusProxy::getDomain() const {
104     return commonApiDomain_;
105 }
106
107 const std::string& DBusProxy::getServiceId() const {
108     return commonApiServiceId_;
109 }
110
111 const std::string& DBusProxy::getInstanceId() const {
112     return commonApiParticipantId_;
113 }
114
115 std::string DBusProxy::getAddress() const {
116     return commonApiDomain_ + ":" + commonApiServiceId_ + ":" + commonApiParticipantId_;
117 }
118
119 } // namespace DBus
120 } // namespace CommonAPI