summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schanda <schanda@itestra.de>2013-05-17 17:23:59 +0200
committerJohannes Schanda <schanda@itestra.de>2013-05-17 17:23:59 +0200
commitf330e0d83eb92b07709a305f515a152d714ded0f (patch)
treef5b49cad01106c49ffe422349370be22611ae88d
parent58e52761b488a26fe84391ce947dea255f76fab8 (diff)
downloadgenivi-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.cpp43
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();