Initial import to Git
[profile/ivi/common-api-dbus-runtime.git] / CommonAPI-DBus / src / CommonAPI / DBus / DBusFactory.cpp
1 /* This Source Code Form is subject to the terms of the Mozilla Public\r
2  * License, v. 2.0. If a copy of the MPL was not distributed with this\r
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\r
4 #include "DBusProxy.h"\r
5 #include "DBusConnection.h"\r
6 #include "DBusFactory.h"\r
7 #include "DBusServiceRegistry.h"\r
8 #include "DBusUtils.h"\r
9 \r
10 #include <algorithm>\r
11 #include <cassert>\r
12 #include <iostream>\r
13 #include <sstream>\r
14 #include <unordered_map>\r
15 #include <vector>\r
16 \r
17 namespace CommonAPI {\r
18 namespace DBus {\r
19 \r
20 std::unordered_map<std::string, DBusProxyFactoryFunction>* registeredProxyFactoryFunctions_;\r
21 std::unordered_map<std::string, DBusAdapterFactoryFunction>* registeredAdapterFactoryFunctions_;\r
22 \r
23 \r
24 void DBusFactory::registerProxyFactoryMethod(std::string interfaceName, DBusProxyFactoryFunction proxyFactoryMethod) {\r
25     if(!registeredProxyFactoryFunctions_) {\r
26         registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction>();\r
27     }\r
28     registeredProxyFactoryFunctions_->insert({interfaceName, proxyFactoryMethod});\r
29 }\r
30 \r
31 void DBusFactory::registerAdapterFactoryMethod(std::string interfaceName, DBusAdapterFactoryFunction adapterFactoryMethod) {\r
32     if(!registeredAdapterFactoryFunctions_) {\r
33         registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction>();\r
34     }\r
35     registeredAdapterFactoryFunctions_->insert({interfaceName, adapterFactoryMethod});\r
36 }\r
37 \r
38 \r
39 \r
40 DBusFactory::DBusFactory(std::shared_ptr<Runtime> runtime, const MiddlewareInfo* middlewareInfo) :\r
41                 CommonAPI::Factory(runtime, middlewareInfo),\r
42                 dbusConnection_(CommonAPI::DBus::DBusConnection::getSessionBus()),\r
43                 acquiredConnectionName_("") {\r
44     dbusConnection_->connect();\r
45 }\r
46 \r
47 DBusFactory::~DBusFactory() {\r
48 }\r
49 \r
50 \r
51 std::vector<std::string> DBusFactory::getAvailableServiceInstances(const std::string& serviceInterfaceName,\r
52                                                                    const std::string& serviceDomainName) {\r
53     return dbusConnection_->getDBusServiceRegistry()->getAvailableServiceInstances(serviceInterfaceName, serviceDomainName);\r
54 }\r
55 \r
56 \r
57 bool DBusFactory::isServiceInstanceAlive(const std::string& serviceInstanceId,\r
58                                          const std::string& serviceInterfaceName,\r
59                                          const std::string& serviceDomainName) {\r
60 \r
61     return dbusConnection_->getDBusServiceRegistry()->isServiceInstanceAlive(serviceInstanceId, serviceInterfaceName, serviceDomainName);\r
62 }\r
63 \r
64 std::shared_ptr<Proxy> DBusFactory::createProxy(const char* interfaceName, const std::string& participantId, const std::string& domain) {\r
65     std::string connectionName;\r
66     std::string objectPath;\r
67 \r
68     findFallbackInstanceIdMapping(participantId, connectionName, objectPath);\r
69 \r
70     if(!registeredProxyFactoryFunctions_) {\r
71         registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction> {};\r
72     }\r
73 \r
74     for (auto it = registeredProxyFactoryFunctions_->begin(); it != registeredProxyFactoryFunctions_->end(); ++it) {\r
75         if(it->first == interfaceName) {\r
76             return (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_);\r
77         }\r
78     }\r
79 \r
80     return NULL;\r
81 }\r
82 \r
83 std::shared_ptr<StubAdapter> DBusFactory::createAdapter(std::shared_ptr<StubBase> stubBase, const char* interfaceName, const std::string& participantId, const std::string& domain) {\r
84     assert(dbusConnection_->isConnected());\r
85 \r
86     std::string connectionName;\r
87     std::string objectPath;\r
88     findFallbackInstanceIdMapping(participantId, connectionName, objectPath);\r
89 \r
90     if(acquiredConnectionName_ == "") {\r
91         dbusConnection_->requestServiceNameAndBlock(connectionName);\r
92         acquiredConnectionName_ = connectionName;\r
93     } else if (acquiredConnectionName_ != connectionName) {\r
94         return NULL;\r
95     }\r
96 \r
97     if(!registeredAdapterFactoryFunctions_) {\r
98         registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction> {};\r
99     }\r
100 \r
101     for (auto it = registeredAdapterFactoryFunctions_->begin(); it != registeredAdapterFactoryFunctions_->end(); ++it) {\r
102         if(it->first == interfaceName) {\r
103             std::shared_ptr<DBusStubAdapter> dbusStubAdapter =  (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_, stubBase);\r
104             dbusStubAdapter->init();\r
105             return dbusStubAdapter;\r
106         }\r
107     }\r
108 \r
109     return NULL;\r
110 }\r
111 \r
112 \r
113 } // namespace DBus\r
114 } // namespace CommonAPI\r