switch DBusProxy to DBusProxyBase
[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 "DBusServiceRegistry.h"
14 #include "DBusUtils.h"
15
16 #include <cassert>
17
18
19 namespace CommonAPI {
20 namespace DBus {
21
22 DBusProxyStatusEvent::DBusProxyStatusEvent(DBusProxy* dbusProxy) :
23                 dbusProxy_(dbusProxy) {
24 }
25
26 void DBusProxyStatusEvent::onListenerAdded(const CancellableListener& listener) {
27     if (dbusProxy_->isAvailable())
28         listener(AvailabilityStatus::AVAILABLE);
29 }
30
31
32 DBusProxy::DBusProxy(const std::string& commonApiAddress,
33                      const std::string& dbusInterfaceName,
34                      const std::string& dbusBusName,
35                      const std::string& dbusObjectPath,
36                      const std::shared_ptr<DBusProxyConnection>& dbusConnection):
37                 DBusProxyBase(split(commonApiAddress, ':')[1],
38                               split(commonApiAddress, ':')[2],
39                               dbusInterfaceName,
40                               dbusBusName,
41                               dbusObjectPath,
42                               dbusConnection),
43                 dbusProxyStatusEvent_(this),
44                 availabilityStatus_(AvailabilityStatus::UNKNOWN),
45                 interfaceVersionAttribute_(*this, "getInterfaceVersion") {
46     const std::string commonApiDomain = split(commonApiAddress, ':')[0];
47     assert(commonApiDomain == "local");
48
49     dbusServiceStatusEventSubscription_ = dbusConnection->getDBusServiceRegistry()->getServiceStatusEvent().subscribe(
50                     commonApiAddress,
51                     std::bind(&DBusProxy::onServiceStatusEvent, this, std::placeholders::_1, std::placeholders::_2));
52 }
53
54 DBusProxy::~DBusProxy() {
55     getDBusConnection()->getDBusServiceRegistry()->getServiceStatusEvent().unsubscribe(dbusServiceStatusEventSubscription_);
56 }
57
58 bool DBusProxy::isAvailable() const {
59     return (availabilityStatus_ == AvailabilityStatus::AVAILABLE);
60 }
61
62 bool DBusProxy::isAvailableBlocking() const {
63     if (availabilityStatus_ == AvailabilityStatus::UNKNOWN) {
64         std::chrono::milliseconds singleWaitDuration(100);
65
66         // Wait for the service registry
67         while (availabilityStatus_ == AvailabilityStatus::UNKNOWN) {
68             std::this_thread::sleep_for(singleWaitDuration);
69         }
70     }
71
72     return isAvailable();
73 }
74
75 ProxyStatusEvent& DBusProxy::getProxyStatusEvent() {
76     return dbusProxyStatusEvent_;
77 }
78
79 InterfaceVersionAttribute& DBusProxy::getInterfaceVersionAttribute() {
80     return interfaceVersionAttribute_;
81 }
82
83 SubscriptionStatus DBusProxy::onServiceStatusEvent(const std::string& name, const AvailabilityStatus& availabilityStatus) {
84     availabilityStatus_ = availabilityStatus;
85
86     dbusProxyStatusEvent_.notifyListeners(availabilityStatus);
87
88     return SubscriptionStatus::RETAIN;
89 }
90
91 } // namespace DBus
92 } // namespace CommonAPI