Allow a :-separated list of attribute values when reading match rules
authorMike Gorse <mgorse@suse.com>
Sun, 15 Sep 2013 16:59:03 +0000 (11:59 -0500)
committerMike Gorse <mgorse@suse.com>
Sun, 15 Sep 2013 16:59:03 +0000 (11:59 -0500)
https://bugzilla.gnome.org/show_bug.cgi?id=700865

atk-adaptor/adaptors/collection-adaptor.c

index 918addf..c49b502 100644 (file)
@@ -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);