states: add ATSPI_STATE_CHECKABLE and ATSPI_STATE_HAS_POPUP
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / adaptors / cache-adaptor.c
index 3b5540c..cad7396 100644 (file)
@@ -80,8 +80,6 @@ append_cache_item (AtkObject * obj, gpointer data)
   const char *name, *desc;
   dbus_uint32_t role;
 
-  g_object_ref (G_OBJECT (obj));
-
   set = atk_object_ref_state_set (obj);
   {
     AtkObject *application, *parent;
@@ -154,11 +152,13 @@ append_cache_item (AtkObject * obj, gpointer data)
         for (i = 0; i < childcount; i++)
           {
             AtkObject *child;
-            gchar *child_path;
 
             child = atk_object_ref_accessible_child (obj, i);
-            spi_object_append_reference (&iter_sub_array, child);
-            g_object_unref (G_OBJECT (child));
+            if (child)
+              {
+                spi_object_append_reference (&iter_sub_array, child);
+                g_object_unref (G_OBJECT (child));
+              }
           }
       }
     if (ATK_IS_SOCKET (obj) && atk_socket_is_occupied (ATK_SOCKET (obj)))
@@ -216,11 +216,16 @@ append_cache_item (AtkObject * obj, gpointer data)
   }
   dbus_message_iter_close_container (iter_array, &iter_struct);
   g_object_unref (set);
-  g_object_unref (obj);
 }
 
 /*---------------------------------------------------------------------------*/
 
+static void
+ref_accessible_hf (gpointer key, gpointer obj_data, gpointer data)
+{
+  g_object_ref (key);
+}
+
 /* For use as a GHFunc */
 static void
 append_accessible_hf (gpointer key, gpointer obj_data, gpointer data)
@@ -230,6 +235,13 @@ append_accessible_hf (gpointer key, gpointer obj_data, gpointer data)
     append_cache_item (ATK_OBJECT (key), data);
 }
 
+static void
+add_to_list_hf (gpointer key, gpointer obj_data, gpointer data)
+{
+  GSList **listptr = data;
+  *listptr = g_slist_prepend (*listptr, key);
+}
+
 /*---------------------------------------------------------------------------*/
 
 static void
@@ -242,7 +254,6 @@ emit_cache_remove (SpiCache *cache, GObject * obj)
                                           "RemoveAccessible")))
     {
       DBusMessageIter iter;
-      gchar *path;
 
       dbus_message_iter_init_append (message, &iter);
 
@@ -267,7 +278,9 @@ emit_cache_add (SpiCache *cache, GObject * obj)
       DBusMessageIter iter;
 
       dbus_message_iter_init_append (message, &iter);
+      g_object_ref (accessible);
       append_cache_item (accessible, &iter);
+      g_object_unref (accessible);
 
       dbus_connection_send (spi_global_app_data->bus, message, NULL);
 
@@ -291,6 +304,7 @@ impl_GetItems (DBusConnection * bus, DBusMessage * message, void *user_data)
 {
   DBusMessage *reply;
   DBusMessageIter iter, iter_array;
+  GSList *pending_unrefs = NULL;
 
   if (bus == spi_global_app_data->bus)
     spi_atk_add_client (dbus_message_get_sender (message));
@@ -300,7 +314,10 @@ impl_GetItems (DBusConnection * bus, DBusMessage * message, void *user_data)
   dbus_message_iter_init_append (reply, &iter);
   dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
                                     SPI_CACHE_ITEM_SIGNATURE, &iter_array);
+  spi_cache_foreach (spi_global_cache, ref_accessible_hf, NULL);
   spi_cache_foreach (spi_global_cache, append_accessible_hf, &iter_array);
+  spi_cache_foreach (spi_global_cache, add_to_list_hf, &pending_unrefs);
+  g_slist_free_full (pending_unrefs, g_object_unref);
   dbus_message_iter_close_container (&iter, &iter_array);
   return reply;
 }
@@ -318,15 +335,11 @@ spi_initialize_cache (DRoutePath * path)
 {
   droute_path_add_interface (path, ATSPI_DBUS_INTERFACE_CACHE, spi_org_a11y_atspi_Cache, methods, NULL);
 
-  g_signal_connect (spi_global_cache,
-                    "object-added",
-                    (GCallback) emit_cache_add,
-                    NULL);
+  g_signal_connect (spi_global_cache, "object-added",
+                    (GCallback) emit_cache_add, NULL);
 
-  g_signal_connect (spi_global_cache,
-                    "object-removed",
-                    (GCallback) emit_cache_remove,
-                    NULL);
+  g_signal_connect (spi_global_cache, "object-removed",
+                    (GCallback) emit_cache_remove, NULL);
 };
 
 /*END------------------------------------------------------------------------*/