[at-spi2-atk] Finished collection support



commit ea5287796c9b5d0045c4b401f3f1e7fec1d3c3cf
Author: Mike Gorse <mgorse novell com>
Date:   Fri Dec 18 12:11:06 2009 -0500

    Finished collection support

 atk-adaptor/accessible-marshaller.c |    5 +-
 atk-adaptor/bridge.c                |    2 +-
 atk-adaptor/collection-adaptor.c    |  160 ++++++++++++++++++++++++++---------
 common/bitarray.h                   |    3 -
 4 files changed, 124 insertions(+), 46 deletions(-)
---
diff --git a/atk-adaptor/accessible-marshaller.c b/atk-adaptor/accessible-marshaller.c
index 3646d60..bccd089 100644
--- a/atk-adaptor/accessible-marshaller.c
+++ b/atk-adaptor/accessible-marshaller.c
@@ -47,19 +47,20 @@ spi_dbus_append_name_and_path_inner (DBusMessageIter *iter, const char *bus_name
   dbus_message_iter_close_container (iter, &iter_struct);
 }
 
+extern gchar *atspi_dbus_name;
+
 void
 spi_dbus_append_name_and_path (DBusMessage *message, DBusMessageIter *iter, AtkObject *obj, gboolean do_register, gboolean unref)
 {
   gchar *path;
   DBusMessageIter iter_struct;
-  const char *bus_name = dbus_bus_get_unique_name (atk_adaptor_app_data->bus);
 
   path = atk_dbus_object_to_path (obj, do_register);
 
   if (!path)
     path = g_strdup (SPI_DBUS_PATH_NULL);
 
-  spi_dbus_append_name_and_path_inner (iter, bus_name, path);
+  spi_dbus_append_name_and_path_inner (iter, atspi_dbus_name, path);
 
   g_free (path);
   if (obj && unref)
diff --git a/atk-adaptor/bridge.c b/atk-adaptor/bridge.c
index 330faca..25bf8f3 100644
--- a/atk-adaptor/bridge.c
+++ b/atk-adaptor/bridge.c
@@ -280,7 +280,7 @@ install_plug_hooks ()
 }
 #endif
 
-static gchar *atspi_dbus_name = NULL;
+gchar *atspi_dbus_name = NULL;
 static gboolean atspi_no_register = FALSE;
 
 static GOptionEntry atspi_option_entries[] =
