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
16 #include <unordered_map>
\r
19 namespace CommonAPI {
\r
22 std::unordered_map<std::string, DBusProxyFactoryFunction>* registeredProxyFactoryFunctions_;
\r
23 std::unordered_map<std::string, DBusAdapterFactoryFunction>* registeredAdapterFactoryFunctions_;
\r
26 void DBusFactory::registerProxyFactoryMethod(std::string interfaceName, DBusProxyFactoryFunction proxyFactoryMethod) {
\r
27 if(!registeredProxyFactoryFunctions_) {
\r
28 registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction>();
\r
30 registeredProxyFactoryFunctions_->insert({interfaceName, proxyFactoryMethod});
\r
33 void DBusFactory::registerAdapterFactoryMethod(std::string interfaceName, DBusAdapterFactoryFunction adapterFactoryMethod) {
\r
34 if(!registeredAdapterFactoryFunctions_) {
\r
35 registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction>();
\r
37 registeredAdapterFactoryFunctions_->insert({interfaceName, adapterFactoryMethod});
\r
42 DBusFactory::DBusFactory(std::shared_ptr<Runtime> runtime, const MiddlewareInfo* middlewareInfo) :
\r
43 CommonAPI::Factory(runtime, middlewareInfo),
\r
44 dbusConnection_(CommonAPI::DBus::DBusConnection::getSessionBus()),
\r
45 acquiredConnectionName_("") {
\r
46 dbusConnection_->connect();
\r
49 DBusFactory::~DBusFactory() {
\r
53 std::vector<std::string> DBusFactory::getAvailableServiceInstances(const std::string& serviceInterfaceName,
\r
54 const std::string& serviceDomainName) {
\r
55 return dbusConnection_->getDBusServiceRegistry()->getAvailableServiceInstances(serviceInterfaceName, serviceDomainName);
\r
59 bool DBusFactory::isServiceInstanceAlive(const std::string& serviceInstanceId,
\r
60 const std::string& serviceInterfaceName,
\r
61 const std::string& serviceDomainName) {
\r
63 return dbusConnection_->getDBusServiceRegistry()->isServiceInstanceAlive(serviceInstanceId, serviceInterfaceName, serviceDomainName);
\r
66 std::shared_ptr<Proxy> DBusFactory::createProxy(const char* interfaceName, const std::string& participantId, const std::string& domain) {
\r
67 std::string connectionName;
\r
68 std::string objectPath;
\r
70 findFallbackInstanceIdMapping(participantId, connectionName, objectPath);
\r
72 if(!registeredProxyFactoryFunctions_) {
\r
73 registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction> {};
\r
76 for (auto it = registeredProxyFactoryFunctions_->begin(); it != registeredProxyFactoryFunctions_->end(); ++it) {
\r
77 if(it->first == interfaceName) {
\r
78 return (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_);
\r
85 std::shared_ptr<StubAdapter> DBusFactory::createAdapter(std::shared_ptr<StubBase> stubBase, const char* interfaceName, const std::string& participantId, const std::string& domain) {
\r
86 assert(dbusConnection_->isConnected());
\r
88 std::string connectionName;
\r
89 std::string objectPath;
\r
90 findFallbackInstanceIdMapping(participantId, connectionName, objectPath);
\r
92 if(acquiredConnectionName_ == "") {
\r
93 dbusConnection_->requestServiceNameAndBlock(connectionName);
\r
94 acquiredConnectionName_ = connectionName;
\r
95 } else if (acquiredConnectionName_ != connectionName) {
\r
99 if(!registeredAdapterFactoryFunctions_) {
\r
100 registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction> {};
\r
103 for (auto it = registeredAdapterFactoryFunctions_->begin(); it != registeredAdapterFactoryFunctions_->end(); ++it) {
\r
104 if(it->first == interfaceName) {
\r
105 std::shared_ptr<DBusStubAdapter> dbusStubAdapter = (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_, stubBase);
\r
106 dbusStubAdapter->init();
\r
107 return dbusStubAdapter;
\r
115 } // namespace DBus
\r
116 } // namespace CommonAPI
\r