2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2008 Novell, Inc.
6 * Copyright 2001, 2002 Sun Microsystems Inc.,
7 * Copyright 2001, 2002 Ximian, Inc.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
19 * You should have received a copy of the GNU Library General Public
20 * License along with this library; if not, write to the
21 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 * Boston, MA 02111-1307, USA.
25 #include "accessible.h"
27 #define get_object(message) spi_dbus_get_object(dbus_message_get_path(message))
30 spi_dbus_append_tree_helper (DBusMessageIter * iter_array, AtkObject * obj,
33 DBusMessageIter iter_struct, iter_sub_array;
36 const char *name, *desc;
37 dbus_uint16_t updating = 1;
44 dbus_message_iter_open_container (iter_array, DBUS_TYPE_STRUCT, NULL,
46 dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT16, &updating);
47 path = spi_dbus_get_path (obj);
48 dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path);
49 path_parent = spi_dbus_get_path (atk_object_get_parent(obj));
50 if (!path_parent) path_parent = g_strdup("/");
51 dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path_parent);
53 dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "o",
55 childcount = atk_object_get_n_accessible_children (obj);
56 for (i = 0; i < childcount; i++)
58 AtkObject *child = atk_object_ref_accessible_child (obj, i);
59 char *child_path = spi_dbus_get_path (child);
62 dbus_message_iter_append_basic (&iter_sub_array,
63 DBUS_TYPE_OBJECT_PATH, &child_path);
67 g_object_unref (child);
69 if (!dbus_message_iter_close_container (&iter_struct, &iter_sub_array))
71 dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "s",
73 for (l = data->interfaces; l; l = g_slist_next (l))
75 DRouteInterface *iface_def = (DRouteInterface *) l->data;
77 if (iface_def->get_datum)
79 datum = (*iface_def->get_datum) (path, data->user_data);
83 dbus_message_iter_append_basic (&iter_sub_array, DBUS_TYPE_STRING,
85 if (iface_def->free_datum)
86 (*iface_def->free_datum) (datum);
88 if (!dbus_message_iter_close_container (&iter_struct, &iter_sub_array))
90 name = atk_object_get_name (obj);
93 dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
94 role = spi_accessible_role_from_atk_role (atk_object_get_role (obj));
95 dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &role);
96 desc = atk_object_get_description (obj);
99 dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &desc);
100 if (!dbus_message_iter_close_container (iter_array, &iter_struct))
102 for (i = 0; i < childcount; i++)
104 AtkObject *child = atk_object_ref_accessible_child (obj, i);
108 result = spi_dbus_append_tree_helper (iter_array, child, data);
109 g_object_unref (child);
116 if (path) g_free(path);
121 spi_dbus_append_tree (DBusMessage * message, AtkObject * obj,
124 DBusMessageIter iter, iter_array;
127 dbus_message_iter_init_append (message, &iter);
128 dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(qooaoassus)",
130 result = spi_dbus_append_tree_helper (&iter_array, obj, data);
132 result = dbus_message_iter_close_container (&iter, &iter_array);
137 impl_getTree (DBusConnection * bus, DBusMessage * message, void *user_data)
143 root = atk_get_root ();
145 path = spi_dbus_get_path (root);
147 return spi_dbus_general_error (message);
148 reply = dbus_message_new_method_return (message);
149 dbus_message_append_args (reply, DBUS_TYPE_OBJECT_PATH, &path,
152 spi_dbus_append_tree (reply, root, (DRouteData *) user_data);
156 static DRouteMethod methods[] = {
157 {DROUTE_METHOD, impl_getTree, "getTree", "o,root,o:a(qooaoassus),tree,o",
159 {0, NULL, NULL, NULL}
163 spi_initialize_tree (DRouteData * data)
165 droute_add_interface (data, "org.freedesktop.atspi.AccessibleTree",
166 methods, NULL, NULL, NULL);