summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Gorse <mgorse@suse.com>2013-09-15 11:59:03 -0500
committerMike Gorse <mgorse@suse.com>2013-09-15 11:59:03 -0500
commit9d1040af666ce64f86002d558e8dbdb9eae50e59 (patch)
treebfbe1ed569c762553f729de42749702d3c818731
parent548478747b2493842b736b4a1e2bc6bb3015f790 (diff)
downloadat-spi2-atk-9d1040af666ce64f86002d558e8dbdb9eae50e59.tar.gz
Allow a :-separated list of attribute values when reading match rules
https://bugzilla.gnome.org/show_bug.cgi?id=700865
-rw-r--r--atk-adaptor/adaptors/collection-adaptor.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/atk-adaptor/adaptors/collection-adaptor.c b/atk-adaptor/adaptors/collection-adaptor.c
index 918addf..c49b502 100644
--- a/atk-adaptor/adaptors/collection-adaptor.c
+++ b/atk-adaptor/adaptors/collection-adaptor.c
@@ -672,14 +672,38 @@ read_mr (DBusMessageIter * iter, MatchRulePrivate * mrp)
while (dbus_message_iter_get_arg_type (&iter_dict) != 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);
- attr = g_new (AtkAttribute, 1);
- attr->name = g_strdup (key);
- attr->value = g_strdup (val);
- mrp->attributes = g_slist_prepend (mrp->attributes, attr);
+ p = q = val;
+ for (;;)
+ {
+ if (*q == '\0' || (*q == ':' && (q == val || q[-1] != '\\')))
+ {
+ char *tmp;
+ attr = g_new (AtkAttribute, 1);
+ 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 (&iter_struct);