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/. */
8 #include "DBusConnection.h"
9 #include "DBusFactory.h"
10 #include "DBusAddressTranslator.h"
11 #include "DBusServiceRegistry.h"
12 #include "DBusUtils.h"
17 #include <unordered_map>
23 std::unordered_map<std::string, DBusProxyFactoryFunction>* registeredProxyFactoryFunctions_;
24 std::unordered_map<std::string, DBusAdapterFactoryFunction>* registeredAdapterFactoryFunctions_;
27 void DBusFactory::registerProxyFactoryMethod(std::string interfaceName, DBusProxyFactoryFunction proxyFactoryMethod) {
28 if(!registeredProxyFactoryFunctions_) {
29 registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction>();
31 registeredProxyFactoryFunctions_->insert({interfaceName, proxyFactoryMethod});
34 void DBusFactory::registerAdapterFactoryMethod(std::string interfaceName, DBusAdapterFactoryFunction adapterFactoryMethod) {
35 if(!registeredAdapterFactoryFunctions_) {
36 registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction>();
38 registeredAdapterFactoryFunctions_->insert({interfaceName, adapterFactoryMethod});
43 DBusFactory::DBusFactory(std::shared_ptr<Runtime> runtime, const MiddlewareInfo* middlewareInfo) :
44 CommonAPI::Factory(runtime, middlewareInfo),
45 dbusConnection_(CommonAPI::DBus::DBusConnection::getSessionBus()),
46 acquiredConnectionName_("") {
47 dbusConnection_->connect();
51 DBusFactory::~DBusFactory() {
55 std::vector<std::string> DBusFactory::getAvailableServiceInstances(const std::string& serviceName,
56 const std::string& domainName) {
57 return dbusConnection_->getDBusServiceRegistry()->getAvailableServiceInstances(serviceName, domainName);
61 bool DBusFactory::isServiceInstanceAlive(const std::string& serviceAddress) {
62 std::vector<std::string> parts = split(serviceAddress, ':');
63 assert(parts[0] == "local");
65 std::string interfaceName;
66 std::string connectionName;
67 std::string objectPath;
68 DBusAddressTranslator::getInstance().searchForDBusAddress(serviceAddress, interfaceName, connectionName, objectPath);
70 return dbusConnection_->getDBusServiceRegistry()->isServiceInstanceAlive(interfaceName, connectionName, objectPath);
74 bool DBusFactory::isServiceInstanceAlive(const std::string& participantId,
75 const std::string& serviceName,
76 const std::string& domainName) {
77 std::string serviceAddress = domainName + ":" + serviceName + ":" + participantId;
78 return isServiceInstanceAlive(serviceAddress);
82 std::shared_ptr<Proxy> DBusFactory::createProxy(const char* interfaceId,
83 const std::string& participantId,
84 const std::string& serviceName,
85 const std::string& domain) {
86 std::string commonApiAddress = domain + ":" + serviceName + ":" + participantId;
88 std::string interfaceName;
89 std::string connectionName;
90 std::string objectPath;
92 DBusAddressTranslator::getInstance().searchForDBusAddress(commonApiAddress, interfaceName, connectionName, objectPath);
94 if(!registeredProxyFactoryFunctions_) {
95 registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction> {};
98 for (auto it = registeredProxyFactoryFunctions_->begin(); it != registeredProxyFactoryFunctions_->end(); ++it) {
99 if(it->first == interfaceId) {
100 return (it->second)(commonApiAddress, interfaceName, connectionName, objectPath, dbusConnection_);
107 std::shared_ptr<StubAdapter> DBusFactory::createAdapter(std::shared_ptr<StubBase> stubBase,
108 const char* interfaceId,
109 const std::string& participantId,
110 const std::string& serviceName,
111 const std::string& domain) {
112 assert(dbusConnection_->isConnected());
114 std::string commonApiAddress = domain + ":" + serviceName + ":" + participantId;
116 std::string interfaceName;
117 std::string connectionName;
118 std::string objectPath;
120 DBusAddressTranslator::getInstance().searchForDBusAddress(commonApiAddress, interfaceName, connectionName, objectPath);
122 if(acquiredConnectionName_ == "") {
123 dbusConnection_->requestServiceNameAndBlock(connectionName);
124 acquiredConnectionName_ = connectionName;
125 } else if (acquiredConnectionName_ != connectionName) {
129 if(!registeredAdapterFactoryFunctions_) {
130 registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction> {};
133 for (auto it = registeredAdapterFactoryFunctions_->begin(); it != registeredAdapterFactoryFunctions_->end(); ++it) {
134 if(it->first == interfaceId) {
135 std::shared_ptr<DBusStubAdapter> dbusStubAdapter = (it->second)(commonApiAddress, interfaceName, connectionName, objectPath, dbusConnection_, stubBase);
136 dbusStubAdapter->init();
137 return dbusStubAdapter;
146 } // namespace CommonAPI