#include <atk/atk.h>
#include <droute/droute.h>
+#include "bridge.h"
-#include "common/bitarray.h"
-#include "common/spi-dbus.h"
-#include "common/spi-stateset.h"
+#include "bitarray.h"
+#include "spi-dbus.h"
+#include "accessible-stateset.h"
#include "accessible-register.h"
#include "object.h"
+#include "introspection.h"
typedef struct _MatchRulePrivate MatchRulePrivate;
struct _MatchRulePrivate
{
gint *states;
- Accessibility_Collection_MatchType statematchtype;
+ AtspiCollectionMatchType statematchtype;
AtkAttributeSet *attributes;
- Accessibility_Collection_MatchType attributematchtype;
+ AtspiCollectionMatchType attributematchtype;
gint *roles;
- Accessibility_Collection_MatchType rolematchtype;
+ AtspiCollectionMatchType rolematchtype;
gchar **ifaces;
- Accessibility_Collection_MatchType interfacematchtype;
+ AtspiCollectionMatchType interfacematchtype;
gboolean invert;
};
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;
}
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);
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);
for (i = 0; set[i] != BITARRAY_SEQ_TERM; i++)
{
- if (!atk_state_set_contains_state (chs, set[i]))
+ if (atk_state_set_contains_state (chs, set[i]))
{
ret = TRUE;
break;
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);
{
switch (mrp->statematchtype)
{
- case Accessibility_Collection_MATCH_ALL:
+ case ATSPI_Collection_MATCH_ALL:
if (match_states_all_p (child, mrp->states))
return TRUE;
break;
- case Accessibility_Collection_MATCH_ANY:
+ case ATSPI_Collection_MATCH_ANY:
if (match_states_any_p (child, mrp->states))
return TRUE;
break;
- case Accessibility_Collection_MATCH_NONE:
+ case ATSPI_Collection_MATCH_NONE:
if (match_states_none_p (child, mrp->states))
return TRUE;
break;
static gboolean
match_roles_any_p (AtkObject * child, gint * roles)
{
- Accessibility_Role role;
+ AtspiRole role;
int i;
if (roles == NULL || roles[0] == BITARRAY_SEQ_TERM)
{
switch (mrp->rolematchtype)
{
- case Accessibility_Collection_MATCH_ALL:
+ case ATSPI_Collection_MATCH_ALL:
if (match_roles_all_p (child, mrp->roles))
return TRUE;
break;
- case Accessibility_Collection_MATCH_ANY:
+ case ATSPI_Collection_MATCH_ANY:
if (match_roles_any_p (child, mrp->roles))
return TRUE;
break;
- case Accessibility_Collection_MATCH_NONE:
+ case ATSPI_Collection_MATCH_NONE:
if (match_roles_none_p (child, mrp->roles))
return TRUE;
break;
switch (mrp->interfacematchtype)
{
- case Accessibility_Collection_MATCH_ALL:
+ case ATSPI_Collection_MATCH_ALL:
if (match_interfaces_all_p (child, mrp->ifaces))
return TRUE;
break;
- case Accessibility_Collection_MATCH_ANY:
+ case ATSPI_Collection_MATCH_ANY:
if (match_interfaces_any_p (child, mrp->ifaces))
return TRUE;
break;
- case Accessibility_Collection_MATCH_NONE:
+ case ATSPI_Collection_MATCH_NONE:
if (match_interfaces_none_p (child, mrp->ifaces))
return TRUE;
break;
AtkAttribute *attr = g_slist_nth_data (attributes, i);
for (k = 0; k < oa_length; k++)
{
- AtkAttribute *oa_attr = g_slist_nth_data (attributes, i);
+ AtkAttribute *oa_attr = g_slist_nth_data (oa, k);
if (!g_ascii_strcasecmp (oa_attr->name, attr->name) &&
!g_ascii_strcasecmp (oa_attr->value, attr->value))
{
switch (mrp->attributematchtype)
{
- case Accessibility_Collection_MATCH_ALL:
+ case ATSPI_Collection_MATCH_ALL:
if (match_attributes_all_p (child, mrp->attributes))
return TRUE;
break;
- case Accessibility_Collection_MATCH_ANY:
+ case ATSPI_Collection_MATCH_ANY:
if (match_attributes_any_p (child, mrp->attributes))
return TRUE;
break;
- case Accessibility_Collection_MATCH_NONE:
+ case ATSPI_Collection_MATCH_NONE:
if (match_attributes_none_p (child, mrp->attributes))
return TRUE;
break;
/* 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++;
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.
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,
}
static int
-query_exec (MatchRulePrivate * mrp, Accessibility_Collection_SortOrder sortby,
+query_exec (MatchRulePrivate * mrp, AtspiCollectionSortOrder sortby,
GList * ls, gint kount, gint max,
AtkObject * obj, glong index,
gboolean flag,
{
switch (sortby)
{
- case Accessibility_Collection_SORT_ORDER_CANONICAL:
+ case ATSPI_Collection_SORT_ORDER_CANONICAL:
kount = sort_order_canonical (mrp, ls, 0, max, obj, index, flag,
pobj, recurse, traverse);
break;
- case Accessibility_Collection_SORT_ORDER_REVERSE_CANONICAL:
+ case ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL:
kount = sort_order_canonical (mrp, ls, 0, max, obj, index, flag,
pobj, recurse, traverse);
break;
}
static gboolean
-bitarray_to_seq (int *array, int array_count, int **ret)
+bitarray_to_seq (dbus_uint32_t *array, int array_count, int **ret)
{
int out_size = 4;
int out_count = 0;
static dbus_bool_t
read_mr (DBusMessageIter * iter, MatchRulePrivate * mrp)
{
- DBusMessageIter mrc, arrayc;
+ DBusMessageIter iter_struct, iter_array, iter_dict, iter_dict_entry;
dbus_uint32_t *array;
dbus_int32_t matchType;
int array_count;
AtkAttribute *attr;
int i;
- const char *str;
- char *interfaces = NULL;
- dbus_message_iter_recurse (iter, &mrc);
- dbus_message_iter_recurse (&mrc, &arrayc);
- dbus_message_iter_get_fixed_array (&arrayc, &array, &array_count);
+ dbus_message_iter_recurse (iter, &iter_struct);
+
+ /* states */
+ dbus_message_iter_recurse (&iter_struct, &iter_array);
+ dbus_message_iter_get_fixed_array (&iter_array, &array, &array_count);
bitarray_to_seq (array, array_count, &mrp->states);
for (i = 0; mrp->states[i] != BITARRAY_SEQ_TERM; i++)
{
mrp->states[i] = spi_atk_state_from_spi_state (mrp->states[i]);
}
- dbus_message_iter_next (&mrc);
- dbus_message_iter_get_basic (&mrc, &matchType);
- dbus_message_iter_next (&mrc);
+ dbus_message_iter_next (&iter_struct);
+ dbus_message_iter_get_basic (&iter_struct, &matchType);
+ dbus_message_iter_next (&iter_struct);
mrp->statematchtype = matchType;;
+
/* attributes */
mrp->attributes = NULL;
- if (dbus_message_iter_get_arg_type (&mrc) == DBUS_TYPE_STRING)
+ dbus_message_iter_recurse (&iter_struct, &iter_dict);
+ while (dbus_message_iter_get_arg_type (&iter_dict) != DBUS_TYPE_INVALID)
{
- char *str;
- gchar **attributes;
- gchar **pp;
- dbus_message_iter_get_basic (&mrc, &str);
- attributes = g_strsplit (str, "\n", -1);
- for (pp = attributes; *pp; pp++)
- {
- str = *pp;
- 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);
- }
- }
- g_strfreev (attributes);
- }
- else
- {
- dbus_message_iter_recurse (&mrc, &arrayc);
- while (dbus_message_iter_get_arg_type (&arrayc) != DBUS_TYPE_INVALID)
+ const char *key, *val;
+ const char *p, *q;
+ dbus_message_iter_recurse (&iter_dict, &iter_dict_entry);
+ dbus_message_iter_get_basic (&iter_dict_entry, &key);
+ dbus_message_iter_next (&iter_dict_entry);
+ dbus_message_iter_get_basic (&iter_dict_entry, &val);
+ p = q = val;
+ for (;;)
+ {
+ if (*q == '\0' || (*q == ':' && (q == val || q[-1] != '\\')))
{
- dbus_message_iter_get_basic (&arrayc, &str);
- // TODO: remove this print
- g_print ("Got attribute: %s\n", str);
+ char *tmp;
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);
+ attr->name = g_strdup (key);
+ attr->value = g_strdup (p);
+ attr->value[q - p] = '\0';
+ tmp = attr->value;
+ while (*tmp != '\0')
+ {
+ if (*tmp == '\\')
+ memmove (tmp, tmp + 1, strlen (tmp));
+ else
+ tmp++;
+ }
+ mrp->attributes = g_slist_prepend (mrp->attributes, attr);
+ if (*q == '\0')
+ break;
+ else
+ p = ++q;
}
+ else
+ q++;
+ }
+ dbus_message_iter_next (&iter_dict);
}
- dbus_message_iter_next (&mrc);
- dbus_message_iter_get_basic (&mrc, &matchType);
+ dbus_message_iter_next (&iter_struct);
+ dbus_message_iter_get_basic (&iter_struct, &matchType);
mrp->attributematchtype = matchType;;
- dbus_message_iter_next (&mrc);
+ dbus_message_iter_next (&iter_struct);
+
/* Get roles and role match */
- dbus_message_iter_recurse (&mrc, &arrayc);
- dbus_message_iter_get_fixed_array (&arrayc, &array, &array_count);
+ dbus_message_iter_recurse (&iter_struct, &iter_array);
+ dbus_message_iter_get_fixed_array (&iter_array, &array, &array_count);
bitarray_to_seq (array, array_count, &mrp->roles);
- dbus_message_iter_next (&mrc);
- dbus_message_iter_get_basic (&mrc, &matchType);
+ dbus_message_iter_next (&iter_struct);
+ dbus_message_iter_get_basic (&iter_struct, &matchType);
mrp->rolematchtype = matchType;;
- dbus_message_iter_next (&mrc);
+ dbus_message_iter_next (&iter_struct);
+
/* Get interfaces and interface match */
- dbus_message_iter_get_basic (&mrc, &interfaces);
- dbus_message_iter_next (&mrc);
- mrp->ifaces = g_strsplit (interfaces, ";", 0);
- dbus_message_iter_get_basic (&mrc, &matchType);
+ dbus_message_iter_recurse (&iter_struct, &iter_array);
+ mrp->ifaces = g_new0 (gchar *, 16);
+ i = 0;
+ while (i < 15 && dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+ {
+ char *iface;
+ dbus_message_iter_get_basic (&iter_array, &iface);
+ mrp->ifaces [i] = g_strdup (iface);
+ i++;
+ dbus_message_iter_next (&iter_array);
+ }
+ dbus_message_iter_next (&iter_struct);
+ dbus_message_iter_get_basic (&iter_struct, &matchType);
mrp->interfacematchtype = matchType;;
- dbus_message_iter_next (&mrc);
+ dbus_message_iter_next (&iter_struct);
/* get invert */
- dbus_message_iter_get_basic (&mrc, &mrp->invert);
+ dbus_message_iter_get_basic (&iter_struct, &mrp->invert);
dbus_message_iter_next (iter);
return TRUE;
}
GetMatchesFrom (DBusMessage * message,
AtkObject * current_object,
MatchRulePrivate * mrp,
- const Accessibility_Collection_SortOrder sortby,
+ const AtspiCollectionSortOrder sortby,
const dbus_bool_t isrestrict,
dbus_int32_t count, const dbus_bool_t traverse)
{
GList *ls = NULL;
AtkObject *parent;
glong index = atk_object_get_index_in_parent (current_object);
- gint kount = 0;
ls = g_list_append (ls, current_object);
if (!isrestrict)
{
parent = atk_object_get_parent (current_object);
- kount = query_exec (mrp, sortby, ls, 0, count, parent, index,
- FALSE, NULL, TRUE, traverse);
+ query_exec (mrp, sortby, ls, 0, count, parent, index,
+ FALSE, NULL, TRUE, traverse);
}
else
- kount = query_exec (mrp, sortby, ls, 0, count,
- current_object, 0, FALSE, NULL, TRUE, traverse);
+ query_exec (mrp, sortby, ls, 0, count,
+ current_object, 0, FALSE, NULL, TRUE, traverse);
ls = g_list_remove (ls, ls->data);
- if (sortby == Accessibility_Collection_SORT_ORDER_REVERSE_CANONICAL)
+ if (sortby == ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL)
ls = g_list_reverse (ls);
free_mrp_data (mrp);
NULL, TRUE, TRUE);
/* Next, we look through the right subtree */
- while ((max == 0 || kount < max) && obj != collection)
+ while ((max == 0 || kount < max) && obj && obj != collection)
{
AtkObject *parent = atk_object_get_parent (obj);
i = atk_object_get_index_in_parent (obj);
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);
GetMatchesInOrder (DBusMessage * message,
AtkObject * current_object,
MatchRulePrivate * mrp,
- const Accessibility_Collection_SortOrder sortby,
+ const AtspiCollectionSortOrder sortby,
const dbus_bool_t recurse,
dbus_int32_t count, const dbus_bool_t traverse)
{
GList *ls = NULL;
AtkObject *obj;
- gint kount = 0;
ls = g_list_append (ls, current_object);
obj = ATK_OBJECT(spi_register_path_to_object (spi_global_register, dbus_message_get_path (message)));
- kount = inorder (obj, mrp, ls, 0, count,
- current_object, TRUE, NULL, traverse);
+ inorder (obj, mrp, ls, 0, count,
+ current_object, TRUE, NULL, traverse);
ls = g_list_remove (ls, ls->data);
- if (sortby == Accessibility_Collection_SORT_ORDER_REVERSE_CANONICAL)
+ if (sortby == ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL)
ls = g_list_reverse (ls);
free_mrp_data (mrp);
GetMatchesInBackOrder (DBusMessage * message,
AtkObject * current_object,
MatchRulePrivate * mrp,
- const Accessibility_Collection_SortOrder sortby,
+ const AtspiCollectionSortOrder sortby,
dbus_int32_t count)
{
GList *ls = NULL;
AtkObject *collection;
- gint kount = 0;
ls = g_list_append (ls, current_object);
collection = ATK_OBJECT(spi_register_path_to_object (spi_global_register, dbus_message_get_path (message)));
- kount = sort_order_rev_canonical (mrp, ls, 0, count, current_object,
- FALSE, collection);
+ sort_order_rev_canonical (mrp, ls, 0, count, current_object,
+ FALSE, collection);
ls = g_list_remove (ls, ls->data);
- if (sortby == Accessibility_Collection_SORT_ORDER_REVERSE_CANONICAL)
+ if (sortby == ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL)
ls = g_list_reverse (ls);
free_mrp_data (mrp);
GetMatchesTo (DBusMessage * message,
AtkObject * current_object,
MatchRulePrivate * mrp,
- const Accessibility_Collection_SortOrder sortby,
+ const AtspiCollectionSortOrder sortby,
const dbus_bool_t recurse,
const dbus_bool_t isrestrict,
dbus_int32_t count, const dbus_bool_t traverse)
{
GList *ls = NULL;
AtkObject *obj;
- gint kount = 0;
ls = g_list_append (ls, current_object);
if (recurse)
{
obj = ATK_OBJECT (atk_object_get_parent (current_object));
- kount = query_exec (mrp, sortby, ls, 0, count,
- obj, 0, TRUE, current_object, TRUE, traverse);
+ query_exec (mrp, sortby, ls, 0, count,
+ obj, 0, TRUE, current_object, TRUE, traverse);
}
else
{
obj = ATK_OBJECT (spi_register_path_to_object (spi_global_register, dbus_message_get_path (message)));
- kount = query_exec (mrp, sortby, ls, 0, count,
- obj, 0, TRUE, current_object, TRUE, traverse);
+ query_exec (mrp, sortby, ls, 0, count,
+ obj, 0, TRUE, current_object, TRUE, traverse);
}
ls = g_list_remove (ls, ls->data);
- if (sortby != Accessibility_Collection_SORT_ORDER_REVERSE_CANONICAL)
+ if (sortby != ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL)
ls = g_list_reverse (ls);
free_mrp_data (mrp);
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)
+ if (strcmp (signature, "o(aiia{ss}iaiiasib)uuib") != 0)
{
return droute_invalid_arguments_error (message);
}
switch (tree)
{
- case Accessibility_Collection_TREE_RESTRICT_CHILDREN:
+ case ATSPI_Collection_TREE_RESTRICT_CHILDREN:
return GetMatchesFrom (message, current_object,
&rule, sortby, TRUE, count, traverse);
break;
- case Accessibility_Collection_TREE_RESTRICT_SIBLING:
+ case ATSPI_Collection_TREE_RESTRICT_SIBLING:
return GetMatchesFrom (message, current_object,
&rule, sortby, FALSE, count, traverse);
break;
- case Accessibility_Collection_TREE_INORDER:
+ case ATSPI_Collection_TREE_INORDER:
return GetMatchesInOrder (message, current_object,
&rule, sortby, TRUE, count, traverse);
break;
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)
+ if (strcmp (signature, "o(aiia{ss}iaiiasib)uubib") != 0)
{
return droute_invalid_arguments_error (message);
}
switch (tree)
{
- case Accessibility_Collection_TREE_RESTRICT_CHILDREN:
+ case ATSPI_Collection_TREE_RESTRICT_CHILDREN:
return GetMatchesTo (message, current_object,
&rule, sortby, recurse, TRUE, count, traverse);
break;
- case Accessibility_Collection_TREE_RESTRICT_SIBLING:
+ case ATSPI_Collection_TREE_RESTRICT_SIBLING:
return GetMatchesTo (message, current_object,
&rule, sortby, recurse, FALSE, count, traverse);
break;
- case Accessibility_Collection_TREE_INORDER:
+ case ATSPI_Collection_TREE_INORDER:
return GetMatchesInBackOrder (message, current_object,
&rule, sortby, count);
break;
}
}
+static void
+append_accessible_properties (DBusMessageIter *iter, AtkObject *obj,
+ GArray *properties)
+{
+ DBusMessageIter iter_struct, iter_dict, iter_dict_entry;
+ AtkStateSet *set;
+ gint i;
+ gint count;
+
+ dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL, &iter_struct);
+ spi_object_append_reference (&iter_struct, obj);
+ dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "{sv}", &iter_dict);
+ if (properties && properties->len)
+ {
+ gint i;
+ for (i = 0; i < properties->len; i++)
+ {
+ gchar *prop = g_array_index (properties, char *, i);
+ DRoutePropertyFunction func;
+ GType type;
+ func = _atk_bridge_find_property_func (prop, &type);
+ if (func && G_TYPE_CHECK_INSTANCE_TYPE (obj, type))
+ {
+ dbus_message_iter_open_container (&iter_dict, DBUS_TYPE_DICT_ENTRY,
+ NULL, &iter_dict_entry);
+ dbus_message_iter_append_basic (&iter_dict_entry, DBUS_TYPE_STRING, &prop);
+ func (&iter_dict_entry, obj);
+ dbus_message_iter_close_container (&iter_dict, &iter_dict_entry);
+ }
+ }
+ }
+ else
+ {
+ GHashTableIter hi;
+ gpointer key, value;
+ g_hash_table_iter_init (&hi, spi_global_app_data->property_hash);
+ while (g_hash_table_iter_next (&hi, &key, &value))
+ {
+ const DRouteProperty *prop = value;
+ GType type = _atk_bridge_type_from_iface (key);
+ if (!G_TYPE_CHECK_INSTANCE_TYPE (obj, type))
+ continue;
+ for (;prop->name; prop++)
+ {
+ const char *p = key + strlen (key);
+ gchar *property_name;
+ while (p[-1] != '.')
+ p--;
+ if (!strcmp (p, "Accessible"))
+ property_name = g_strdup (prop->name);
+ else
+ property_name = g_strconcat (p, ".", prop->name, NULL);
+ dbus_message_iter_open_container (&iter_dict, DBUS_TYPE_DICT_ENTRY,
+ NULL, &iter_dict_entry);
+ dbus_message_iter_append_basic (&iter_dict_entry, DBUS_TYPE_STRING, &property_name);
+ g_free (property_name);
+ prop->get (&iter_dict_entry, obj);
+ dbus_message_iter_close_container (&iter_dict, &iter_dict_entry);
+ }
+ }
+ }
+ dbus_message_iter_close_container (&iter_struct, &iter_dict);
+ dbus_message_iter_close_container (iter, &iter_struct);
+
+ set = atk_object_ref_state_set (obj);
+ if (set)
+ {
+ gboolean md = atk_state_set_contains_state (set, ATK_STATE_MANAGES_DESCENDANTS);
+ g_object_unref (set);
+ if (md)
+ return;
+ }
+ count = atk_object_get_n_accessible_children (obj);
+ for (i = 0; i < count; i++)
+ {
+ AtkObject *child = atk_object_ref_accessible_child (obj, i);
+ if (child)
+ {
+ append_accessible_properties (iter, child, properties);
+ g_object_unref (child);
+ }
+ }
+}
+
+static void
+skip (const char **p)
+{
+ const char *sig = *p;
+ gint nest = (*sig != 'a');
+
+ sig++;
+ while (*sig)
+ {
+ if (*sig == '(' || *sig == '{')
+ nest++;
+ else if (*sig == ')' || *sig == '}')
+ nest--;
+ sig++;
+ }
+ *p = sig;
+}
+
+static gboolean
+types_match (DBusMessageIter *iter, char c)
+{
+ char t = dbus_message_iter_get_arg_type (iter);
+
+ if (t == 'r' && c == '(')
+ return TRUE;
+ else if (t != c)
+ return FALSE;
+}
+
+static void
+walk (DBusMessageIter *iter, const char *sig, gboolean array)
+{
+ while (*sig && *sig != ')' && *sig != '}')
+ {
+ if (array && dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_INVALID)
+ break;
+ if (!types_match (iter, *sig))
+ {
+ g_error ("Expected %s, got %c", sig, dbus_message_iter_get_arg_type (iter));
+ }
+ switch (*sig)
+ {
+ case 's':
+ {
+ const char *str;
+ DBusError error;
+ dbus_error_init (&error);
+ dbus_message_iter_get_basic (iter, &str);
+ g_print ("%s\n", str);
+ if (!dbus_validate_utf8 (str, &error))
+ g_error ("Bad UTF-8 string");
+ }
+ break;
+ case 'a':
+ {
+ DBusMessageIter iter_array;
+ dbus_message_iter_recurse (iter, &iter_array);
+ walk (&iter_array, sig + 1, TRUE);
+ skip (&sig);
+ }
+ break;
+ case DBUS_TYPE_STRUCT:
+ case DBUS_TYPE_DICT_ENTRY:
+ {
+ DBusMessageIter iter_struct;
+ dbus_message_iter_recurse (iter, &iter_struct);
+ walk (&iter_struct, sig + 1, FALSE);
+ skip (&sig);
+ }
+ }
+ dbus_message_iter_next (iter);
+ if (!array)
+ sig++;
+ }
+ if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_INVALID)
+ g_error ("Unexpected data '%c'", dbus_message_iter_get_arg_type (iter));
+}
+
+static void
+walkm (DBusMessage *message)
+{
+ DBusMessageIter iter;
+ const char *sig = dbus_message_get_signature (message);
+
+ g_print ("sig: %s\n", sig);
+ dbus_message_iter_init (message, &iter);
+ walk (&iter, sig, FALSE);
+}
+
+static DBusMessage *
+impl_GetTree (DBusConnection * bus,
+ DBusMessage * message, void *user_data)
+{
+ AtkObject *object = (AtkObject *) user_data;
+ DBusMessage *reply;
+ DBusMessageIter iter, iter_array;
+ MatchRulePrivate rule;
+ GArray *properties;
+
+ g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+ droute_not_yet_handled_error (message));
+
+ if (strcmp (dbus_message_get_signature (message), "(aiia{ss}iaiiasib)as") != 0)
+ return droute_invalid_arguments_error (message);
+
+ properties = g_array_new (TRUE, TRUE, sizeof (char *));
+ dbus_message_iter_init (message, &iter);
+ if (!read_mr (&iter, &rule))
+ {
+ return spi_dbus_general_error (message);
+ }
+
+ dbus_message_iter_recurse (&iter, &iter_array);
+ while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+ {
+ const char *prop;
+ dbus_message_iter_get_basic (&iter_array, &prop);
+ g_array_append_val (properties, prop);
+ dbus_message_iter_next (&iter_array);
+ }
+
+ reply = dbus_message_new_method_return (message);
+ if (reply)
+ {
+ dbus_message_iter_init_append (reply, &iter);
+ dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "((so)a{sv})",
+ &iter_array);
+ append_accessible_properties (&iter_array, object, properties);
+ dbus_message_iter_close_container (&iter, &iter_array);
+ }
+//walkm (reply);
+ return reply;
+}
+
static DBusMessage *
impl_GetMatches (DBusConnection * bus, DBusMessage * message, void *user_data)
{
const char *signature;
signature = dbus_message_get_signature (message);
- if (strcmp (signature, "(aiisiaiisib)uib") != 0 &&
- strcmp (signature, "(aii(as)iaiisib)uib") != 0)
+ if (strcmp (signature, "(aiia{ss}iaiiasib)uib") != 0)
{
return droute_invalid_arguments_error (message);
}
obj, 0, TRUE, NULL, TRUE, traverse);
ls = g_list_remove (ls, ls->data);
- if (sortby == Accessibility_Collection_SORT_ORDER_REVERSE_CANONICAL)
+ if (sortby == ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL)
ls = g_list_reverse (ls);
free_mrp_data (&rule);
return return_and_free_list (message, ls);
static DRouteMethod methods[] = {
{impl_GetMatchesFrom, "GetMatchesFrom"},
{impl_GetMatchesTo, "GetMatchesTo"},
+ {impl_GetTree, "GetTree"},
{impl_GetMatches, "GetMatches"},
{NULL, NULL}
};
void
spi_initialize_collection (DRoutePath * path)
{
- droute_path_add_interface (path,
- SPI_DBUS_INTERFACE_COLLECTION, methods, NULL);
+ spi_atk_add_interface (path,
+ ATSPI_DBUS_INTERFACE_COLLECTION, spi_org_a11y_atspi_Collection, methods, NULL);
};