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
 *
9
 * This library is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU Lesser General Public
11
 * License as published by the Free Software Foundation; either
12
 * version 2.1 of the License, or (at your option) any later version.
13
 *
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
 * Lesser General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU Lesser General Public
20
 * License along with this library; if not, write to the
21
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22
 * Boston, MA 02110-1301, USA.
23
 */
24

            
25
#define ATK_DISABLE_DEPRECATION_WARNINGS
26
#include "bridge.h"
27
#include <atk/atk.h>
28
#include <droute/droute.h>
29

            
30
#include "spi-dbus.h"
31

            
32
#include "introspection.h"
33
#include "object.h"
34

            
35
static dbus_bool_t
36
impl_get_Version (DBusMessageIter *iter, void *user_data)
37
{
38
  return droute_return_v_uint32 (iter, SPI_DBUS_DOCUMENT_VERSION);
39
}
40

            
41
static dbus_bool_t
42
impl_get_CurrentPageNumber (DBusMessageIter *iter, void *user_data)
43
{
44
  AtkDocument *document = (AtkDocument *) user_data;
45
  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data), FALSE);
46
  return droute_return_v_int32 (iter, atk_document_get_current_page_number (document));
47
}
48

            
49
static dbus_bool_t
50
impl_get_PageCount (DBusMessageIter *iter, void *user_data)
51
{
52
  AtkDocument *document = (AtkDocument *) user_data;
53
  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data), FALSE);
54
  return droute_return_v_int32 (iter, atk_document_get_page_count (document));
55
}
56

            
57
static DBusMessage *
58
1
impl_GetLocale (DBusConnection *bus, DBusMessage *message, void *user_data)
59
{
60
1
  AtkDocument *document = (AtkDocument *) user_data;
61
  const gchar *lc;
62
  DBusMessage *reply;
63

            
64
1
  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data),
65
                        droute_not_yet_handled_error (message));
66
1
  lc = atk_document_get_locale (document);
67
1
  if (!lc)
68
    lc = "";
69
1
  reply = dbus_message_new_method_return (message);
70
1
  if (reply)
71
    {
72
1
      dbus_message_append_args (reply, DBUS_TYPE_STRING, &lc,
73
                                DBUS_TYPE_INVALID);
74
    }
75
1
  return reply;
76
}
77

            
78
static DBusMessage *
79
2
impl_GetAttributeValue (DBusConnection *bus, DBusMessage *message, void *user_data)
80
{
81
2
  AtkDocument *document = (AtkDocument *) user_data;
82
  gchar *attributename;
83
  const gchar *atr;
84
  DBusMessage *reply;
85

            
86
2
  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data),
87
                        droute_not_yet_handled_error (message));
88
2
  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &attributename, DBUS_TYPE_INVALID))
89
    {
90
      return droute_invalid_arguments_error (message);
91
    }
92
2
  atr = atk_document_get_attribute_value (document, attributename);
93
2
  if (!atr)
94
    atr = "";
95
2
  reply = dbus_message_new_method_return (message);
96
2
  if (reply)
97
    {
98
2
      dbus_message_append_args (reply, DBUS_TYPE_STRING, &atr,
99
                                DBUS_TYPE_INVALID);
100
    }
101
2
  return reply;
102
}
103

            
104
static DBusMessage *
105
1
impl_GetAttributes (DBusConnection *bus, DBusMessage *message, void *user_data)
106
{
107
1
  AtkDocument *document = (AtkDocument *) user_data;
108
  DBusMessage *reply;
109
  AtkAttributeSet *attributes;
110
  DBusMessageIter iter;
111

            
112
1
  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data),
113
                        droute_not_yet_handled_error (message));
114

            
115
1
  attributes = atk_document_get_attributes (document);
116

            
117
1
  reply = dbus_message_new_method_return (message);
118
1
  if (reply)
119
    {
120
1
      dbus_message_iter_init_append (reply, &iter);
121
1
      spi_object_append_attribute_set (&iter, attributes);
122
    }
123

            
124
1
  if (attributes)
125
1
    atk_attribute_set_free (attributes);
126
1
  return reply;
127
}
128

            
129
static DBusMessage *
130
2
impl_GetTextSelections (DBusConnection *bus, DBusMessage *message, void *user_data)
131
{
132
2
  AtkDocument *document = (AtkDocument *) user_data;
133
  GArray *selections;
134
  gint i, count;
135
  DBusMessageIter iter, iter_array, iter_struct;
136
  DBusMessage *reply;
137

            
138
2
  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data),
