- AtkObject *obj = target->pdata[j];
- char *path;
- if (!obj) continue;
- path = atk_dbus_object_to_path (obj, FALSE);
- if (!path)
- {
- g_warning ("Unknown object in relation type %d\n", type);
- continue;
- }
- spi_dbus_append_name_and_path_inner (&iter_targets, NULL, path);
+ AtkRelation *r = atk_relation_set_get_relation (set, i);
+ AtkRelationType rt;
+ GPtrArray *target;
+ dbus_uint32_t type;
+ if (!r)
+ continue;
+ rt = atk_relation_get_relation_type (r);
+ type = spi_relation_type_from_atk_relation_type (rt);
+ target = atk_relation_get_target (r);
+ if (!dbus_message_iter_open_container
+ (&iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct))
+ {
+ goto oom;
+ }
+ dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &type);
+ if (!dbus_message_iter_open_container
+ (&iter_struct, DBUS_TYPE_ARRAY, "(so)", &iter_targets))
+ {
+ goto oom;
+ }
+ for (j = 0; j < target->len; j++)
+ {
+ AtkObject *obj = target->pdata[j];
+ char *path;
+ if (!obj)
+ continue;
+ path = atk_dbus_object_to_path (obj, FALSE);
+ if (!path)
+ {
+ g_warning ("Unknown object in relation type %d\n", type);
+ continue;
+ }
+ spi_dbus_append_name_and_path_inner (&iter_targets, NULL, path);
+ }
+ dbus_message_iter_close_container (&iter_struct, &iter_targets);
+ dbus_message_iter_close_container (&iter_array, &iter_struct);