Configuration for object paths and connection names incorporated.
[profile/ivi/common-api-dbus-runtime.git] / src / CommonAPI / DBus / DBusFactory.cpp
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 "DBusAddressTranslator.h"\r
11 #include "DBusServiceRegistry.h"\r
12 #include "DBusUtils.h"\r
13 \r
14 #include <algorithm>\r
15 #include <cassert>\r
16 #include <sstream>\r
17 #include <unordered_map>\r
18 #include <vector>\r
19 \r
20 namespace CommonAPI {\r
21 namespace DBus {\r
22 \r
23 std::unordered_map<std::string, DBusProxyFactoryFunction>* registeredProxyFactoryFunctions_;\r
24 std::unordered_map<std::string, DBusAdapterFactoryFunction>* registeredAdapterFactoryFunctions_;\r
25 \r
26 \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
30     }\r
31     registeredProxyFactoryFunctions_->insert({interfaceName, proxyFactoryMethod});\r
32 }\r
33 \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
37     }\r
38     registeredAdapterFactoryFunctions_->insert({interfaceName, adapterFactoryMethod});\r
39 }\r
40 \r
41 \r
42 \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
48 }\r
49 \r
50 DBusFactory::~DBusFactory() {\r
51 }\r
52 \r
53 \r
54 std::vector<std::string> DBusFactory::getAvailableServiceInstances(const std::string& serviceName,\r
55                                                                    const std::string& domainName) {\r
56     return dbusConnection_->getDBusServiceRegistry()->getAvailableServiceInstances(serviceName, domainName);\r
57 }\r
58 \r
59 \r
60 bool DBusFactory::isServiceInstanceAlive(const std::string& participantId,\r
61                                          const std::string& serviceName,\r
62                                          const std::string& domainName) {\r
63 \r
64     return dbusConnection_->getDBusServiceRegistry()->isServiceInstanceAlive(participantId, serviceName, domainName);\r
65 }\r
66 \r
67 std::shared_ptr<Proxy> DBusFactory::createProxy(const char* interfaceIdentifier,\r
68                                                 const std::string& participantId,\r
69                                                 const std::string& serviceName,\r
70                                                 const std::string& domain) {\r
71     std::string commonApiAddress = domain + ":" + serviceName + ":" + participantId;\r
72 \r
73     std::string interfaceName;\r
74     std::string connectionName;\r
75     std::string objectPath;\r
76 \r
77     DBusAddressTranslator::getInstance().searchForDBusAddress(commonApiAddress, interfaceName, connectionName, objectPath);\r
78 \r
79     if(!registeredProxyFactoryFunctions_) {\r
80         registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction> {};\r
81     }\r
82 \r
83     for (auto it = registeredProxyFactoryFunctions_->begin(); it != registeredProxyFactoryFunctions_->end(); ++it) {\r
84         if(it->first == interfaceIdentifier) {\r
85             return (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_);\r
86         }\r
87     }\r
88 \r
89     return NULL;\r
90 }\r
91 \r
92 std::shared_ptr<StubAdapter> DBusFactory::createAdapter(std::shared_ptr<StubBase> stubBase,\r
93                                                         const char* interfaceIdentifier,\r
94                                                         const std::string& participantId,\r
95                                                         const std::string& serviceName,\r
96                                                         const std::string& domain) {\r
97     assert(dbusConnection_->isConnected());\r
98 \r
99     std::string commonApiAddress = domain + ":" + serviceName + ":" + participantId;\r
100 \r
101     std::string interfaceName;\r
102     std::string connectionName;\r
103     std::string objectPath;\r
104 \r
105     DBusAddressTranslator::getInstance().searchForDBusAddress(commonApiAddress, interfaceName, connectionName, objectPath);\r
106 \r
107     if(acquiredConnectionName_ == "") {\r
108         dbusConnection_->requestServiceNameAndBlock(connectionName);\r
109         acquiredConnectionName_ = connectionName;\r
110     } else if (acquiredConnectionName_ != connectionName) {\r
111         return NULL;\r
112     }\r
113 \r
114     if(!registeredAdapterFactoryFunctions_) {\r
115         registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction> {};\r
116     }\r
117 \r
118     for (auto it = registeredAdapterFactoryFunctions_->begin(); it != registeredAdapterFactoryFunctions_->end(); ++it) {\r
119         if(it->first == interfaceIdentifier) {\r
120             std::shared_ptr<DBusStubAdapter> dbusStubAdapter =  (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_, stubBase);\r
121             dbusStubAdapter->init();\r
122             return dbusStubAdapter;\r
123         }\r
124     }\r
125 \r
126     return NULL;\r
127 }\r
128 \r
129 \r
130 } // namespace DBus\r
131 } // namespace CommonAPI\r