diff --git a/atk-adaptor/collection-adaptor.c b/atk-adaptor/collection-adaptor.c
index ec7640b..0122362 100644
--- a/atk-adaptor/collection-adaptor.c
+++ b/atk-adaptor/collection-adaptor.c
@@ -182,8 +182,6 @@ static gboolean
 match_roles_all_p (AtkObject *child, 
                    gint *roles)
 {
-   Accessibility_Role role; 
-
      if (roles == NULL || roles[0] == BITARRAY_SEQ_TERM) return TRUE;
      else if (roles[1] != BITARRAY_SEQ_TERM) return FALSE;
 
@@ -195,12 +193,12 @@ static gboolean
 match_roles_any_p (AtkObject *child, 
                    gint *roles)
 {
-     AtkRole role;
+     Accessibility_Role role;
      int i;
 
      if (roles == NULL || roles[0] == BITARRAY_SEQ_TERM) return TRUE;
 
-     role = atk_object_get_role(child);
+     role = spi_accessible_role_from_atk_role(atk_object_get_role(child));
 
      for (i = 0; roles[i] != BITARRAY_SEQ_TERM; i++)
 	  if (role  == roles[i])
@@ -590,6 +588,39 @@ query_exec (MatchRulePrivate *mrp,  Accessibility_Collection_SortOrder sortby,
      return kount;
 }
 
+static gboolean
+bitarray_to_seq (int *array, int array_count, int **ret)
+{
+  int out_size = 4;
+  int out_count = 0;
+  int i, j;
+  int *out = (int *)g_malloc(out_size * sizeof(int));
+
+  if (!out)
+    return FALSE;
+  for (i = 0; i < array_count; i++)
+  {
+    for (j = 0; j < 32; j++)
+    {
+      if (array[i] & (1 << j))
+      {
+	if (out_count == out_size - 2)
+	{
+	  out_size <<= 1;
+	  out = (int *)g_realloc(out, out_size * sizeof(int));
+	  if (!out)
+	    return FALSE;
+	}
+	out[out_count++] = i * 32 + j;
+      }
+    }
+  }
+  out[out_count] = BITARRAY_SEQ_TERM;
+  *ret = out;
+  return TRUE;
+}
+
+
 static dbus_bool_t
 read_mr(DBusMessageIter *iter, MatchRulePrivate *mrp)
 {
@@ -597,12 +628,11 @@ read_mr(DBusMessageIter *iter, MatchRulePrivate *mrp)
   dbus_uint32_t *array;
   dbus_int32_t matchType;
   int array_count;
-  char *str;
   AtkAttribute *attr;
   int i;
+  const char *str;
   char *interfaces = NULL;
 
-  // TODO: error checking
   dbus_message_iter_recurse(iter, &mrc);
   dbus_message_iter_recurse(&mrc, &arrayc);
   dbus_message_iter_get_fixed_array(&arrayc, &array, &array_count);
@@ -612,35 +642,64 @@ read_mr(DBusMessageIter *iter, MatchRulePrivate *mrp)
     mrp->states[i] = spi_atk_state_from_spi_state (mrp->states[i]);
   }
   dbus_message_iter_next(&mrc);
-  dbus_message_iter_read_basic(&mrc, &matchType);
+  dbus_message_iter_get_basic(&mrc, &matchType);
   dbus_message_iter_next(&mrc);
   mrp->statematchtype = matchType;;
   /* attributes */
-  dbus_message_iter_recurse(&mrc, &arrayc);
   mrp->attributes = NULL;
-  while (dbus_message_iter_get_arg_type(&arrayc) != DBUS_TYPE_INVALID)
+  if (dbus_message_iter_get_arg_type (&mrc) == DBUS_TYPE_STRING)
   {
-    dbus_message_iter_get_basic(&arrayc, &str);
-    // TODO: remove this print
-    g_print("Got attribute: %s\n", str);
-    attr = g_new (AtkAttribute, 1);
-    if (attr)
+    char *str;
+    gchar **attributes;
+    gchar **pp;
+    dbus_message_iter_get_basic(&mrc, &str);
+    attributes = g_strsplit(str, "\n", -1);
+    for (pp = attributes; *pp; pp++)
     {
-      int len = strcspn(str, ":");
-      attr->name = g_strndup(str, len);
-      if (str[len] == ':')
+      str = *pp;
+      attr = g_new (AtkAttribute, 1);
+      if (attr)
       {
-	len++;
-	if (str[len] == ' ') len++;
-	attr->value = g_strdup(str + len);
+	int len = strcspn(str, ":");
+	attr->name = g_strndup(str, len);
+	if (str[len] == ':')
+	{
+	  len++;
+	  if (str[len] == ' ') len++;
+	  attr->value = g_strdup(str + len);
+	}
+	else attr->value = NULL;
+	mrp->attributes = g_slist_prepend(mrp->attributes, attr);
       }
-      else attr->value = NULL;
-      mrp->attributes = g_slist_prepend(mrp->attributes, attr);
     }
-    dbus_message_iter_next(&arrayc);
+    g_strfreev (attributes);
+  } else
+  {
+    dbus_message_iter_recurse(&mrc, &arrayc);
+    while (dbus_message_iter_get_arg_type(&arrayc) != DBUS_TYPE_INVALID)
+    {
+      dbus_message_iter_get_basic(&arrayc, &str);
+      // TODO: remove this print
+      g_print("Got attribute: %s\n", str);
+      attr = g_new (AtkAttribute, 1);
+      if (attr)
+      {
+	int len = strcspn(str, ":");
+	attr->name = g_strndup(str, len);
+	if (str[len] == ':')
+	{
+	  len++;
+	  if (str[len] == ' ') len++;
+	  attr->value = g_strdup(str + len);
+	}
+	else attr->value = NULL;
+	mrp->attributes = g_slist_prepend(mrp->attributes, attr);
+      }
+      dbus_message_iter_next(&arrayc);
+    }
   }
   dbus_message_iter_next(&mrc);
-  dbus_message_iter_read_basic(&mrc, &matchType);
+  dbus_message_iter_get_basic(&mrc, &matchType);
   mrp->attributematchtype = matchType;;
   dbus_message_iter_next(&mrc);
   /* Get roles and role match */
@@ -648,18 +707,18 @@ read_mr(DBusMessageIter *iter, MatchRulePrivate *mrp)
   dbus_message_iter_get_fixed_array(&arrayc, &array, &array_count);
   bitarray_to_seq(array, array_count, &mrp->roles);
   dbus_message_iter_next(&mrc);
-  dbus_message_iter_read_basic(&mrc, &matchType);
+  dbus_message_iter_get_basic(&mrc, &matchType);
   mrp->rolematchtype = matchType;;
   dbus_message_iter_next(&mrc);
   /* Get interfaces and interface match */
-  dbus_message_iter_read_basic(&mrc, &interfaces);
+  dbus_message_iter_get_basic(&mrc, &interfaces);
   dbus_message_iter_next(&mrc);
   mrp->ifaces = g_strsplit(interfaces, ";", 0);
-  dbus_message_iter_read_basic(&mrc, &matchType);
+  dbus_message_iter_get_basic(&mrc, &matchType);
   mrp->interfacematchtype = matchType;;
   dbus_message_iter_next(&mrc);
   /* get invert */
-  dbus_message_iter_read_basic(&mrc, &mrp->invert);
+  dbus_message_iter_get_basic(&mrc, &mrp->invert);
   dbus_message_iter_next(iter);
   return TRUE;
 }
@@ -674,12 +733,10 @@ return_and_free_list(DBusMessage *message, GList *ls)
   reply = dbus_message_new_method_return(message);
   if (!reply) return NULL;
   dbus_message_iter_init_append(reply, &iter);
-  if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "o", &iter_array)) goto oom;
+  if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(so)", &iter_array)) goto oom;
   for (item = ls; item; item = g_list_next(item))
   {
-      char *path = (char *) spi_dbus_object_to_path ((AtkObject *)item->data);
-      dbus_message_iter_append_basic(&iter_array, DBUS_TYPE_OBJECT_PATH, &path);
-      g_free(path);
+      spi_dbus_append_name_and_path (message, &iter_array, ATK_OBJECT(item->data), TRUE, FALSE);
   }
   if (!dbus_message_iter_close_container(&iter, &iter_array)) goto oom;
   g_list_free (ls);
