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
9 namespace CommonAPI {
\r
12 DBusObjectManager::DBusObjectManager(const std::shared_ptr<DBusConnection>& dbusConnection):
\r
13 dbusConnection_(dbusConnection) {
\r
15 registerInterfaceHandler("/",
\r
16 "org.freedesktop.DBus.ObjectManager",
\r
17 std::bind(&DBusObjectManager::onGetDBusObjectManagerData, this, std::placeholders::_1));
\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
26 assert(noSuchHandlerRegistered);
\r
28 dbusRegisteredObjectsTable_.insert({handlerPath, dbusMessageInterfaceHandler});
\r
29 dbusConnection_->registerObjectPath(objectPath);
\r
34 void DBusObjectManager::unregisterInterfaceHandler(const DBusInterfaceHandlerToken& dbusInterfaceHandlerToken) {
\r
35 const std::string& objectPath = dbusInterfaceHandlerToken.first;
\r
37 dbusConnection_->unregisterObjectPath(objectPath);
\r
39 dbusRegisteredObjectsTable_.erase(dbusInterfaceHandlerToken);
\r
42 bool DBusObjectManager::handleMessage(const DBusMessage& dbusMessage) const {
\r
43 const char* objectPath = dbusMessage.getObjectPath();
\r
44 const char* interfaceName = dbusMessage.getInterfaceName();
\r
47 assert(interfaceName);
\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
54 if (foundDBusInterfaceHandler) {
\r
55 const DBusMessageInterfaceHandler& interfaceHandlerDBusMessageHandler = handlerIterator->second;
\r
56 dbusMessageHandled = interfaceHandlerDBusMessageHandler(dbusMessage);
\r
59 return dbusMessageHandled;
\r
62 bool DBusObjectManager::onGetDBusObjectManagerData(const DBusMessage& callMessage) {
\r
64 DBusObjectToInterfaceDict dictToSend;
\r
66 const char* interfaceName = callMessage.getInterfaceName();
\r
67 const char* signature = callMessage.getSignatureString();
\r
69 assert(!strcmp(interfaceName, "org.freedesktop.DBus.ObjectManager"));
\r
70 assert(!strcmp(signature, ""));
\r
71 assert(callMessage.getType() == DBusMessage::Type::MethodCall);
\r
73 auto registeredObjectsIterator = dbusRegisteredObjectsTable_.begin();
\r
75 while(registeredObjectsIterator != dbusRegisteredObjectsTable_.end()) {
\r
76 DBusInterfaceHandlerPath handlerPath = registeredObjectsIterator->first;
\r
77 auto foundDictEntry = dictToSend.find(handlerPath.first);
\r
79 if(foundDictEntry == dictToSend.end()) {
\r
80 dictToSend.insert( { handlerPath.first, { { handlerPath.second, {} } } } );
\r
82 foundDictEntry->second.insert( {handlerPath.second, {} } );
\r
85 ++registeredObjectsIterator;
\r
88 DBusMessage replyMessage = callMessage.createMethodReturn(DBusServiceRegistry::getManagedObjectsDBusSignature_);
\r
90 DBusOutputStream outStream(replyMessage);
\r
91 outStream << dictToSend;
\r
93 return dbusConnection_->sendDBusMessage(replyMessage);
\r
98 } // namespace CommonAPI
\r