diff options
author | Johannes Schanda <schanda@itestra.de> | 2013-05-17 17:23:59 +0200 |
---|---|---|
committer | Johannes Schanda <schanda@itestra.de> | 2013-05-17 17:23:59 +0200 |
commit | f330e0d83eb92b07709a305f515a152d714ded0f (patch) | |
tree | f5b49cad01106c49ffe422349370be22611ae88d | |
parent | 58e52761b488a26fe84391ce947dea255f76fab8 (diff) | |
download | genivi-common-api-dbus-runtime-f330e0d83eb92b07709a305f515a152d714ded0f.tar.gz |
Introspection handling for entire tree of superpaths of a registered object path2.0.5
-rw-r--r-- | src/CommonAPI/DBus/DBusObjectManager.cpp | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/src/CommonAPI/DBus/DBusObjectManager.cpp b/src/CommonAPI/DBus/DBusObjectManager.cpp index 3c3c122..09ff9ba 100644 --- a/src/CommonAPI/DBus/DBusObjectManager.cpp +++ b/src/CommonAPI/DBus/DBusObjectManager.cpp @@ -8,12 +8,15 @@ #include "DBusDaemonProxy.h" #include "DBusStubAdapter.h" #include "DBusOutputStream.h" +#include "DBusUtils.h" #include <dbus/dbus-protocol.h> #include <cassert> #include <sstream> +#include <unordered_set> + namespace CommonAPI { namespace DBus { @@ -151,6 +154,7 @@ bool DBusObjectManager::onIntrospectableInterfaceDBusMessage(const DBusMessage& "</method>\n" "</interface>\n"; + std::unordered_set<std::string> nodeSet; for (auto& registeredObjectsIterator : dbusRegisteredObjectsTable_) { const DBusInterfaceHandlerPath& handlerPath = registeredObjectsIterator.first; const std::string& dbusObjectPath = handlerPath.first; @@ -163,6 +167,42 @@ bool DBusObjectManager::onIntrospectableInterfaceDBusMessage(const DBusMessage& xmlData << "<interface name=\"" << dbusInterfaceName << "\">\n" << dbusStubAdapter->getMethodsDBusIntrospectionXmlData() << "\n" "</interface>\n"; + } else { + std::vector<std::string> elems = CommonAPI::DBus::split(dbusObjectPath, '/'); + if (dbusMessage.hasObjectPath("/") && elems.size() > 1) { + if (nodeSet.find(elems[1]) == nodeSet.end()) { + if (nodeSet.size() == 0) { + xmlData.str(""); + xmlData << "<!DOCTYPE node PUBLIC \"" DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIER "\"\n\"" + DBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER"\">\n" + "<node>\n"; + } + xmlData << " <node name=\"" << elems[1] << "\"/>\n"; + nodeSet.insert(elems[1]); + foundRegisteredObjects = true; + } + } else { + for (int i = 1; i < elems.size() - 1; i++) { + std::string build; + for (int j = 1; j <= i; j++) { + build = build + "/" + elems[j]; + if (dbusMessage.hasObjectPath(dbusObjectPath)) { + if (nodeSet.find(elems[j + 1]) == nodeSet.end()) { + if (nodeSet.size() == 0) { + xmlData.str(""); + xmlData << "<!DOCTYPE node PUBLIC \"" DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIER "\"\n\"" + DBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER"\">\n" + "<node>\n"; + } + xmlData << " <node name=\"" << elems[j + 1] << "\"/>\n"; + nodeSet.insert(elems[j + 1]); + foundRegisteredObjects = true; + } + break; + } + } + } + } } } @@ -170,7 +210,8 @@ bool DBusObjectManager::onIntrospectableInterfaceDBusMessage(const DBusMessage& DBusMessage dbusMessageReply = dbusMessage.createMethodReturn("s"); DBusOutputStream dbusOutputStream(dbusMessageReply); - xmlData << "</node>"; + xmlData << "</node>" + ""; dbusOutputStream << xmlData.str(); dbusOutputStream.flush(); |