1 /* This Source Code Form is subject to the terms of the Mozilla Public
\r
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
\r
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
\r
4 #include "DBusProxy.h"
\r
5 #include "DBusConnection.h"
\r
6 #include "DBusFactory.h"
\r
7 #include "DBusServiceRegistry.h"
\r
8 #include "DBusUtils.h"
\r
10 #include <algorithm>
\r
14 #include <unordered_map>
\r
17 namespace CommonAPI {
\r
20 std::unordered_map<std::string, DBusProxyFactoryFunction>* registeredProxyFactoryFunctions_;
\r
21 std::unordered_map<std::string, DBusAdapterFactoryFunction>* registeredAdapterFactoryFunctions_;
\r
24 void DBusFactory::registerProxyFactoryMethod(std::string interfaceName, DBusProxyFactoryFunction proxyFactoryMethod) {
\r
25 if(!registeredProxyFactoryFunctions_) {
\r
26 registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction>();
\r
28 registeredProxyFactoryFunctions_->insert({interfaceName, proxyFactoryMethod});
\r
31 void DBusFactory::registerAdapterFactoryMethod(std::string interfaceName, DBusAdapterFactoryFunction adapterFactoryMethod) {
\r
32 if(!registeredAdapterFactoryFunctions_) {
\r
33 registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction>();
\r
35 registeredAdapterFactoryFunctions_->insert({interfaceName, adapterFactoryMethod});
\r
40 DBusFactory::DBusFactory(std::shared_ptr<Runtime> runtime, const MiddlewareInfo* middlewareInfo) :
\r
41 CommonAPI::Factory(runtime, middlewareInfo),
\r
42 dbusConnection_(CommonAPI::DBus::DBusConnection::getSessionBus()),
\r
43 acquiredConnectionName_("") {
\r
44 dbusConnection_->connect();
\r
47 DBusFactory::~DBusFactory() {
\r
51 std::vector<std::string> DBusFactory::getAvailableServiceInstances(const std::string& serviceInterfaceName,
\r
52 const std::string& serviceDomainName) {
\r
53 return dbusConnection_->getDBusServiceRegistry()->getAvailableServiceInstances(serviceInterfaceName, serviceDomainName);
\r
57 bool DBusFactory::isServiceInstanceAlive(const std::string& serviceInstanceId,
\r
58 const std::string& serviceInterfaceName,
\r
59 const std::string& serviceDomainName) {
\r
61 return dbusConnection_->getDBusServiceRegistry()->isServiceInstanceAlive(serviceInstanceId, serviceInterfaceName, serviceDomainName);
\r
64 std::shared_ptr<Proxy> DBusFactory::createProxy(const char* interfaceName, const std::string& participantId, const std::string& domain) {
\r
65 std::string connectionName;
\r
66 std::string objectPath;
\r
68 findFallbackInstanceIdMapping(participantId, connectionName, objectPath);
\r
70 if(!registeredProxyFactoryFunctions_) {
\r
71 registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction> {};
\r
74 for (auto it = registeredProxyFactoryFunctions_->begin(); it != registeredProxyFactoryFunctions_->end(); ++it) {
\r
75 if(it->first == interfaceName) {
\r
76 return (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_);
\r
83 std::shared_ptr<StubAdapter> DBusFactory::createAdapter(std::shared_ptr<StubBase> stubBase, const char* interfaceName, const std::string& participantId, const std::string& domain) {
\r
84 assert(dbusConnection_->isConnected());
\r
86 std::string connectionName;
\r
87 std::string objectPath;
\r
88 findFallbackInstanceIdMapping(participantId, connectionName, objectPath);
\r
90 if(acquiredConnectionName_ == "") {
\r
91 dbusConnection_->requestServiceNameAndBlock(connectionName);
\r
92 acquiredConnectionName_ = connectionName;
\r
93 } else if (acquiredConnectionName_ != connectionName) {
\r
97 if(!registeredAdapterFactoryFunctions_) {
\r
98 registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction> {};
\r
101 for (auto it = registeredAdapterFactoryFunctions_->begin(); it != registeredAdapterFactoryFunctions_->end(); ++it) {
\r
102 if(it->first == interfaceName) {
\r
103 std::shared_ptr<DBusStubAdapter> dbusStubAdapter = (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_, stubBase);
\r
104 dbusStubAdapter->init();
\r
105 return dbusStubAdapter;
\r
113 } // namespace DBus
\r
114 } // namespace CommonAPI
\r