@@ -853,7 +910,6 @@ GetMatchesTo (DBusMessage *message,
   GList *ls = NULL;
   AtkObject *obj;
   gint kount = 0;
-
   ls = g_list_append (ls, current_object); 
     
   if (recurse){
@@ -884,14 +940,22 @@ impl_GetMatchesFrom (DBusConnection *bus, DBusMessage *message, void *user_data)
   AtkObject *current_object;
   DBusMessageIter iter;
   MatchRulePrivate rule;
-  dbus_uint16_t sortby;
-  dbus_uint16_t tree;
+  dbus_uint32_t sortby;
+  dbus_uint32_t tree;
   dbus_int32_t count;
   dbus_bool_t traverse;
   GList *ls = NULL;
+  const char *signature;
+
+  signature = dbus_message_get_signature(message);
+  if (strcmp (signature, "o(aiisiaiisib)uuib") != 0 &&
+    strcmp(signature, "o(aii(as)iaiisib)uuib") != 0)
+  {
+    return droute_invalid_arguments_error(message);
+  }
 
   dbus_message_iter_init(message, &iter);
-  dbus_message_iter_get_basic (&iter, current_object_path);
+  dbus_message_iter_get_basic (&iter, &current_object_path);
   current_object = atk_dbus_path_to_object (current_object_path);
   if (!current_object)
   {
@@ -936,15 +1000,23 @@ impl_GetMatchesTo (DBusConnection *bus, DBusMessage *message, void *user_data)
   AtkObject *current_object;
   DBusMessageIter iter;
   MatchRulePrivate rule;
-  dbus_uint16_t sortby;
-  dbus_uint16_t tree;
+  dbus_uint32_t sortby;
+  dbus_uint32_t tree;
   dbus_bool_t recurse;
   dbus_int32_t count;
   dbus_bool_t traverse;
   GList *ls = NULL;
+  const char *signature;
+
+  signature = dbus_message_get_signature(message);
+  if (strcmp (signature, "o(aiisiaiisib)uubib") != 0 &&
+    strcmp(signature, "o(aii(as)iaiisib)uubib") != 0)
+  {
+    return droute_invalid_arguments_error(message);
+  }
 
   dbus_message_iter_init(message, &iter);
-  dbus_message_iter_get_basic (&iter, current_object_path);
+  dbus_message_iter_get_basic (&iter, &current_object_path);
   current_object = atk_dbus_path_to_object (current_object_path);
   if (!current_object)
   {
@@ -990,10 +1062,18 @@ impl_GetMatches(DBusConnection *bus, DBusMessage *message, void *user_data)
   AtkObject *obj = atk_dbus_path_to_object (dbus_message_get_path (message));
   DBusMessageIter iter;
   MatchRulePrivate rule;
-  dbus_uint16_t sortby;
+  dbus_uint32_t sortby;
   dbus_int32_t count;
   dbus_bool_t traverse;
   GList *ls = NULL;
+  const char *signature;
+
+  signature = dbus_message_get_signature (message);
+  if (strcmp (signature, "(aiisiaiisib)uib") != 0 &&
+    strcmp(signature, "(aii(as)iaiisib)uib") != 0)
+  {
+    return droute_invalid_arguments_error(message);
+  }
 
   dbus_message_iter_init(message, &iter);
   if (!read_mr(&iter, &rule))
diff --git a/common/bitarray.h b/common/bitarray.h
index 65021e2..61ed673 100644
--- a/common/bitarray.h
+++ b/common/bitarray.h
@@ -29,7 +29,4 @@
 #define BITARRAY_SEQ_TERM 0xffffffff
 
 #define BITARRAY_SET(p, n) ((p)[n>>5] |= (1<<(n&31)))
-
-gint bitarray_to_seq(dbus_uint32_t *array, gint array_size, gint **out);
-dbus_uint32_t bitarray_from_seq(gint *seq, dbus_uint32_t **out);
 #endif	/* _BITARRAY_H */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]