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 "DBusServiceRegistry.h"
14 #include "DBusUtils.h"
22 DBusProxyStatusEvent::DBusProxyStatusEvent(DBusProxy* dbusProxy) :
23 dbusProxy_(dbusProxy) {
26 void DBusProxyStatusEvent::onListenerAdded(const CancellableListener& listener) {
27 if (dbusProxy_->isAvailable())
28 listener(AvailabilityStatus::AVAILABLE);
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],
43 dbusProxyStatusEvent_(this),
44 availabilityStatus_(AvailabilityStatus::UNKNOWN),
45 interfaceVersionAttribute_(*this, "getInterfaceVersion") {
46 const std::string commonApiDomain = split(commonApiAddress, ':')[0];
47 assert(commonApiDomain == "local");
49 dbusServiceStatusEventSubscription_ = dbusConnection->getDBusServiceRegistry()->getServiceStatusEvent().subscribe(
51 std::bind(&DBusProxy::onServiceStatusEvent, this, std::placeholders::_1, std::placeholders::_2));
54 DBusProxy::~DBusProxy() {
55 getDBusConnection()->getDBusServiceRegistry()->getServiceStatusEvent().unsubscribe(dbusServiceStatusEventSubscription_);
58 bool DBusProxy::isAvailable() const {
59 return (availabilityStatus_ == AvailabilityStatus::AVAILABLE);
62 bool DBusProxy::isAvailableBlocking() const {
63 if (availabilityStatus_ == AvailabilityStatus::UNKNOWN) {
64 std::chrono::milliseconds singleWaitDuration(100);
66 // Wait for the service registry
67 while (availabilityStatus_ == AvailabilityStatus::UNKNOWN) {
68 std::this_thread::sleep_for(singleWaitDuration);
75 ProxyStatusEvent& DBusProxy::getProxyStatusEvent() {
76 return dbusProxyStatusEvent_;
79 InterfaceVersionAttribute& DBusProxy::getInterfaceVersionAttribute() {
80 return interfaceVersionAttribute_;
83 SubscriptionStatus DBusProxy::onServiceStatusEvent(const std::string& name, const AvailabilityStatus& availabilityStatus) {
84 availabilityStatus_ = availabilityStatus;
86 dbusProxyStatusEvent_.notifyListeners(availabilityStatus);
88 return SubscriptionStatus::RETAIN;
92 } // namespace CommonAPI