ref an object while adding it to the cache
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / adaptors / collection-adaptor.c
index 1702ee7..3bf76a3 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "accessible-register.h"
 #include "object.h"
+#include "introspection.h"
 
 typedef struct _MatchRulePrivate MatchRulePrivate;
 struct _MatchRulePrivate
@@ -52,27 +53,27 @@ static gboolean
 child_interface_p (AtkObject * child, gchar * repo_id)
 {
   if (!strcasecmp (repo_id, "action"))
-    return atk_is_action (child);
+    return ATK_IS_ACTION (child);
   if (!strcasecmp (repo_id, "component"))
-    return atk_is_component (child);
+    return ATK_IS_COMPONENT (child);
   if (!strcasecmp (repo_id, "editabletext"))
-    return atk_is_editable_text (child);
+    return ATK_IS_EDITABLE_TEXT (child);
   if (!strcasecmp (repo_id, "text"))
-    return atk_is_text (child);
+    return ATK_IS_TEXT (child);
   if (!strcasecmp (repo_id, "hypertext"))
-    return atk_is_hypertext (child);
+    return ATK_IS_HYPERTEXT (child);
   if (!strcasecmp (repo_id, "image"))
-    return atk_is_image (child);
+    return ATK_IS_IMAGE (child);
   if (!strcasecmp (repo_id, "selection"))
-    return atk_is_selection (child);
+    return ATK_IS_SELECTION (child);
   if (!strcasecmp (repo_id, "table"))
-    return atk_is_table (child);
+    return ATK_IS_TABLE (child);
   if (!strcasecmp (repo_id, "value"))
-    return atk_is_value (child);
+    return ATK_IS_VALUE (child);
   if (!strcasecmp (repo_id, "streamablecontent"))
-    return atk_is_streamable_content (child);
+    return ATK_IS_STREAMABLE_CONTENT (child);
   if (!strcasecmp (repo_id, "document"))
-    return atk_is_document (child);
+    return ATK_IS_DOCUMENT (child);
   return FALSE;
 }
 
@@ -85,7 +86,7 @@ match_states_all_p (AtkObject * child, gint * set)
   gint i;
   gboolean ret = TRUE;
 
-  if (set == NULL)
+  if (set == NULL || set[0] == BITARRAY_SEQ_TERM)
     return TRUE;
 
   chs = atk_object_ref_state_set (child);
@@ -111,7 +112,7 @@ match_states_any_p (AtkObject * child, gint * set)
   gint i;
   gboolean ret = FALSE;
 
-  if (set == NULL)
+  if (set == NULL || set[0] == BITARRAY_SEQ_TERM)
     return TRUE;
 
   chs = atk_object_ref_state_set (child);
@@ -136,7 +137,7 @@ match_states_none_p (AtkObject * child, gint * set)
   gint i;
   gboolean ret = TRUE;
 
-  if (set == NULL)
+  if (set == NULL || set[0] == BITARRAY_SEQ_TERM)
     return TRUE;
 
   chs = atk_object_ref_state_set (child);
@@ -537,7 +538,8 @@ sort_order_rev_canonical (MatchRulePrivate * mrp, GList * ls,
   /* Add to the list if it matches */
   if (flag && match_interfaces_lookup (obj, mrp)
       && match_states_lookup (obj, mrp)
-      && match_roles_lookup (obj, mrp) && match_attributes_lookup (obj, mrp))
+      && match_roles_lookup (obj, mrp) && match_attributes_lookup (obj, mrp)
+      && (max == 0 || kount < max))
     {
       ls = g_list_append (ls, obj);
       kount++;
@@ -550,7 +552,7 @@ sort_order_rev_canonical (MatchRulePrivate * mrp, GList * ls,
   indexinparent = atk_object_get_index_in_parent (obj);
   parent = atk_object_get_parent (obj);
 
-  if (indexinparent > 0)
+  if (indexinparent > 0 && (max == 0 || kount < max))
     {
       /* there are still some siblings to visit so get the previous sibling
          and get it's last descendant.
@@ -570,7 +572,7 @@ sort_order_rev_canonical (MatchRulePrivate * mrp, GList * ls,
       kount = sort_order_rev_canonical (mrp, ls, kount, max,
                                         nextobj, TRUE, pobj);
     }
-  else
+  else if (max == 0 || kount < max)
     {
       /* no more siblings so next node must be the parent */
       kount = sort_order_rev_canonical (mrp, ls, kount, max,
@@ -843,7 +845,7 @@ inorder (AtkObject * collection, MatchRulePrivate * mrp,
       obj = parent;
     }
 
-  if (kount < max)
+  if (max == 0 || kount < max)
     {
       kount = sort_order_canonical (mrp, ls, kount, max,
                                     obj, i + 1, TRUE, FALSE, TRUE, TRUE);
@@ -1134,5 +1136,5 @@ void
 spi_initialize_collection (DRoutePath * path)
 {
   droute_path_add_interface (path,
-                             SPI_DBUS_INTERFACE_COLLECTION, methods, NULL);
+                             SPI_DBUS_INTERFACE_COLLECTION, spi_org_a11y_atspi_Collection, methods, NULL);
 };