summaryrefslogtreecommitdiffstats
path: root/glib
diff options
context:
space:
mode:
authorMichael Meeks <michael@ximian.com>2004-04-13 11:47:17 +0000
committerMichael Meeks <michael@ximian.com>2004-04-13 11:47:17 +0000
commitfefa7ed4d59f69eca45b51dc4a120993c87c218e (patch)
tree9c91e0fba58e9136cceb13c6ff6fb13e461f65af /glib
parent83d3819577efa227419946b611b62455eaaa2e5b (diff)
2004-04-13 Michael Meeks <michael@ximian.com>
* glib/dbus-gobject.c (handle_introspect): split out (introspect_properties): this. (handle_introspect): implement this.
Diffstat (limited to 'glib')
-rw-r--r--glib/dbus-gobject.c123
1 files changed, 82 insertions, 41 deletions
diff --git a/glib/dbus-gobject.c b/glib/dbus-gobject.c
index d06a99fe..18e4cb5f 100644
--- a/glib/dbus-gobject.c
+++ b/glib/dbus-gobject.c
@@ -179,48 +179,29 @@ dbus_type_to_string (int type)
}
}
-static DBusHandlerResult
-handle_introspect (DBusConnection *connection,
- DBusMessage *message,
- GObject *object)
+static void
+introspect_properties (GObject *object, GString *xml)
{
- GString *xml;
- GParamSpec **specs;
- unsigned int n_specs;
unsigned int i;
+ unsigned int n_specs;
GType last_type;
- DBusMessage *ret;
- char **path;
- char **children;
-
- if (!dbus_message_get_path_decomposed (message, &path))
- g_error ("Out of memory");
-
- if (!dbus_connection_list_registered (connection, (const char**) path,
- &children))
- g_error ("Out of memory");
-
- xml = g_string_new (NULL);
-
- g_string_append (xml, "<node>\n");
+ GParamSpec **specs;
last_type = G_TYPE_INVALID;
-
specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (object),
&n_specs);
- i = 0;
- while (i < n_specs)
+ for (i = 0; i < n_specs; i++ )
{
- GParamSpec *spec = specs[i];
- gboolean can_set;
- gboolean can_get;
char *s;
int dbus_type;
+ gboolean can_set;
+ gboolean can_get;
+ GParamSpec *spec = specs[i];
dbus_type = gtype_to_dbus_type (G_PARAM_SPEC_VALUE_TYPE (spec));
if (dbus_type == DBUS_TYPE_INVALID)
- goto next;
+ continue;
if (spec->owner_type != last_type)
{
@@ -232,7 +213,6 @@ handle_introspect (DBusConnection *connection,
* general? should people be able to set it for their
* objects?
*/
-
g_string_append (xml, " <interface name=\"org.gtk.objects.");
g_string_append (xml, g_type_name (spec->owner_type));
g_string_append (xml, "\">\n");
@@ -241,8 +221,8 @@ handle_introspect (DBusConnection *connection,
}
can_set = ((spec->flags & G_PARAM_WRITABLE) != 0 &&
- (spec->flags & G_PARAM_CONSTRUCT_ONLY) == 0);
-
+ (spec->flags & G_PARAM_CONSTRUCT_ONLY) == 0);
+
can_get = (spec->flags & G_PARAM_READABLE) != 0;
s = uscore_to_wincaps (spec->name);
@@ -270,28 +250,89 @@ handle_introspect (DBusConnection *connection,
}
g_free (s);
-
- next:
- ++i;
}
if (last_type != G_TYPE_INVALID)
g_string_append (xml, " </interface>\n");
g_free (specs);
+}
- /* Append child nodes */
-
- i = 0;
- while (children[i])
+static void
+introspect_signals (GType type, GString *xml)
+{
+ guint i;
+ guint *ids, n_ids;
+
+ ids = g_signal_list_ids (type, &n_ids);
+ if (!n_ids)
+ return;
+
+ g_string_append (xml, " <interface name=\"org.gtk.objects.");
+ g_string_append (xml, g_type_name (type));
+ g_string_append (xml, "\">\n");
+
+ /* FIXME: recurse to parent types ? */
+ for (i = 0; i < n_ids; i++)
{
+ guint arg;
+ GSignalQuery query;
+
+ g_signal_query (ids[i], &query);
+
+ if (query.return_type)
+ continue; /* FIXME: these could be listed as methods ? */
+
+ g_string_append (xml, " <signal name=\"");
+ g_string_append (xml, query.signal_name);
+ g_string_append (xml, "\">\n");
+
+ for (arg = 0; arg < query.n_params; arg++)
+ {
+ int dbus_type = gtype_to_dbus_type (query.param_types[arg]);
+
+ g_string_append (xml, " <arg type=\"");
+ g_string_append (xml, dbus_type_to_string (dbus_type));
+ g_string_append (xml, "\"/>\n");
+ }
+
+ g_string_append (xml, " </signal>\n");
+ }
+
+ g_string_append (xml, " </interface>\n");
+}
+
+static DBusHandlerResult
+handle_introspect (DBusConnection *connection,
+ DBusMessage *message,
+ GObject *object)
+{
+ GString *xml;
+ unsigned int i;
+ DBusMessage *ret;
+ char **path;
+ char **children;
+
+ if (!dbus_message_get_path_decomposed (message, &path))
+ g_error ("Out of memory");
+
+ if (!dbus_connection_list_registered (connection, (const char**) path,
+ &children))
+ g_error ("Out of memory");
+
+ xml = g_string_new (NULL);
+
+ introspect_signals (G_OBJECT_TYPE (object), xml);
+ introspect_properties (object, xml);
+
+ g_string_append (xml, "<node>\n");
+
+ /* Append child nodes */
+ for (i = 0; children[i]; i++)
g_string_append_printf (xml, " <node name=\"%s\"/>\n",
children[i]);
- ++i;
- }
/* Close the XML, and send it to the requesting app */
-
g_string_append (xml, "</node>\n");
ret = dbus_message_new_method_return (message);