diff options
Diffstat (limited to 'dbus/dbus-object-tree.c')
-rw-r--r-- | dbus/dbus-object-tree.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/dbus/dbus-object-tree.c b/dbus/dbus-object-tree.c index f8797595..da8d8c26 100644 --- a/dbus/dbus-object-tree.c +++ b/dbus/dbus-object-tree.c @@ -615,11 +615,22 @@ handle_default_introspect_unlocked (DBusObjectTree *tree, DBusHandlerResult result; char **children; int i; + DBusMessage *reply; + DBusMessageIter iter; + const char *v_STRING; + /* We have the connection lock here */ + + _dbus_verbose (" considering default Introspect() handler...\n"); + + reply = NULL; + if (!dbus_message_is_method_call (message, DBUS_INTERFACE_ORG_FREEDESKTOP_INTROSPECTABLE, "Introspect")) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + _dbus_verbose (" using default Introspect() handler!\n"); if (!_dbus_string_init (&xml)) return DBUS_HANDLER_RESULT_NEED_MEMORY; @@ -648,12 +659,31 @@ handle_default_introspect_unlocked (DBusObjectTree *tree, if (!_dbus_string_append (&xml, "</node>\n")) goto out; + + reply = dbus_message_new_method_return (message); + if (reply == NULL) + goto out; + + dbus_message_iter_init_append (reply, &iter); + v_STRING = _dbus_string_get_const_data (&xml); + if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &v_STRING)) + goto out; + +#ifdef DBUS_BUILD_TESTS + if (tree->connection) +#endif + { + if (!_dbus_connection_send_unlocked (tree->connection, reply, NULL)) + goto out; + } result = DBUS_HANDLER_RESULT_HANDLED; out: _dbus_string_free (&xml); dbus_free_string_array (children); + if (reply) + dbus_message_unref (reply); return result; } |