summaryrefslogtreecommitdiff
path: root/atspi/atspi-collection.c
diff options
context:
space:
mode:
Diffstat (limited to 'atspi/atspi-collection.c')
-rw-r--r--atspi/atspi-collection.c296
1 files changed, 296 insertions, 0 deletions
diff --git a/atspi/atspi-collection.c b/atspi/atspi-collection.c
new file mode 100644
index 0000000..f4e33ef
--- /dev/null
+++ b/atspi/atspi-collection.c
@@ -0,0 +1,296 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2007 IBM Corp.
+ * Copyright 2010, 2011 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "atspi-private.h"
+
+/* TODO: Improve documentation and implement some missing functions */
+
+/**
+ * atspi_collection_is_ancestor_of:
+ *
+ * Not yet implemented.
+ *
+ **/
+gboolean
+atspi_collection_is_ancestor_of (AtspiCollection *collection,
+ AtspiAccessible *test,
+ GError **error)
+{
+ g_warning ("Atspi: TODO: Implement is_ancestor_of");
+ return FALSE;
+}
+
+static DBusMessage *
+new_message (AtspiCollection *collection, char *method)
+{
+ AtspiAccessible *accessible;
+
+ if (!collection)
+ return NULL;
+
+ accessible = ATSPI_ACCESSIBLE (collection);
+ if (!accessible->parent.app)
+ return NULL;
+ return dbus_message_new_method_call (accessible->parent.app->bus_name,
+ accessible->parent.path,
+ atspi_interface_collection,
+ method);
+}
+
+static gboolean
+append_match_rule (DBusMessage *message, AtspiMatchRule *rule)
+{
+ DBusMessageIter iter;
+
+ dbus_message_iter_init_append (message, &iter);
+ return _atspi_match_rule_marshal (rule, &iter);
+}
+
+static gboolean
+append_accessible (DBusMessage *message, AtspiAccessible *accessible)
+{
+ DBusMessageIter iter;
+
+ dbus_message_iter_init_append (message, &iter);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_OBJECT_PATH,
+ &accessible->parent.path);
+ return TRUE; /* TODO: Check for out-of-memory */
+}
+
+static GArray *
+return_accessibles (DBusMessage *message)
+{
+ DBusMessageIter iter, iter_array;
+ GArray *ret = g_array_new (TRUE, TRUE, sizeof (AtspiAccessible *));
+
+ _ATSPI_DBUS_CHECK_SIG (message, "a(so)", NULL, NULL);
+
+ dbus_message_iter_init (message, &iter);
+ dbus_message_iter_recurse (&iter, &iter_array);
+
+ while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+ {
+ AtspiAccessible *accessible;
+ accessible = _atspi_dbus_return_accessible_from_iter (&iter_array);
+ ret = g_array_append_val (ret, accessible);
+ /* Iter was moved already, so no need to call dbus_message_iter_next */
+ }
+ dbus_message_unref (message);
+ return ret;
+}
+
+/**
+ * atspi_collection_get_matches:
+ * @collection: A pointer to the #AtspiCollection to query.
+ * @rule: An #AtspiMatchRule describing the match criteria.
+ * @sortby: An #AtspiCollectionSortOrder specifying the way the results are to
+ * be sorted.
+ * @count: The maximum number of results to return, or 0 for no limit.
+ * @traverse: Not supported.
+ *
+ * Gets all #AtspiAccessible objects from the @collection matching a given
+ * @rule.
+ *
+ * Returns: (element-type AtspiAccessible*) (transfer full): All
+ * #AtspiAccessible objects matching the given match rule.
+ **/
+GArray *
+atspi_collection_get_matches (AtspiCollection *collection,
+ AtspiMatchRule *rule,
+ AtspiCollectionSortOrder sortby,
+ gint count,
+ gboolean traverse,
+ GError **error)
+{
+ DBusMessage *message = new_message (collection, "GetMatches");
+ DBusMessage *reply;
+ dbus_int32_t d_sortby = sortby;
+ dbus_int32_t d_count = count;
+ dbus_bool_t d_traverse = traverse;
+
+ if (!message)
+ return NULL;
+
+ if (!append_match_rule (message, rule))
+ return NULL;
+ dbus_message_append_args (message, DBUS_TYPE_UINT32, &d_sortby,
+ DBUS_TYPE_INT32, &d_count,
+ DBUS_TYPE_BOOLEAN, &d_traverse,
+ DBUS_TYPE_INVALID);
+ reply = _atspi_dbus_send_with_reply_and_block (message, error);
+ if (!reply)
+ return NULL;
+ return return_accessibles (reply);
+}
+
+/**
+ * atspi_collection_get_matches_to:
+ * @collection: A pointer to the #AtspiCollection to query.
+ * @current_object: The object at which to start searching.
+ * @rule: An #AtspiMatchRule describing the match criteria.
+ * @sortby: An #AtspiCollectionSortOrder specifying the way the results are to
+ * be sorted.
+ * @tree: An #AtspiCollectionTreeTraversalType specifying restrictions on
+ * the objects to be traversed.
+ * @limit_scope: If #TRUE, only descendants of @current_object's parent
+ * will be returned. Otherwise (if #FALSE), any accessible may be
+ * returned if it would preceed @current_object in a flattened
+ * hierarchy.
+ * @count: The maximum number of results to return, or 0 for no limit.
+ * @traverse: Not supported.
+ *
+ * Gets all #AtspiAccessible objects from the @collection, after
+ * @current_object, matching a given @rule.
+ *
+ * Returns: (element-type AtspiAccessible*) (transfer full): All
+ * #AtspiAccessible objects matching the given match rule after
+ * @current_object.
+ **/
+GArray *
+atspi_collection_get_matches_to (AtspiCollection *collection,
+ AtspiAccessible *current_object,
+ AtspiMatchRule *rule,
+ AtspiCollectionSortOrder sortby,
+ AtspiCollectionTreeTraversalType tree,
+ gboolean limit_scope,
+ gint count,
+ gboolean traverse,
+ GError **error)
+{
+ DBusMessage *message = new_message (collection, "GetMatchesTo");
+ DBusMessage *reply;
+ dbus_int32_t d_sortby = sortby;
+ dbus_int32_t d_tree = tree;
+ dbus_bool_t d_limit_scope = limit_scope;
+ dbus_int32_t d_count = count;
+ dbus_bool_t d_traverse = traverse;
+
+ if (!message)
+ return NULL;
+
+ if (!append_accessible (message, current_object))
+ return NULL;
+ if (!append_match_rule (message, rule))
+ return NULL;
+ dbus_message_append_args (message, DBUS_TYPE_UINT32, &d_sortby,
+ DBUS_TYPE_UINT32, &d_tree,
+ DBUS_TYPE_BOOLEAN, &d_limit_scope,
+ DBUS_TYPE_INT32, &d_count,
+ DBUS_TYPE_BOOLEAN, &d_traverse,
+ DBUS_TYPE_INVALID);
+ reply = _atspi_dbus_send_with_reply_and_block (message, error);
+ if (!reply)
+ return NULL;
+ return return_accessibles (reply);
+}
+
+/**
+ * atspi_collection_get_matches_from:
+ * @collection: A pointer to the #AtspiCollection to query.
+ * @current_object: Upon reaching this object, searching should stop.
+ * @rule: An #AtspiMatchRule describing the match criteria.
+ * @sortby: An #AtspiCollectionSortOrder specifying the way the results are to
+ * be sorted.
+ * @tree: An #AtspiCollectionTreeTraversalType specifying restrictions on
+ * the objects to be traversed.
+ * @count: The maximum number of results to return, or 0 for no limit.
+ * @traverse: Not supported.
+ *
+ * Gets all #AtspiAccessible objects from the @collection, before
+ * @current_object, matching a given @rule.
+ *
+ * Returns: (element-type AtspiAccessible*) (transfer full): All
+ * #AtspiAccessible objects matching the given match rule that preceed
+ * @current_object.
+ **/
+GArray *
+atspi_collection_get_matches_from (AtspiCollection *collection,
+ AtspiAccessible *current_object,
+ AtspiMatchRule *rule,
+ AtspiCollectionSortOrder sortby,
+ AtspiCollectionTreeTraversalType tree,
+ gint count,
+ gboolean traverse,
+ GError **error)
+{
+ DBusMessage *message = new_message (collection, "GetMatchesFrom");
+ DBusMessage *reply;
+ dbus_int32_t d_sortby = sortby;
+ dbus_int32_t d_tree = tree;
+ dbus_int32_t d_count = count;
+ dbus_bool_t d_traverse = traverse;
+
+ if (!message)
+ return NULL;
+
+ if (!append_accessible (message, current_object))
+ return NULL;
+ if (!append_match_rule (message, rule))
+ return NULL;
+ dbus_message_append_args (message, DBUS_TYPE_UINT32, &d_sortby,
+ DBUS_TYPE_UINT32, &d_tree,
+ DBUS_TYPE_INT32, &d_count,
+ DBUS_TYPE_BOOLEAN, &d_traverse,
+ DBUS_TYPE_INVALID);
+ reply = _atspi_dbus_send_with_reply_and_block (message, error);
+ if (!reply)
+ return NULL;
+ return return_accessibles (reply);
+}
+
+/**
+ * atspi_collection_get_active_descendant:
+ *
+* Returns: (transfer full): The active descendant of the given object.
+ * Not yet implemented.
+ **/
+AtspiAccessible *
+atspi_collection_get_active_descendant (AtspiCollection *collection, GError **error)
+{
+ g_warning ("atspi: TODO: Implement get_active_descendants");
+ return NULL;
+}
+
+static void
+atspi_collection_base_init (AtspiCollection *klass)
+{
+}
+
+GType
+atspi_collection_get_type (void)
+{
+ static GType type = 0;
+
+ if (!type) {
+ static const GTypeInfo tinfo =
+ {
+ sizeof (AtspiCollection),
+ (GBaseInitFunc) atspi_collection_base_init,
+ (GBaseFinalizeFunc) NULL,
+ };
+
+ type = g_type_register_static (G_TYPE_INTERFACE, "AtspiCollection", &tinfo, 0);
+
+ }
+ return type;
+}