← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~ted/dbusmenu/dbus-error-handling into lp:dbusmenu

 

Ted Gould has proposed merging lp:~ted/dbusmenu/dbus-error-handling into lp:dbusmenu.

    Requested reviews:
    DBus Menu Team (dbusmenu-team)


Changing callbacks from DBus to be more protected in cases of errors.
Also changing a prototype that was wrong when compared to the
dbus-menu.xml spec.

-- 
https://code.launchpad.net/~ted/dbusmenu/dbus-error-handling/+merge/18949
Your team ayatana-commits is subscribed to branch lp:dbusmenu.
=== modified file 'libdbusmenu-glib/client.c'
--- libdbusmenu-glib/client.c	2010-02-08 22:02:12 +0000
+++ libdbusmenu-glib/client.c	2010-02-09 19:55:18 +0000
@@ -96,7 +96,7 @@
 static void set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec);
 static void get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec);
 /* Private Funcs */
-static void layout_update (DBusGProxy * proxy, gint revision, guint parent, DbusmenuClient * client);
+static void layout_update (DBusGProxy * proxy, guint revision, gint parent, DbusmenuClient * client);
 static void id_prop_update (DBusGProxy * proxy, gint id, gchar * property, GValue * value, DbusmenuClient * client);
 static void id_update (DBusGProxy * proxy, gint id, DbusmenuClient * client);
 static void build_proxies (DbusmenuClient * client);
@@ -309,7 +309,7 @@
 
 /* Annoying little wrapper to make the right function update */
 static void
-layout_update (DBusGProxy * proxy, gint revision, guint parent, DbusmenuClient * client)
+layout_update (DBusGProxy * proxy, guint revision, gint parent, DbusmenuClient * client)
 {
 	DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client);
 	priv->current_revision = revision;
@@ -504,8 +504,8 @@
 	dbus_g_proxy_add_signal(priv->menuproxy, "LayoutUpdated", G_TYPE_UINT, G_TYPE_INT, G_TYPE_INVALID);
 	dbus_g_proxy_connect_signal(priv->menuproxy, "LayoutUpdated", G_CALLBACK(layout_update), client, NULL);
 
-	dbus_g_object_register_marshaller(_dbusmenu_server_marshal_VOID__UINT_STRING_POINTER, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
-	dbus_g_proxy_add_signal(priv->menuproxy, "ItemPropertyUpdated", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
+	dbus_g_object_register_marshaller(_dbusmenu_server_marshal_VOID__INT_STRING_POINTER, G_TYPE_NONE, G_TYPE_INT, G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
+	dbus_g_proxy_add_signal(priv->menuproxy, "ItemPropertyUpdated", G_TYPE_INT, G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
 	dbus_g_proxy_connect_signal(priv->menuproxy, "ItemPropertyUpdated", G_CALLBACK(id_prop_update), client, NULL);
 
 	dbus_g_proxy_add_signal(priv->menuproxy, "ItemUpdated", G_TYPE_INT, G_TYPE_INVALID);
@@ -561,6 +561,7 @@
 static void
 menuitem_get_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * error, gpointer data)
 {
+	g_return_if_fail(DBUSMENU_IS_MENUITEM(data));
 	if (error != NULL) {
 		g_warning("Error getting properties on a menuitem: %s", error->message);
 		return;
@@ -570,19 +571,33 @@
 	return;
 }
 
+/* This function is called to refresh the properites on an item that
+   is getting recycled with the update, but we think might have prop
+   changes. */
 static void
 menuitem_get_properties_replace_cb (DBusGProxy * proxy, GHashTable * properties, GError * error, gpointer data)
 {
+	g_return_if_fail(DBUSMENU_IS_MENUITEM(data));
+	gboolean have_error = FALSE;
+
+	if (error != NULL) {
+		g_warning("Unable to replace properties on %d: %s", dbusmenu_menuitem_get_id(DBUSMENU_MENUITEM(data)), error->message);
+		have_error = TRUE;
+	}
+
 	GList * current_props = NULL;
 
 	for (current_props = dbusmenu_menuitem_properties_list(DBUSMENU_MENUITEM(data));
 			current_props != NULL ; current_props = g_list_next(current_props)) {
-		if (g_hash_table_lookup(properties, current_props->data) == NULL) {
+		if (have_error || g_hash_table_lookup(properties, current_props->data) == NULL) {
 			dbusmenu_menuitem_property_remove(DBUSMENU_MENUITEM(data), (const gchar *)current_props->data);
 		}
 	}
 
-	menuitem_get_properties_cb(proxy, properties, error, data);
+	if (!have_error) {
+		menuitem_get_properties_cb(proxy, properties, error, data);
+	}
+
 	return;
 }
 
@@ -632,13 +647,13 @@
 	return;
 }
 
+/* Respond to the call function to make sure that the other side
+   got it, or print a warning. */
 static void
 menuitem_call_cb (DBusGProxy * proxy, GError * error, gpointer userdata)
 {
-	DbusmenuMenuitem * mi = (DbusmenuMenuitem *)userdata;
-
 	if (error != NULL) {
-		g_warning("Unable to call menu item %d: %s", dbusmenu_menuitem_get_id(mi), error->message);
+		g_warning("Unable to call menu item %d: %s", GPOINTER_TO_INT(userdata), error->message);
 	}
 
 	return;

=== modified file 'libdbusmenu-glib/server-marshal.list'
--- libdbusmenu-glib/server-marshal.list	2010-02-03 18:33:58 +0000
+++ libdbusmenu-glib/server-marshal.list	2010-02-09 19:55:18 +0000
@@ -1,2 +1,2 @@
-VOID: UINT, STRING, POINTER
+VOID: INT, STRING, POINTER
 VOID: UINT, INT

=== modified file 'libdbusmenu-glib/server.c'
--- libdbusmenu-glib/server.c	2010-02-05 05:17:32 +0000
+++ libdbusmenu-glib/server.c	2010-02-09 19:55:18 +0000
@@ -129,8 +129,8 @@
 	                                         G_SIGNAL_RUN_LAST,
 	                                         G_STRUCT_OFFSET(DbusmenuServerClass, id_prop_update),
 	                                         NULL, NULL,
-	                                         _dbusmenu_server_marshal_VOID__UINT_STRING_POINTER,
-	                                         G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_VALUE);
+	                                         _dbusmenu_server_marshal_VOID__INT_STRING_POINTER,
+	                                         G_TYPE_NONE, 3, G_TYPE_INT, G_TYPE_STRING, G_TYPE_VALUE);
 	/**
 		DbusmenuServer::id-update:
 		@arg0: The #DbusmenuServer emitting the signal.


Follow ups