Successfully read in local .ini file w/o relying on commandline
[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& serviceInterfaceName,\r
55                                                                    const std::string& serviceDomainName) {\r
56     return dbusConnection_->getDBusServiceRegistry()->getAvailableServiceInstances(serviceInterfaceName, serviceDomainName);\r
57 }\r
58 \r
59 \r
60 bool DBusFactory::isServiceInstanceAlive(const std::string& serviceInstanceId,\r
61                                          const std::string& serviceInterfaceName,\r
62                                          const std::string& serviceDomainName) {\r
63 \r
64     return dbusConnection_->getDBusServiceRegistry()->isServiceInstanceAlive(serviceInstanceId, serviceInterfaceName, serviceDomainName);\r
65 }\r
66 \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
70 \r
71     DBusAddressTranslator::getInstance().searchForDBusInstanceId(participantId, connectionName, objectPath);\r
72 \r
73     if(!registeredProxyFactoryFunctions_) {\r
74         registeredProxyFactoryFunctions_ = new std::unordered_map<std::string, DBusProxyFactoryFunction> {};\r
75     }\r
76 \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
80         }\r
81     }\r
82 \r
83     return NULL;\r
84 }\r
85 \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
88 \r
89     std::string connectionName;\r
90     std::string objectPath;\r
91 \r
92     DBusAddressTranslator::getInstance().searchForDBusInstanceId(participantId, connectionName, objectPath);\r
93 \r
94     if(acquiredConnectionName_ == "") {\r
95         dbusConnection_->requestServiceNameAndBlock(connectionName);\r
96         acquiredConnectionName_ = connectionName;\r
97     } else if (acquiredConnectionName_ != connectionName) {\r
98         return NULL;\r
99     }\r
100 \r
101     if(!registeredAdapterFactoryFunctions_) {\r
102         registeredAdapterFactoryFunctions_ = new std::unordered_map<std::string, DBusAdapterFactoryFunction> {};\r
103     }\r
104 \r
105     for (auto it = registeredAdapterFactoryFunctions_->begin(); it != registeredAdapterFactoryFunctions_->end(); ++it) {\r
106         if(it->first == interfaceName) {\r
107             std::shared_ptr<DBusStubAdapter> dbusStubAdapter =  (it->second)(connectionName.c_str(), objectPath.c_str(), dbusConnection_, stubBase);\r
108             dbusStubAdapter->init();\r
109             return dbusStubAdapter;\r
110         }\r
111     }\r
112 \r
113     return NULL;\r
114 }\r
115 \r
116 \r
117 } // namespace DBus\r
118 } // namespace CommonAPI\r