Update to correspond with dbus spec
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / tree-adaptor.c
1 /*
2  * AT-SPI - Assistive Technology Service Provider Interface
3  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
4  *
5  * Copyright 2008 Novell, Inc.
6  * Copyright 2001, 2002 Sun Microsystems Inc.,
7  * Copyright 2001, 2002 Ximian, Inc.
8  * Copyright 2008, 2009 Codethink Ltd.
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Library General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Library General Public License for more details.
19  *
20  * You should have received a copy of the GNU Library General Public
21  * License along with this library; if not, write to the
22  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23  * Boston, MA 02111-1307, USA.
24  */
25
26 #include <string.h>
27
28 #include <atk/atk.h>
29 #include <droute/droute.h>
30
31 #include "bridge.h"
32 #include "accessible-register.h"
33 #include "accessible-marshaller.h"
34 #include "common/spi-dbus.h"
35
36 /*---------------------------------------------------------------------------*/
37
38 /* For use as a GHFunc */
39 static void
40 append_accessible_hf (gpointer key, gpointer obj_data, gpointer iter)
41 {
42   /* Make sure it isn't a hyperlink */
43   if (ATK_IS_OBJECT (obj_data))
44     spi_atk_append_accessible (ATK_OBJECT(obj_data), iter);
45 }
46
47 /*---------------------------------------------------------------------------*/
48
49 void
50 spi_emit_cache_removal (guint ref,  DBusConnection *bus)
51 {
52   DBusMessage *message;
53
54   if ((message = dbus_message_new_signal ("/org/freedesktop/atspi/tree",
55                                           SPI_DBUS_INTERFACE_TREE,
56                                           "RemoveAccessible"))) {
57     DBusMessageIter iter;
58     gchar *path;
59
60     dbus_message_iter_init_append (message, &iter);
61
62     path = atk_dbus_ref_to_path (ref);
63     dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &path);
64
65     dbus_connection_send(bus, message, NULL);
66
67     dbus_message_unref (message);
68   }
69 }
70
71 void
72 spi_emit_cache_update (AtkObject *accessible, DBusConnection *bus)
73 {
74   DBusMessage *message;
75
76   if ((message = dbus_message_new_signal ("/org/freedesktop/atspi/tree",
77                                           SPI_DBUS_INTERFACE_TREE,
78                                           "UpdateAccessible"))) {
79     DBusMessageIter iter;
80
81     dbus_message_iter_init_append (message, &iter);
82     spi_atk_append_accessible (accessible, &iter);
83
84     dbus_connection_send(bus, message, NULL);
85
86     dbus_message_unref (message);
87   }
88 }
89
90
91 /*---------------------------------------------------------------------------*/
92
93 static DBusMessage *
94 impl_GetRoot (DBusConnection *bus, DBusMessage *message, void *user_data)
95 {
96   AtkObject *root = atk_get_root();
97   char *path;
98   DBusMessage *reply;
99   gchar       *errmsg;
100
101   if (!root)
102     {
103       reply = dbus_message_new_error (message,
104                                       DBUS_ERROR_FAILED,
105                                       "No root accessible available");
106     }
107   path = atk_dbus_object_to_path (root, FALSE);
108   if (!path)
109     {
110       reply = dbus_message_new_error (message,
111                                       DBUS_ERROR_FAILED,
112                                       "No root accessible available");
113     }
114   reply = dbus_message_new_method_return (message);
115   dbus_message_append_args (reply, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID);
116   g_free (path);
117   return reply;
118 }
119
120 /*---------------------------------------------------------------------------*/
121
122 static DBusMessage *
123 impl_GetTree (DBusConnection *bus, DBusMessage *message, void *user_data)
124 {
125   DBusMessage *reply;
126   DBusMessageIter iter, iter_array;
127
128   reply = dbus_message_new_method_return (message);
129
130   dbus_message_iter_init_append (reply, &iter);
131   dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(ooaoassusau)", &iter_array);
132   atk_dbus_foreach_registered(append_accessible_hf, &iter_array);
133   dbus_message_iter_close_container(&iter, &iter_array);
134   return reply;
135 }
136
137 /*---------------------------------------------------------------------------*/
138
139 static DRouteMethod methods[] = {
140   {impl_GetRoot, "GetRoot"},
141   {impl_GetTree, "GetTree"},
142   {NULL, NULL}
143 };
144
145 void
146 spi_initialize_tree (DRoutePath *path)
147 {
148   droute_path_add_interface (path,
149                              SPI_DBUS_INTERFACE_TREE,
150                              methods,
151                              NULL);
152 };
153
154 /*END------------------------------------------------------------------------*/