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();
50 DBusFactory::~DBusFactory() {
54 std::vector<std::string> DBusFactory::getAvailableServiceInstances(const std::string& serviceName,
55 const std::string& domainName) {
56 return dbusConnection_->getDBusServiceRegistry()->getAvailableServiceInstances(serviceName, domainName);
60 bool DBusFactory::isServiceInstanceAlive(const std::string& serviceAddress) {
61 std::vector<std::string> parts = split(serviceAddress, ':');
62 assert(parts[0] == "local");
64 std::string interfaceName;
65 std::string connectionName;
66 std::string objectPath;
67 DBusAddressTranslator::getInstance().searchForDBusAddress(serviceAddress, interfaceName, connectionName, objectPath);
69 return dbusConnection_->getDBusServiceRegistry()->isServiceInstanceAlive(interfaceName, connectionName, objectPath);
73 bool DBusFactory::isServiceInstanceAlive(const std::string& participantId,
74 const std::string& serviceName,
75 const std::string& domainName) {
76 std::string serviceAddress = domainName + ":" + serviceName + ":" + participantId;
77 return isServiceInstanceAlive(serviceAddress);
80 std::shared_ptr<Proxy> DBusFactory::createProxy(const char* interfaceId,
81 const std::string& participantId,
82 const std::string& serviceName,
83 const std::string& domain) {
84 std::string commonApiAddress = domain + ":" + serviceName + ":" + participantId;
86 std::string interfaceName;
87 std::string connectionName;
88 std::string objectPath;
90 DBusAddressTranslator::getInstance().searchForDBusAddress(commonApiAddress, interfaceName, connectionName, objectPath);
92 if(!registeredProxyFactoryFunctions_) {
93 registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction> {};
96 for (auto it = registeredProxyFactoryFunctions_->begin(); it != registeredProxyFactoryFunctions_->end(); ++it) {
97 if(it->first == interfaceId) {
98 return (it->second)(commonApiAddress, interfaceName, connectionName, objectPath, dbusConnection_);
105 std::shared_ptr<StubAdapter> DBusFactory::createAdapter(std::shared_ptr<StubBase> stubBase,
106 const char* interfaceId,
107 const std::string& participantId,
108 const std::string& serviceName,
109 const std::string& domain) {
110 assert(dbusConnection_->isConnected());
112 std::string commonApiAddress = domain + ":" + serviceName + ":" + participantId;
114 std::string interfaceName;
115 std::string connectionName;
116 std::string objectPath;
118 DBusAddressTranslator::getInstance().searchForDBusAddress(commonApiAddress, interfaceName, connectionName, objectPath);
120 if(acquiredConnectionName_ == "") {
121 dbusConnection_->requestServiceNameAndBlock(connectionName);
122 acquiredConnectionName_ = connectionName;
123 } else if (acquiredConnectionName_ != connectionName) {
127 if(!registeredAdapterFactoryFunctions_) {
128 registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction> {};
131 for (auto it = registeredAdapterFactoryFunctions_->begin(); it != registeredAdapterFactoryFunctions_->end(); ++it) {
132 if(it->first == interfaceId) {
133 std::shared_ptr<DBusStubAdapter> dbusStubAdapter = (it->second)(commonApiAddress, interfaceName, connectionName, objectPath, dbusConnection_, stubBase);
134 dbusStubAdapter->init();
135 return dbusStubAdapter;
144 } // namespace CommonAPI