Don't pass empty property array to RegisterEvent
authorMike Gorse <mgorse@suse.com>
Mon, 24 Feb 2014 23:11:22 +0000 (17:11 -0600)
committerMike Gorse <mgorse@suse.com>
Mon, 24 Feb 2014 23:11:22 +0000 (17:11 -0600)
Apparently, for some reason unknown to me, it is sometimes possible for
a jhbuild session to be running an at-spi2-registryd from the system
directory, rather than the jhbuild install, so it is useful to be
compatible with at-spi2-registryd <= 3.10. So, for now, if no properties
are being requested with an event, then let's leave off the (empty)
array.

Also modify at-spi2-registryd to accept the old form of RegisterEvent.

We may want to revert this eventually; it would be cleaner not to send
two different forms of RegisterEvent.

atspi/atspi-event-listener.c
registryd/registry.c

index 3e6e73a..752d440 100644 (file)
@@ -551,12 +551,19 @@ static gboolean
 notify_event_registered (EventListenerEntry *e)
 {
 
-  dbind_method_call_reentrant (_atspi_bus (), atspi_bus_registry,
-                              atspi_path_registry,
-                              atspi_interface_registry,
-                              "RegisterEvent",
-                              NULL, "sas", e->event_type,
-                               e->properties);
+  if (e->properties)
+    dbind_method_call_reentrant (_atspi_bus (), atspi_bus_registry,
+                                atspi_path_registry,
+                                atspi_interface_registry,
+                                "RegisterEvent",
+                                NULL, "sas", e->event_type,
+                                 e->properties);
+  else
+    dbind_method_call_reentrant (_atspi_bus (), atspi_bus_registry,
+                                atspi_path_registry,
+                                atspi_interface_registry,
+                                "RegisterEvent",
+                                NULL, "s", e->event_type);
 
   return TRUE;
 }
index 6f37a96..c533eb0 100644 (file)
@@ -837,7 +837,8 @@ impl_register_event (DBusConnection *bus, DBusMessage *message, void *user_data)
   DBusMessageIter iter, iter_array;
   const char *signature = dbus_message_get_signature (message);
 
-  if (strcmp (signature, "sas") != 0)
+  if (strcmp (signature, "sas") != 0 &&
+      strcmp (signature, "s") != 0)
   {
     g_warning ("got RegisterEvent with invalid signature '%s'", signature);
     return NULL;
@@ -846,7 +847,6 @@ impl_register_event (DBusConnection *bus, DBusMessage *message, void *user_data)
   dbus_message_iter_init (message, &iter);
   dbus_message_iter_get_basic (&iter, &orig_name);
   dbus_message_iter_next (&iter);
-  dbus_message_iter_recurse (&iter, &iter_array);
   name = ensure_proper_format (orig_name);
 
   evdata = g_new0 (event_data, 1);
@@ -854,13 +854,17 @@ impl_register_event (DBusConnection *bus, DBusMessage *message, void *user_data)
   evdata->bus_name = g_strdup (sender);
   evdata->data = data;
 
-  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+  if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY)
   {
-    const char *property;
-    dbus_message_iter_get_basic (&iter_array, &property);
-    evdata->properties = g_slist_append (evdata->properties,
-                                         g_strdup (property));
-    dbus_message_iter_next (&iter_array);
+    dbus_message_iter_recurse (&iter, &iter_array);
+    while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+    {
+      const char *property;
+      dbus_message_iter_get_basic (&iter_array, &property);
+      evdata->properties = g_slist_append (evdata->properties,
+                                           g_strdup (property));
+      dbus_message_iter_next (&iter_array);
+    }
   }
   registry->events = g_list_append (registry->events, evdata);