diff options
author | Aleksandar Kanchev <kanchev@itestra.com> | 2013-02-22 11:09:04 +0100 |
---|---|---|
committer | Aleksandar Kanchev <kanchev@itestra.com> | 2013-02-22 11:09:04 +0100 |
commit | e86f84f8f2082fb1ac439e954b288d92e171add9 (patch) | |
tree | e8bb5ef9f5519bf8beee4fa15c5941a7694c54af | |
parent | 8dd3d946a61a778dca6d171bf44185f6482a9857 (diff) | |
download | genivi-common-api-dbus-runtime-e86f84f8f2082fb1ac439e954b288d92e171add9.tar.gz |
switch DBusProxy to DBusProxyBase
keep the old interface, won't break existing generated code. Simplifies
stuff a bit, since they're already implemented in DBusProxyBase. Adds
continuous tracking of service status for the life time of the proxy
instance.
-rw-r--r-- | src/CommonAPI/DBus/DBusProxy.cpp | 140 | ||||
-rw-r--r-- | src/CommonAPI/DBus/DBusProxy.h | 111 |
2 files changed, 59 insertions, 192 deletions
diff --git a/src/CommonAPI/DBus/DBusProxy.cpp b/src/CommonAPI/DBus/DBusProxy.cpp index 5e9ce40..958e82b 100644 --- a/src/CommonAPI/DBus/DBusProxy.cpp +++ b/src/CommonAPI/DBus/DBusProxy.cpp @@ -4,15 +4,17 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +// Workaround for libstdc++ bug +#ifndef _GLIBCXX_USE_NANOSLEEP +#define _GLIBCXX_USE_NANOSLEEP +#endif + #include "DBusProxy.h" #include "DBusServiceRegistry.h" #include "DBusUtils.h" -#include <algorithm> #include <cassert> -#include <dbus/dbus.h> -#include <functional> -#include <CommonAPI/Event.h> + namespace CommonAPI { namespace DBus { @@ -21,27 +23,9 @@ DBusProxyStatusEvent::DBusProxyStatusEvent(DBusProxy* dbusProxy) : dbusProxy_(dbusProxy) { } -void DBusProxyStatusEvent::onFirstListenerAdded(const CancellableListener& listener) { - auto serviceStatusListener = std::bind( - &DBusProxyStatusEvent::onServiceAvailableSignalHandler, - this, - std::placeholders::_1, - std::placeholders::_2); - - subscription_ = dbusProxy_->getDBusConnection()->getDBusServiceRegistry()->getServiceStatusEvent().subscribe( - dbusProxy_->commonApiDomain_ + ":" + dbusProxy_->commonApiServiceId_ + ":" + dbusProxy_->commonApiParticipantId_, - serviceStatusListener); -} - -void DBusProxyStatusEvent::onLastListenerRemoved(const CancellableListener& listener) { - dbusProxy_->getDBusConnection()->getDBusServiceRegistry()->getServiceStatusEvent().unsubscribe(subscription_); -} - -SubscriptionStatus DBusProxyStatusEvent::onServiceAvailableSignalHandler(const std::string& name, - const AvailabilityStatus& availabilityStatus) { - AvailabilityStatus availability = availabilityStatus; - - return notifyListeners(availability); +void DBusProxyStatusEvent::onListenerAdded(const CancellableListener& listener) { + if (dbusProxy_->isAvailable()) + listener(AvailabilityStatus::AVAILABLE); } @@ -49,97 +33,59 @@ DBusProxy::DBusProxy(const std::string& commonApiAddress, const std::string& dbusInterfaceName, const std::string& dbusBusName, const std::string& dbusObjectPath, - const std::shared_ptr<DBusProxyConnection>& dbusProxyConnection) : - commonApiDomain_(split(commonApiAddress, ':')[0]), - commonApiServiceId_(split(commonApiAddress, ':')[1]), - commonApiParticipantId_(split(commonApiAddress, ':')[2]), - dbusBusName_(dbusBusName), - dbusObjectPath_(dbusObjectPath), - dbusInterfaceName_(dbusInterfaceName), - statusEvent_(this), - interfaceVersionAttribute_(*this, "getInterfaceVersion"), - available_(false), - availableSet_(false), - connection_(dbusProxyConnection) { -} - -DBusProxy::DBusProxy(const std::string& dbusInterfaceName, - const std::string& dbusBusName, - const std::string& dbusObjectPath, - const std::shared_ptr<DBusProxyConnection>& connection, - const bool isAlwaysAvailable): - commonApiDomain_(""), - commonApiServiceId_(""), - commonApiParticipantId_(""), - dbusBusName_(dbusBusName), - dbusObjectPath_(dbusObjectPath), - dbusInterfaceName_(dbusInterfaceName), - statusEvent_(this), - interfaceVersionAttribute_(*this, "getInterfaceVersion"), - available_(isAlwaysAvailable), - availableSet_(isAlwaysAvailable), - connection_(connection) { + const std::shared_ptr<DBusProxyConnection>& dbusConnection): + DBusProxyBase(split(commonApiAddress, ':')[1], + split(commonApiAddress, ':')[2], + dbusInterfaceName, + dbusBusName, + dbusObjectPath, + dbusConnection), + dbusProxyStatusEvent_(this), + availabilityStatus_(AvailabilityStatus::UNKNOWN), + interfaceVersionAttribute_(*this, "getInterfaceVersion") { + const std::string commonApiDomain = split(commonApiAddress, ':')[0]; + assert(commonApiDomain == "local"); + + dbusServiceStatusEventSubscription_ = dbusConnection->getDBusServiceRegistry()->getServiceStatusEvent().subscribe( + commonApiAddress, + std::bind(&DBusProxy::onServiceStatusEvent, this, std::placeholders::_1, std::placeholders::_2)); } -std::string DBusProxy::getAddress() const { - return commonApiDomain_ + ":" + commonApiServiceId_ + ":" + commonApiParticipantId_; +DBusProxy::~DBusProxy() { + getDBusConnection()->getDBusServiceRegistry()->getServiceStatusEvent().unsubscribe(dbusServiceStatusEventSubscription_); } -const std::string& DBusProxy::getDomain() const { - return commonApiDomain_; -} - -const std::string& DBusProxy::getServiceId() const { - return commonApiServiceId_; -} - -const std::string& DBusProxy::getInstanceId() const { - return commonApiParticipantId_; +bool DBusProxy::isAvailable() const { + return (availabilityStatus_ == AvailabilityStatus::AVAILABLE); } +bool DBusProxy::isAvailableBlocking() const { + if (availabilityStatus_ == AvailabilityStatus::UNKNOWN) { + std::chrono::milliseconds singleWaitDuration(100); -bool DBusProxy::isAvailable() const { - if (!availableSet_) { - auto status = getDBusConnection()->getDBusServiceRegistry()->getReadyFuture().wait_for(std::chrono::milliseconds(1)); - if (checkReady(status)) { - available_ = getDBusConnection()->getDBusServiceRegistry()->isServiceInstanceAlive( - dbusInterfaceName_, - dbusBusName_, - dbusObjectPath_); - availableSet_ = true; + // Wait for the service registry + while (availabilityStatus_ == AvailabilityStatus::UNKNOWN) { + std::this_thread::sleep_for(singleWaitDuration); } } - return available_; -} -bool DBusProxy::isAvailableBlocking() const { - if (!availableSet_) { - getDBusConnection()->getDBusServiceRegistry()->getReadyFuture().wait(); - available_ = getDBusConnection()->getDBusServiceRegistry()->isServiceInstanceAlive( - dbusInterfaceName_, - dbusBusName_, - dbusObjectPath_); - availableSet_ = true; - } - return available_; + return isAvailable(); } ProxyStatusEvent& DBusProxy::getProxyStatusEvent() { - return statusEvent_; + return dbusProxyStatusEvent_; } InterfaceVersionAttribute& DBusProxy::getInterfaceVersionAttribute() { return interfaceVersionAttribute_; } -DBusMessage DBusProxy::createMethodCall(const char* methodName, - const char* methodSignature) const { - return DBusMessage::createMethodCall( - dbusBusName_.c_str(), - dbusObjectPath_.c_str(), - dbusInterfaceName_.c_str(), - methodName, - methodSignature); +SubscriptionStatus DBusProxy::onServiceStatusEvent(const std::string& name, const AvailabilityStatus& availabilityStatus) { + availabilityStatus_ = availabilityStatus; + + dbusProxyStatusEvent_.notifyListeners(availabilityStatus); + + return SubscriptionStatus::RETAIN; } } // namespace DBus diff --git a/src/CommonAPI/DBus/DBusProxy.h b/src/CommonAPI/DBus/DBusProxy.h index 11b14a7..b1dfc47 100644 --- a/src/CommonAPI/DBus/DBusProxy.h +++ b/src/CommonAPI/DBus/DBusProxy.h @@ -7,137 +7,58 @@ #ifndef COMMONAPI_DBUS_DBUS_PROXY_H_ #define COMMONAPI_DBUS_DBUS_PROXY_H_ -#include "DBusProxyConnection.h" +#include "DBusProxyBase.h" #include "DBusAttribute.h" -#include <CommonAPI/Proxy.h> -#include <CommonAPI/types.h> - #include <functional> #include <memory> #include <string> + namespace CommonAPI { namespace DBus { -class DBusProxy; - -typedef Event<AvailabilityStatus> ProxyStatusEvent; - class DBusProxyStatusEvent: public ProxyStatusEvent { + friend class DBusProxy; + public: DBusProxyStatusEvent(DBusProxy* dbusProxy); - void onFirstListenerAdded(const CancellableListener& listener); - void onLastListenerRemoved(const CancellableListener& listener); - - private: - SubscriptionStatus onServiceAvailableSignalHandler(const std::string& name, const AvailabilityStatus& availabilityStatus); + protected: + virtual void onListenerAdded(const CancellableListener& listener); DBusProxy* dbusProxy_; - DBusServiceStatusEvent::Subscription subscription_; - - friend class DBusProxy; - }; -class DBusProxy: public virtual CommonAPI::Proxy { +class DBusProxy: public DBusProxyBase { public: DBusProxy(const std::string& commonApiAddress, const std::string& dbusInterfaceName, const std::string& dbusBusName, const std::string& dbusObjectPath, - const std::shared_ptr<DBusProxyConnection>& dbusProxyConnection); + const std::shared_ptr<DBusProxyConnection>& dbusConnection); + + virtual ~DBusProxy(); - virtual std::string getAddress() const; - virtual const std::string& getDomain() const; - virtual const std::string& getServiceId() const; - virtual const std::string& getInstanceId() const; virtual bool isAvailable() const; - virtual bool isAvailableBlocking() const; virtual ProxyStatusEvent& getProxyStatusEvent(); virtual InterfaceVersionAttribute& getInterfaceVersionAttribute(); - inline const std::string& getDBusBusName() const; - inline const std::string& getDBusObjectPath() const; - inline const std::string& getInterfaceName() const; - inline const std::shared_ptr<DBusProxyConnection>& getDBusConnection() const; - - DBusMessage createMethodCall(const char* methodName, - const char* methodSignature = NULL) const; - - inline DBusProxyConnection::DBusSignalHandlerToken addSignalMemberHandler( - const std::string& signalName, - const std::string& signalSignature, - DBusProxyConnection::DBusSignalHandler* dbusSignalHandler); - - inline void removeSignalMemberHandler(const DBusProxyConnection::DBusSignalHandlerToken& dbusSignalHandlerToken); - - protected: - DBusProxy(const DBusProxy& abstractProxy) = delete; - - DBusProxy(const std::string& dbusInterfaceName, - const std::string& dbusBusName, - const std::string& dbusObjectPath, - const std::shared_ptr<DBusProxyConnection>& connection, - const bool isAlwaysAvailable); - - virtual void getOwnVersion(uint16_t& ownVersionMajor, uint16_t& ownVersionMinor) const = 0; - - DBusProxyStatusEvent statusEvent_; - DBusProxyStatusEvent::Subscription remoteStatusSubscription_; + virtual bool isAvailableBlocking() const; private: - void onServiceAlive(bool alive); - - const std::string commonApiDomain_; - const std::string commonApiServiceId_; - const std::string commonApiParticipantId_; - - const std::string dbusBusName_; - const std::string dbusObjectPath_; - const std::string dbusInterfaceName_; + DBusProxy(const DBusProxy&) = delete; - mutable bool available_; - mutable bool availableSet_; + SubscriptionStatus onServiceStatusEvent(const std::string& name, const AvailabilityStatus& availabilityStatus); - std::shared_ptr<DBusProxyConnection> connection_; + DBusProxyStatusEvent dbusProxyStatusEvent_; + DBusServiceStatusEvent::Subscription dbusServiceStatusEventSubscription_; + AvailabilityStatus availabilityStatus_; DBusReadonlyAttribute<InterfaceVersionAttribute> interfaceVersionAttribute_; - - static const std::string domain_; - - friend class DBusProxyStatusEvent; }; -const std::string& DBusProxy::getDBusBusName() const { - return dbusBusName_; -} - -const std::string& DBusProxy::getDBusObjectPath() const { - return dbusObjectPath_; -} - -const std::string& DBusProxy::getInterfaceName() const { - return dbusInterfaceName_; -} - -const std::shared_ptr<DBusProxyConnection>& DBusProxy::getDBusConnection() const { - return connection_; -} - -DBusProxyConnection::DBusSignalHandlerToken DBusProxy::addSignalMemberHandler( - const std::string& signalName, - const std::string& signalSignature, - DBusProxyConnection::DBusSignalHandler* dbusSignalHandler) { - return connection_->addSignalMemberHandler(dbusObjectPath_, getInterfaceName(), signalName, signalSignature, dbusSignalHandler); -} - -void DBusProxy::removeSignalMemberHandler(const DBusProxyConnection::DBusSignalHandlerToken& dbusSignalHandlerToken) { - return connection_->removeSignalMemberHandler(dbusSignalHandlerToken); -} - } // namespace DBus } // namespace CommonAPI |