1 /* Copyright (C) 2013 BMW Group
\r
2 * Author: Manfred Bathelt (manfred.bathelt@bmw.de)
\r
3 * Author: Juergen Gehring (juergen.gehring@bmw.de)
\r
4 * This Source Code Form is subject to the terms of the Mozilla Public
\r
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
\r
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
\r
7 #include "DBusProxy.h"
\r
8 #include "DBusConnection.h"
\r
9 #include "DBusFactory.h"
\r
10 #include "DBusServiceRegistry.h"
\r
11 #include "DBusUtils.h"
\r
13 #include <algorithm>
\r
17 #include <unordered_map>
\r
20 namespace CommonAPI {
\r
23 std::unordered_map<std::string, DBusProxyFactoryFunction>* registeredProxyFactoryFunctions_;
\r
24 std::unordered_map<std::string, DBusAdapterFactoryFunction>* registeredAdapterFactoryFunctions_;
\r
27 void DBusFactory::registerProxyFactoryMethod(std::string interfaceName, DBusProxyFactoryFunction proxyFactoryMethod) {
\r
28 if(!registeredProxyFactoryFunctions_) {
\r
29 registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction>();
\r
31 registeredProxyFactoryFunctions_->insert({interfaceName, proxyFactoryMethod});
\r
34 void DBusFactory::registerAdapterFactoryMethod(std::string interfaceName, DBusAdapterFactoryFunction adapterFactoryMethod) {
\r
35 if(!registeredAdapterFactoryFunctions_) {
\r
36 registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction>();
\r
38 registeredAdapterFactoryFunctions_->insert({interfaceName, adapterFactoryMethod});
\r
43 DBusFactory::DBusFactory(std::shared_ptr<Runtime> runtime, const MiddlewareInfo* middlewareInfo) :
\r
44 CommonAPI::Factory(runtime, middlewareInfo),
\r
45 dbusConnection_(CommonAPI::DBus::DBusConnection::getSessionBus()),
\r
46 acquiredConnectionName_("") {
\r
47 dbusConnection_->connect();
\r
50 DBusFactory::~DBusFactory() {
\r
54 std::vector<std::string> DBusFactory::getAvailableServiceInstances(const std::string& serviceInterfaceName,
\r
55 const std::string& serviceDomainName) {
\r
56 return dbusConnection_->getDBusServiceRegistry()->getAvailableServiceInstances(serviceInterfaceName, serviceDomainName);
\r
60 bool DBusFactory::isServiceInstanceAlive(const std::string& serviceInstanceId,
\r
61 const std::string& serviceInterfaceName,
\r
62 const std::string& serviceDomainName) {
\r
64 return dbusConnection_->getDBusServiceRegistry()->isServiceInstanceAlive(serviceInstanceId, serviceInterfaceName, serviceDomainName);
\r
67 std::shared_ptr<Proxy> DBusFactory::createProxy(const char* interfaceName, const std::string& participantId, const std::string& domain) {
\r
68 std::string connectionName;
\r
69 std::string objectPath;
\r
71 findFallbackInstanceIdMapping(participantId, connectionName, objectPath);
\r
73 if(!registeredProxyFactoryFunctions_) {
\r
74 registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction> {};
\r
77 for (auto it = registeredProxyFactoryFunctions_->begin(); it != registeredProxyFactoryFunctions_->end(); ++it) {
\r
78 if(it->first == interfaceName) {
\r
79 return (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_);
\r
86 std::shared_ptr<StubAdapter> DBusFactory::createAdapter(std::shared_ptr<StubBase> stubBase, const char* interfaceName, const std::string& participantId, const std::string& domain) {
\r
87 assert(dbusConnection_->isConnected());
\r
89 std::string connectionName;
\r
90 std::string objectPath;
\r
91 findFallbackInstanceIdMapping(participantId, connectionName, objectPath);
\r
93 if(acquiredConnectionName_ == "") {
\r
94 dbusConnection_->requestServiceNameAndBlock(connectionName);
\r
95 acquiredConnectionName_ = connectionName;
\r
96 } else if (acquiredConnectionName_ != connectionName) {
\r
100 if(!registeredAdapterFactoryFunctions_) {
\r
101 registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction> {};
\r
104 for (auto it = registeredAdapterFactoryFunctions_->begin(); it != registeredAdapterFactoryFunctions_->end(); ++it) {
\r
105 if(it->first == interfaceName) {
\r
106 std::shared_ptr<DBusStubAdapter> dbusStubAdapter = (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_, stubBase);
\r
107 dbusStubAdapter->init();
\r
108 return dbusStubAdapter;
\r
116 } // namespace DBus
\r
117 } // namespace CommonAPI
\r