Variants fully integrated with InputStream, bugfixing Variants and
[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 "DBusServiceRegistry.h"\r
11 #include "DBusUtils.h"\r
12 \r
13 #include <algorithm>\r
14 #include <cassert>\r
15 #include <sstream>\r
16 #include <unordered_map>\r
17 #include <vector>\r
18 \r
19 namespace CommonAPI {\r
20 namespace DBus {\r
21 \r
22 std::unordered_map<std::string, DBusProxyFactoryFunction>* registeredProxyFactoryFunctions_;\r
23 std::unordered_map<std::string, DBusAdapterFactoryFunction>* registeredAdapterFactoryFunctions_;\r
24 \r
25 \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
29     }\r
30     registeredProxyFactoryFunctions_->insert({interfaceName, proxyFactoryMethod});\r
31 }\r
32 \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
36     }\r
37     registeredAdapterFactoryFunctions_->insert({interfaceName, adapterFactoryMethod});\r
38 }\r
39 \r
40 \r
41 \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
47 }\r
48 \r
49 DBusFactory::~DBusFactory() {\r
50 }\r
51 \r
52 \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
56 }\r
57 \r
58 \r
59 bool DBusFactory::isServiceInstanceAlive(const std::string& serviceInstanceId,\r
60                                          const std::string& serviceInterfaceName,\r
61                                          const std::string& serviceDomainName) {\r
62 \r
63     return dbusConnection_->getDBusServiceRegistry()->isServiceInstanceAlive(serviceInstanceId, serviceInterfaceName, serviceDomainName);\r
64 }\r
65 \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
69 \r
70     findFallbackInstanceIdMapping(participantId, connectionName, objectPath);\r
71 \r
72     if(!registeredProxyFactoryFunctions_) {\r
73         registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction> {};\r
74     }\r
75 \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
79         }\r
80     }\r
81 \r
82     return NULL;\r
83 }\r
84 \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
87 \r
88     std::string connectionName;\r
89     std::string objectPath;\r
90     findFallbackInstanceIdMapping(participantId, connectionName, objectPath);\r
91 \r
92     if(acquiredConnectionName_ == "") {\r
93         dbusConnection_->requestServiceNameAndBlock(connectionName);\r
94         acquiredConnectionName_ = connectionName;\r
95     } else if (acquiredConnectionName_ != connectionName) {\r
96         return NULL;\r
97     }\r
98 \r
99     if(!registeredAdapterFactoryFunctions_) {\r
100         registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction> {};\r
101     }\r
102 \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
108         }\r
109     }\r
110 \r
111     return NULL;\r
112 }\r
113 \r
114 \r
115 } // namespace DBus\r
116 } // namespace CommonAPI\r