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
12 #include "DBusProxy.h"
13 #include "DBusUtils.h"
21 DBusProxyStatusEvent::DBusProxyStatusEvent(DBusProxy* dbusProxy) :
22 dbusProxy_(dbusProxy) {
25 void DBusProxyStatusEvent::onListenerAdded(const CancellableListener& listener) {
26 if (dbusProxy_->isAvailable())
27 listener(AvailabilityStatus::AVAILABLE);
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"),
45 dbusServiceRegistry_(dbusConnection->getDBusServiceRegistry()) {
47 const std::string commonApiDomain = split(commonApiAddress, ':')[0];
48 assert(commonApiDomain == "local");
50 dbusServiceRegistrySubscription_ = dbusServiceRegistry_->subscribeAvailabilityListener(
52 std::bind(&DBusProxy::onDBusServiceInstanceStatus, this, std::placeholders::_1));
55 DBusProxy::~DBusProxy() {
56 dbusServiceRegistry_->unsubscribeAvailabilityListener(
58 dbusServiceRegistrySubscription_);
61 bool DBusProxy::isAvailable() const {
62 return (availabilityStatus_ == AvailabilityStatus::AVAILABLE);
65 bool DBusProxy::isAvailableBlocking() const {
66 if (availabilityStatus_ == AvailabilityStatus::UNKNOWN) {
67 std::chrono::milliseconds singleWaitDuration(2);
69 // Wait for the service registry
70 while (availabilityStatus_ == AvailabilityStatus::UNKNOWN) {
71 std::this_thread::sleep_for(singleWaitDuration);
78 ProxyStatusEvent& DBusProxy::getProxyStatusEvent() {
79 return dbusProxyStatusEvent_;
82 InterfaceVersionAttribute& DBusProxy::getInterfaceVersionAttribute() {
83 return interfaceVersionAttribute_;
86 void DBusProxy::onDBusServiceInstanceStatus(const AvailabilityStatus& availabilityStatus) {
87 availabilityStatus_ = availabilityStatus;
88 dbusProxyStatusEvent_.notifyListeners(availabilityStatus);
91 const std::string& DBusProxy::getDBusBusName() const {
95 const std::string& DBusProxy::getDBusObjectPath() const {
96 return dbusObjectPath_;
99 const std::string& DBusProxy::getInterfaceName() const {
100 return dbusInterfaceName_;
103 const std::string& DBusProxy::getDomain() const {
104 return commonApiDomain_;
107 const std::string& DBusProxy::getServiceId() const {
108 return commonApiServiceId_;
111 const std::string& DBusProxy::getInstanceId() const {
112 return commonApiParticipantId_;
115 std::string DBusProxy::getAddress() const {
116 return commonApiDomain_ + ":" + commonApiServiceId_ + ":" + commonApiParticipantId_;
120 } // namespace CommonAPI