summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2007-05-04 16:31:44 +0000
committerJohan Hedberg <johan.hedberg@nokia.com>2007-05-04 16:31:44 +0000
commit5cf1ae29510f5ec975080c793c692fedc10d86d8 (patch)
treebc139743bd6ae419f7c7b4b4bab7c8b5feabaa86
parent46564396bfb21f61f839aa7f8fe9cb954c10af14 (diff)
Include child nodes in the introspection data
-rw-r--r--common/dbus-helper.c53
1 files changed, 49 insertions, 4 deletions
diff --git a/common/dbus-helper.c b/common/dbus-helper.c
index 7dbb2dc0..639b6d3f 100644
--- a/common/dbus-helper.c
+++ b/common/dbus-helper.c
@@ -206,10 +206,12 @@ static void print_arguments(GString *gstr, const char *sig, const char *directio
}
}
-static void update_introspection_data(struct generic_data *data, const char *path)
+static void update_introspection_data(DBusConnection *conn, struct generic_data *data, const char *path)
{
GSList *list;
GString *gstr;
+ char **children;
+ int i;
g_free(data->introspect);
@@ -262,11 +264,47 @@ static void update_introspection_data(struct generic_data *data, const char *pat
g_string_append_printf(gstr, "\t</interface>\n");
}
+ if (!dbus_connection_list_registered(conn, path, &children))
+ goto done;
+
+ for (i = 0; children[i]; i++)
+ g_string_append_printf(gstr, "\t<node name=\"%s\"/>\n", children[i]);
+
+ dbus_free_string_array(children);
+
+done:
g_string_append_printf(gstr, "</node>\n");
data->introspect = g_string_free(gstr, FALSE);
}
+static void update_parent_data(DBusConnection *conn, const char *child_path)
+{
+ struct generic_data *data;
+ char *parent_path, *slash;
+
+ parent_path = g_strdup(child_path);
+ slash = strrchr(parent_path, '/');
+ if (!slash)
+ goto done;
+
+ *slash = '\0';
+ if (!strlen(parent_path))
+ goto done;
+
+ if (!dbus_connection_get_object_path_data(conn, parent_path,
+ (void *) &data))
+ goto done;
+
+ if (!data)
+ goto done;
+
+ update_introspection_data(conn, data, parent_path);
+
+done:
+ g_free(parent_path);
+}
+
dbus_bool_t dbus_connection_create_object_path(DBusConnection *connection,
const char *path, void *user_data,
DBusObjectPathUnregisterFunction function)
@@ -286,13 +324,20 @@ dbus_bool_t dbus_connection_create_object_path(DBusConnection *connection,
return FALSE;
}
+ update_parent_data(connection, path);
+
return TRUE;
}
dbus_bool_t dbus_connection_destroy_object_path(DBusConnection *connection,
const char *path)
{
- return dbus_connection_unregister_object_path(connection, path);
+ if (!dbus_connection_unregister_object_path(connection, path))
+ return FALSE;
+
+ update_parent_data(connection, path);
+
+ return TRUE;
}
dbus_bool_t dbus_connection_get_object_user_data(DBusConnection *connection,
@@ -335,7 +380,7 @@ dbus_bool_t dbus_connection_register_interface(DBusConnection *connection,
data->interfaces = g_slist_append(data->interfaces, iface);
- update_introspection_data(data, path);
+ update_introspection_data(connection, data, path);
return TRUE;
}
@@ -359,7 +404,7 @@ dbus_bool_t dbus_connection_unregister_interface(DBusConnection *connection,
g_free(iface->name);
g_free(iface);
- update_introspection_data(data, path);
+ update_introspection_data(connection, data, path);
return TRUE;
}