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/. */
5 #include "DBusServiceRegistry.h"
11 #include <dbus/dbus.h>
13 #include <CommonAPI/Event.h>
18 DBusProxyStatusEvent::DBusProxyStatusEvent(DBusProxy* dbusProxy) :
19 dbusProxy_(dbusProxy) {
22 void DBusProxyStatusEvent::onFirstListenerAdded(const Listener& listener) {
23 auto serviceStatusListener = std::bind(
24 &DBusProxyStatusEvent::onServiceAvailableSignalHandler,
26 std::placeholders::_1,
27 std::placeholders::_2);
29 subscription_ = dbusProxy_->getDBusConnection()->getDBusServiceRegistry()->getServiceStatusEvent().subscribe(
30 dbusProxy_->dbusBusName_ + ":" + dbusProxy_->dbusObjectPath_ + ":" + dbusProxy_->interfaceName_,
31 serviceStatusListener);
34 void DBusProxyStatusEvent::onLastListenerRemoved(const Listener& listener) {
35 dbusProxy_->getDBusConnection()->getDBusServiceRegistry()->getServiceStatusEvent().unsubscribe(subscription_);
38 SubscriptionStatus DBusProxyStatusEvent::onServiceAvailableSignalHandler(const std::string& name,
39 const AvailabilityStatus& availabilityStatus) {
40 AvailabilityStatus availability = availabilityStatus;
42 return notifyListeners(availability);
45 const std::string DBusProxy::domain_ = "local";
47 DBusProxy::DBusProxy(const std::string& dbusBusName,
48 const std::string& dbusObjectPath,
49 const std::string& interfaceName,
50 const std::shared_ptr<DBusProxyConnection>& dbusProxyConnection) :
51 dbusBusName_(dbusBusName),
52 dbusObjectPath_(dbusObjectPath),
53 interfaceName_(interfaceName),
55 interfaceVersionAttribute_(*this, "getInterfaceVersion"),
58 connection_(dbusProxyConnection) {
61 DBusProxy::DBusProxy(const std::string& dbusBusName,
62 const std::string& dbusObjectPath,
63 const std::string& interfaceName,
64 const std::shared_ptr<DBusProxyConnection>& connection,
65 const bool isAlwaysAvailable) :
66 dbusBusName_(dbusBusName),
67 dbusObjectPath_(dbusObjectPath),
68 interfaceName_(interfaceName),
70 interfaceVersionAttribute_(*this, "getInterfaceVersion"),
71 available_(isAlwaysAvailable),
72 availableSet_(isAlwaysAvailable),
73 connection_(connection) {
76 std::string DBusProxy::getAddress() const {
77 return domain_ + ":" + interfaceName_ + ":" + dbusBusName_;
80 const std::string& DBusProxy::getDomain() const {
84 const std::string& DBusProxy::getServiceId() const {
85 return getInterfaceName();
88 const std::string& DBusProxy::getInstanceId() const {
93 bool DBusProxy::isAvailable() const {
95 auto status = getDBusConnection()->getDBusServiceRegistry()->getReadyFuture().wait_for(std::chrono::milliseconds(1));
96 if (checkReady(status)) {
97 available_ = getDBusConnection()->getDBusServiceRegistry()->isServiceInstanceAlive(getAddress());
104 bool DBusProxy::isAvailableBlocking() const {
106 if (!availableSet_) {
107 getDBusConnection()->getDBusServiceRegistry()->getReadyFuture().wait();
108 available_ = getDBusConnection()->getDBusServiceRegistry()->isServiceInstanceAlive(getAddress());
109 availableSet_ = true;
114 ProxyStatusEvent& DBusProxy::getProxyStatusEvent() {
118 InterfaceVersionAttribute& DBusProxy::getInterfaceVersionAttribute() {
119 return interfaceVersionAttribute_;
122 DBusMessage DBusProxy::createMethodCall(const char* methodName,
123 const char* methodSignature) const {
124 return DBusMessage::createMethodCall(
125 dbusBusName_.c_str(),
126 dbusObjectPath_.c_str(),
127 getInterfaceName().c_str(),
133 } // namespace CommonAPI