Initial import to Git
[profile/ivi/common-api-dbus-runtime.git] / CommonAPI-DBus / src / CommonAPI / DBus / DBusObjectManager.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 "DBusObjectManager.h"\r
5 #include "DBusOutputStream.h"\r
6 \r
7 #include <cassert>\r
8 \r
9 namespace CommonAPI {\r
10 namespace DBus {\r
11 \r
12 DBusObjectManager::DBusObjectManager(const std::shared_ptr<DBusConnection>& dbusConnection):\r
13         dbusConnection_(dbusConnection) {\r
14 \r
15     registerInterfaceHandler("/",\r
16                              "org.freedesktop.DBus.ObjectManager",\r
17                              std::bind(&DBusObjectManager::onGetDBusObjectManagerData, this, std::placeholders::_1));\r
18 }\r
19 \r
20 DBusInterfaceHandlerToken DBusObjectManager::registerInterfaceHandler(const std::string& objectPath,\r
21                                                                       const std::string& interfaceName,\r
22                                                                       const DBusMessageInterfaceHandler& dbusMessageInterfaceHandler) {\r
23     DBusInterfaceHandlerPath handlerPath(objectPath, interfaceName);\r
24     bool noSuchHandlerRegistered = dbusRegisteredObjectsTable_.find(handlerPath) == dbusRegisteredObjectsTable_.end();\r
25 \r
26     assert(noSuchHandlerRegistered);\r
27 \r
28     dbusRegisteredObjectsTable_.insert({handlerPath, dbusMessageInterfaceHandler});\r
29     dbusConnection_->registerObjectPath(objectPath);\r
30 \r
31     return handlerPath;\r
32 }\r
33 \r
34 void DBusObjectManager::unregisterInterfaceHandler(const DBusInterfaceHandlerToken& dbusInterfaceHandlerToken) {\r
35     const std::string& objectPath = dbusInterfaceHandlerToken.first;\r
36 \r
37     dbusConnection_->unregisterObjectPath(objectPath);\r
38 \r
39     dbusRegisteredObjectsTable_.erase(dbusInterfaceHandlerToken);\r
40 }\r
41 \r
42 bool DBusObjectManager::handleMessage(const DBusMessage& dbusMessage) const {\r
43     const char* objectPath = dbusMessage.getObjectPath();\r
44     const char* interfaceName = dbusMessage.getInterfaceName();\r
45 \r
46     assert(objectPath);\r
47     assert(interfaceName);\r
48 \r
49     DBusInterfaceHandlerPath handlerPath(objectPath, interfaceName);\r
50     auto handlerIterator = dbusRegisteredObjectsTable_.find(handlerPath);\r
51     const bool foundDBusInterfaceHandler = handlerIterator != dbusRegisteredObjectsTable_.end();\r
52     bool dbusMessageHandled = false;\r
53 \r
54     if (foundDBusInterfaceHandler) {\r
55         const DBusMessageInterfaceHandler& interfaceHandlerDBusMessageHandler = handlerIterator->second;\r
56         dbusMessageHandled = interfaceHandlerDBusMessageHandler(dbusMessage);\r
57     }\r
58 \r
59     return dbusMessageHandled;\r
60 }\r
61 \r
62 bool DBusObjectManager::onGetDBusObjectManagerData(const DBusMessage& callMessage) {\r
63 \r
64     DBusObjectToInterfaceDict dictToSend;\r
65 \r
66     const char* interfaceName = callMessage.getInterfaceName();\r
67     const char* signature = callMessage.getSignatureString();\r
68 \r
69     assert(!strcmp(interfaceName, "org.freedesktop.DBus.ObjectManager"));\r
70     assert(!strcmp(signature, ""));\r
71     assert(callMessage.getType() == DBusMessage::Type::MethodCall);\r
72 \r
73     auto registeredObjectsIterator = dbusRegisteredObjectsTable_.begin();\r
74 \r
75     while(registeredObjectsIterator != dbusRegisteredObjectsTable_.end()) {\r
76         DBusInterfaceHandlerPath handlerPath = registeredObjectsIterator->first;\r
77         auto foundDictEntry = dictToSend.find(handlerPath.first);\r
78 \r
79         if(foundDictEntry == dictToSend.end()) {\r
80             dictToSend.insert( { handlerPath.first, { { handlerPath.second, {} } } } );\r
81         } else {\r
82             foundDictEntry->second.insert( {handlerPath.second, {} } );\r
83         }\r
84 \r
85         ++registeredObjectsIterator;\r
86     }\r
87 \r
88     DBusMessage replyMessage = callMessage.createMethodReturn(DBusServiceRegistry::getManagedObjectsDBusSignature_);\r
89 \r
90     DBusOutputStream outStream(replyMessage);\r
91     outStream << dictToSend;\r
92     outStream.flush();\r
93     return dbusConnection_->sendDBusMessage(replyMessage);\r
94 }\r
95 \r
96 \r
97 } // namespace DBus\r
98 } // namespace CommonAPI\r