139
                        droute_not_yet_handled_error (message));
140

            
141
2
  selections = atk_document_get_text_selections (document);
142
2
  count = (selections ? selections->len : 0);
143

            
144
2
  reply = dbus_message_new_method_return (message);
145
2
  if (!reply)
146
    goto done;
147
2
  dbus_message_iter_init_append (reply, &iter);
148
2
  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "((so)i(so)ib)", &iter_array);
149
4
  for (i = 0; i < count; i++)
150
    {
151
2
      dbus_message_iter_open_container (&iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct);
152
2
      AtkTextSelection *item = &g_array_index (selections, AtkTextSelection, i);
153
2
      spi_object_append_reference (&iter_struct, item->start_object);
154
2
      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &item->start_offset);
155
2
      spi_object_append_reference (&iter_struct, item->end_object);
156
2
      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &item->end_offset);
157
2
      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_BOOLEAN, &item->start_is_active);
158
2
      dbus_message_iter_close_container (&iter_array, &iter_struct);
159
    }
160
2
  dbus_message_iter_close_container (&iter, &iter_array);
161

            
162
2
done:
163
2
  if (selections)
164
1
    g_array_free (selections, TRUE);
165
2
  return reply;
166
}
167

            
168
static DBusMessage *
169
1
impl_SetTextSelections (DBusConnection *bus, DBusMessage *message, void *user_data)
170
{
171
1
  AtkDocument *document = (AtkDocument *) user_data;
172
  GArray *selections;
173
  DBusMessageIter iter, iter_array, iter_struct;
174
  gboolean ret;
175
  DBusMessage *reply;
176

            
177
1
  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data),
178
                        droute_not_yet_handled_error (message));
179

            
180
1
  if (strcmp (dbus_message_get_signature (message), "a((so)i(so)ib)") != 0)
181
    {
182
      return droute_invalid_arguments_error (message);
183
    }
184

            
185
1
  selections = g_array_new (FALSE, TRUE, sizeof (AtkTextSelection));
186
1
  dbus_message_iter_init (message, &iter);
187
1
  dbus_message_iter_recurse (&iter, &iter_array);
188

            
189
3
  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
190
    {
191
      AtkTextSelection selection;
192
2
      dbus_message_iter_recurse (&iter_array, &iter_struct);
193
2
      selection.start_object = ATK_OBJECT (spi_dbus_get_object_from_iter (&iter_struct));
194
2
      dbus_message_iter_get_basic (&iter_struct, &selection.start_offset);
195
2
      dbus_message_iter_next (&iter_struct);
196
2
      selection.end_object = ATK_OBJECT (spi_dbus_get_object_from_iter (&iter_struct));
197
2
      dbus_message_iter_get_basic (&iter_struct, &selection.end_offset);
198
2
      dbus_message_iter_next (&iter_struct);
199
2
      dbus_message_iter_get_basic (&iter_struct, &selection.start_is_active);
200
2
      g_array_append_val (selections, selection);
201
2
      dbus_message_iter_next (&iter_array);
202
    }
203

            
204
1
  ret = atk_document_set_text_selections (document, selections);
205
1
  g_array_free (selections, TRUE);
206

            
207
1
  reply = dbus_message_new_method_return (message);
208
1
  if (reply)
209
1
    dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret, DBUS_TYPE_INVALID);
210
1
  return reply;
211
}
212

            
213
static DRouteMethod methods[] = {
214
  { impl_GetLocale, "GetLocale" },
215
  { impl_GetAttributeValue, "GetAttributeValue" },
216
  { impl_GetAttributes, "GetAttributes" },
217
  { impl_GetTextSelections, "GetTextSelections" },
218
  { impl_SetTextSelections, "SetTextSelections" },
219
  { NULL, NULL }
220
};
221

            
222
static DRouteProperty properties[] = {
223
  { impl_get_CurrentPageNumber, NULL, "CurrentPageNumber" },
224
  { impl_get_PageCount, NULL, "PageCount" },
225
  { impl_get_Version, NULL, "version" },
226
  { NULL, NULL, NULL }
227
};
228

            
229
void
230
161
spi_initialize_document (DRoutePath *path)
231
{
232
161
  droute_path_add_interface (path,
233
                             ATSPI_DBUS_INTERFACE_DOCUMENT, spi_org_a11y_atspi_Document, methods, properties);
234
161
};