← Back to team overview

ayatana-commits team mailing list archive

[Branch ~dbusmenu-team/dbusmenu/trunk] Rev 45: Adding in support for the GetChildren function.

 

Merge authors:
  Aurélien Gâteau (agateau)
Related merge proposals:
  https://code.launchpad.net/~agateau/dbusmenu/GetChildren/+merge/16791
  proposed by: Ted Gould (ted)
------------------------------------------------------------
revno: 45 [merge]
author: Aurélien Gâteau <aurelien.gateau@xxxxxxxxxxxxx>
committer: Ted Gould <ted@xxxxxxxx>
branch nick: trunk
timestamp: Mon 2010-01-04 11:04:18 -0600
message:
  Adding in support for the GetChildren function.
modified:
  libdbusmenu-glib/dbus-menu.xml
  libdbusmenu-glib/server.c


--
lp:dbusmenu
https://code.launchpad.net/~dbusmenu-team/dbusmenu/trunk

Your team ayatana-commits is subscribed to branch lp:dbusmenu.
To unsubscribe from this branch go to https://code.launchpad.net/~dbusmenu-team/dbusmenu/trunk/+edit-subscription.
=== modified file 'libdbusmenu-glib/dbus-menu.xml'
--- libdbusmenu-glib/dbus-menu.xml	2009-12-08 17:54:27 +0000
+++ libdbusmenu-glib/dbus-menu.xml	2009-12-24 10:31:16 +0000
@@ -88,6 +88,12 @@
 			<arg type="a(ua{sv})" name="properties" direction="out" />
 		</method>
 
+		<method name="GetChildren">
+			<arg type="u" name="id" direction="in" />
+			<arg type="as" name="propertyNames" direction="in" />
+			<arg type="a(ua{sv})" name="properties" direction="out" />
+		</method>
+
 <!--
 Each menu item has a set of properties. Property keys are in menuitem.h:
 

=== modified file 'libdbusmenu-glib/server.c'
--- libdbusmenu-glib/server.c	2009-12-22 03:18:35 +0000
+++ libdbusmenu-glib/server.c	2009-12-24 10:31:16 +0000
@@ -40,6 +40,7 @@
 static gboolean _dbusmenu_server_get_properties (DbusmenuServer * server, guint id, GPtrArray * properties, GHashTable ** dict, GError ** error);
 static gboolean _dbusmenu_server_get_group_properties (DbusmenuServer * server, GArray * ids, GArray * properties, GHashTable ** values, GError ** error);
 static gboolean _dbusmenu_server_event (DbusmenuServer * server, guint id, gchar * eventid, GValue * data, GError ** error);
+static gboolean _dbusmenu_server_get_children (DbusmenuServer * server, guint id, GPtrArray * properties, GPtrArray ** output, GError ** error);
 
 #include "dbusmenu-server.h"
 
@@ -473,6 +474,68 @@
 	return FALSE;
 }
 
+static void
+_gvalue_array_append_uint(GValueArray *array, guint i)
+{
+	GValue value = {0};
+
+	g_value_init(&value, G_TYPE_UINT);
+	g_value_set_uint(&value, i);
+	g_value_array_append(array, &value);
+	g_value_unset(&value);
+}
+
+static void
+_gvalue_array_append_hashtable(GValueArray *array, GHashTable * dict)
+{
+	GValue value = {0};
+
+	g_value_init(&value, dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE));
+	g_value_set_boxed(&value, dict);
+	g_value_array_append(array, &value);
+	g_value_unset(&value);
+}
+
+static void
+serialize_menuitem(gpointer data, gpointer user_data)
+{
+	DbusmenuMenuitem * mi = DBUSMENU_MENUITEM(data);
+	GPtrArray * output = (GPtrArray *)(user_data);
+
+	guint id = dbusmenu_menuitem_get_id(mi);
+	GHashTable * dict = dbusmenu_menuitem_properties_copy(mi);
+
+	GValueArray * item = g_value_array_new(1);
+	_gvalue_array_append_uint(item, id);
+	_gvalue_array_append_hashtable(item, dict);
+
+	g_ptr_array_add(output, item);
+}
+
+static gboolean
+_dbusmenu_server_get_children (DbusmenuServer * server, guint id, GPtrArray * properties, GPtrArray ** output, GError ** error)
+{
+	DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
+	DbusmenuMenuitem * mi = id == 0 ? priv->root : dbusmenu_menuitem_find_id(priv->root, id);
+
+	if (mi == NULL) {
+		if (error != NULL) {
+			g_set_error(error,
+			            error_quark(),
+			            INVALID_MENUITEM_ID,
+			            "The ID supplied %d does not refer to a menu item we have",
+			            id);
+		}
+		return FALSE;
+	}
+
+	*output = g_ptr_array_new();
+	GList * children = dbusmenu_menuitem_get_children(mi);
+	g_list_foreach(children, serialize_menuitem, *output);
+
+	return TRUE;
+}
+
 static gboolean
 _dbusmenu_server_event (DbusmenuServer * server, guint id, gchar * eventid, GValue * data, GError ** error)
 {