2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2007 IBM Corp.
6 * Copyright 2010, 2011 Novell, Inc.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
24 #include "atspi-private.h"
26 /* TODO: Improve documentation and implement some missing functions */
29 * atspi_collection_is_ancestor_of:
31 * Not yet implemented.
35 atspi_collection_is_ancestor_of (AtspiCollection *collection,
36 AtspiAccessible *test,
39 g_warning ("Atspi: TODO: Implement is_ancestor_of");
44 new_message (AtspiCollection *collection, char *method)
46 AtspiAccessible *accessible;
51 accessible = ATSPI_ACCESSIBLE (collection);
52 if (!accessible->parent.app)
54 return dbus_message_new_method_call (accessible->parent.app->bus_name,
55 accessible->parent.path,
56 atspi_interface_collection,
61 append_match_rule (DBusMessage *message, AtspiMatchRule *rule)
65 dbus_message_iter_init_append (message, &iter);
66 return _atspi_match_rule_marshal (rule, &iter);
70 append_accessible (DBusMessage *message, AtspiAccessible *accessible)
74 dbus_message_iter_init_append (message, &iter);
75 dbus_message_iter_append_basic (&iter, DBUS_TYPE_OBJECT_PATH,
76 &accessible->parent.path);
77 return TRUE; /* TODO: Check for out-of-memory */
81 return_accessibles (DBusMessage *message)
83 DBusMessageIter iter, iter_array;
84 GArray *ret = g_array_new (TRUE, TRUE, sizeof (AtspiAccessible *));
86 _ATSPI_DBUS_CHECK_SIG (message, "a(so)", NULL, NULL);
88 dbus_message_iter_init (message, &iter);
89 dbus_message_iter_recurse (&iter, &iter_array);
91 while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
93 AtspiAccessible *accessible;
94 accessible = _atspi_dbus_return_accessible_from_iter (&iter_array);
95 ret = g_array_append_val (ret, accessible);
96 /* Iter was moved already, so no need to call dbus_message_iter_next */
98 dbus_message_unref (message);
103 * atspi_collection_get_matches:
105 * @collection: A pointer to the #AtspiCollection to query.
107 * @rule: An #AtspiMatchRule describing the match criteria.
109 * @sortby: An #AtspiCollectionSortOrder specifying the way the results are to
112 * @count: The maximum number of results to return, or 0 for no limit.
114 * @traverse: Not supported.
116 * Gets all #AtspiAccessible objects from the @collection matching a given
119 * Returns: (element-type AtspiAccessible*) (transfer full): All
120 * #AtspiAccessible objects matching the given match rule.
123 atspi_collection_get_matches (AtspiCollection *collection,
124 AtspiMatchRule *rule,
125 AtspiCollectionSortOrder sortby,
130 DBusMessage *message = new_message (collection, "GetMatches");
132 dbus_int32_t d_sortby = sortby;
133 dbus_int32_t d_count = count;
134 dbus_bool_t d_traverse = traverse;
139 if (!append_match_rule (message, rule))
141 dbus_message_append_args (message, DBUS_TYPE_UINT32, &d_sortby,
142 DBUS_TYPE_INT32, &d_count,
143 DBUS_TYPE_BOOLEAN, &d_traverse,
145 reply = _atspi_dbus_send_with_reply_and_block (message, error);
148 return return_accessibles (reply);
152 * atspi_collection_get_matches_to:
154 * @collection: A pointer to the #AtspiCollection to query.
156 * @current_object: The object at which to start searching.
158 * @rule: An #AtspiMatchRule describing the match criteria.
160 * @sortby: An #AtspiCollectionSortOrder specifying the way the results are to
163 * @tree: An #AtspiCollectionTreeTraversalType specifying restrictions on
164 * the objects to be traversed.
166 * @limit_scope: If #TRUE, only descendants of @current_object's parent
167 * will be returned. Otherwise (if #FALSE), any accessible may be returned
168 * if it would preceed @current_object in a flattened hierarchy.
170 * @count: The maximum number of results to return, or 0 for no limit.
172 * @traverse: Not supported.
174 * Gets all #AtspiAccessible objects from the @collection, after
175 * @current_object, matching a given @rule.
177 * Returns: (element-type AtspiAccessible*) (transfer full): All
178 * #AtspiAccessible objects matching the given match rule after
182 atspi_collection_get_matches_to (AtspiCollection *collection,
183 AtspiAccessible *current_object,
184 AtspiMatchRule *rule,
185 AtspiCollectionSortOrder sortby,
186 AtspiCollectionTreeTraversalType tree,
187 gboolean limit_scope,
192 DBusMessage *message = new_message (collection, "GetMatchesTo");
194 dbus_int32_t d_sortby = sortby;
195 dbus_int32_t d_tree = tree;
196 dbus_bool_t d_limit_scope = limit_scope;
197 dbus_int32_t d_count = count;
198 dbus_bool_t d_traverse = traverse;
203 if (!append_accessible (message, current_object))
205 if (!append_match_rule (message, rule))
207 dbus_message_append_args (message, DBUS_TYPE_UINT32, &d_sortby,
208 DBUS_TYPE_UINT32, &d_tree,
209 DBUS_TYPE_BOOLEAN, &d_limit_scope,
210 DBUS_TYPE_INT32, &d_count,
211 DBUS_TYPE_BOOLEAN, &d_traverse,
213 reply = _atspi_dbus_send_with_reply_and_block (message, error);
216 return return_accessibles (reply);
220 * atspi_collection_get_matches_from:
222 * @collection: A pointer to the #AtspiCollection to query.
224 * @current_object: Upon reaching this object, searching should stop.
226 * @rule: An #AtspiMatchRule describing the match criteria.
228 * @sortby: An #AtspiCollectionSortOrder specifying the way the results are to
231 * @tree: An #AtspiCollectionTreeTraversalType specifying restrictions on
232 * the objects to be traversed.
234 * @count: The maximum number of results to return, or 0 for no limit.
236 * @traverse: Not supported.
238 * Gets all #AtspiAccessible objects from the @collection, before
239 * @current_object, matching a given @rule.
241 * Returns: (element-type AtspiAccessible*) (transfer full): All
242 * #AtspiAccessible objects matching the given match rule that preceed
246 atspi_collection_get_matches_from (AtspiCollection *collection,
247 AtspiAccessible *current_object,
248 AtspiMatchRule *rule,
249 AtspiCollectionSortOrder sortby,
250 AtspiCollectionTreeTraversalType tree,
255 DBusMessage *message = new_message (collection, "GetMatchesFrom");
257 dbus_int32_t d_sortby = sortby;
258 dbus_int32_t d_tree = tree;
259 dbus_int32_t d_count = count;
260 dbus_bool_t d_traverse = traverse;
265 if (!append_accessible (message, current_object))
267 if (!append_match_rule (message, rule))
269 dbus_message_append_args (message, DBUS_TYPE_UINT32, &d_sortby,
270 DBUS_TYPE_UINT32, &d_tree,
271 DBUS_TYPE_INT32, &d_count,
272 DBUS_TYPE_BOOLEAN, &d_traverse,
274 reply = _atspi_dbus_send_with_reply_and_block (message, error);
277 return return_accessibles (reply);
281 * atspi_collection_get_active_descendant:
283 * Not yet implemented.
286 atspi_collection_get_active_descendant (AtspiCollection *collection, GError **error)
288 g_warning ("atspi: TODO: Implement get_active_descendants");
293 atspi_collection_base_init (AtspiCollection *klass)
298 atspi_collection_get_type (void)
300 static GType type = 0;
303 static const GTypeInfo tinfo =
305 sizeof (AtspiCollection),
306 (GBaseInitFunc) atspi_collection_base_init,
307 (GBaseFinalizeFunc) NULL,
310 type = g_type_register_static (G_TYPE_INTERFACE, "AtspiCollection", &tinfo, 0);