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
#include "bridge.h"
26
#include <atk/atk.h>
27
#include <droute/droute.h>
28

            
29
#include "accessible-stateset.h"
30
#include "atspi/atspi.h"
31
#include "introspection.h"
32
#include "object.h"
33
#include "spi-dbus.h"
34
#include <string.h>
35

            
36
#define MAX_CHILDREN 65536
37

            
38
static dbus_bool_t
39
164
impl_get_Name (DBusMessageIter *iter, void *user_data)
40
{
41
164
  AtkObject *object = (AtkObject *) user_data;
42

            
43
164
  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
44

            
45
164
  return droute_return_v_string (iter, atk_object_get_name (object));
46
}
47

            
48
static dbus_bool_t
49
1
impl_get_Description (DBusMessageIter *iter, void *user_data)
50
{
51
1
  AtkObject *object = (AtkObject *) user_data;
52

            
53
1
  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
54

            
55
1
  return droute_return_v_string (iter, atk_object_get_description (object));
56
}
57

            
58
static dbus_bool_t
59
1
impl_get_Locale (DBusMessageIter *iter, void *user_data)
60
{
61
1
  AtkObject *object = (AtkObject *) user_data;
62

            
63
1
  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
64

            
65
1
  return droute_return_v_string (iter, atk_object_get_object_locale (object));
66
}
67

            
68
static dbus_bool_t
69
2
impl_get_Parent (DBusMessageIter *iter, void *user_data)
70
{
71
2
  AtkObject *obj = (AtkObject *) user_data;
72
  AtkObject *parent;
73
  DBusMessageIter iter_variant;
74
  dbus_uint32_t role;
75

            
76
2
  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
77

            
78
2
  role = spi_accessible_role_from_atk_role (atk_object_get_role (obj));
79

            
80
2
  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(so)",
81
                                    &iter_variant);
82

            
83
2
  parent = atk_object_get_parent (obj);
84
2
  if (parent == NULL)
85
    {
86
      /* TODO, move in to a 'Plug' wrapper. */
87
1
      if (ATK_IS_PLUG (obj))
88
        {
89
          char *id = g_object_get_data (G_OBJECT (obj), "dbus-plug-parent");
90
          char *bus_parent;
91
          char *path_parent;
92

            
93
          if (id)
94
            {
95
              bus_parent = g_strdup (id);
96
              if (bus_parent && (path_parent = g_utf8_strchr (bus_parent + 1, -1, ':')))
97
                {
98
                  DBusMessageIter iter_parent;
99
                  *(path_parent++) = '\0';
100
                  dbus_message_iter_open_container (&iter_variant, DBUS_TYPE_STRUCT, NULL,
101
                                                    &iter_parent);
102
                  dbus_message_iter_append_basic (&iter_parent, DBUS_TYPE_STRING, &bus_parent);
103
                  dbus_message_iter_append_basic (&iter_parent, DBUS_TYPE_OBJECT_PATH, &path_parent);
104
                  dbus_message_iter_close_container (&iter_variant, &iter_parent);
105
                }
106
              else
107
                {
108
                  spi_object_append_null_reference (&iter_variant);
109
                }
110
            }
111
          else
112
            {
113
              spi_object_append_null_reference (&iter_variant);
114
            }
115
        }
116
1
      else if (role != ATSPI_ROLE_APPLICATION)
117
1
        spi_object_append_null_reference (&iter_variant);
118
      else
119
        spi_object_append_desktop_reference (&iter_variant);
120
    }
121
  else
122
    {
123
1
      spi_object_append_reference (&iter_variant, parent);
124
    }
125

            
126
2
  dbus_message_iter_close_container (iter, &iter_variant);
127
2
  return TRUE;
128
}
129

            
130
static dbus_bool_t
131
1
impl_get_ChildCount (DBusMessageIter *iter, void *user_data)
132
{
133
1
  AtkObject *object = (AtkObject *) user_data;
134
  int childCount;
135

            
136
1
  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
137

            
138
1
  childCount = (ATK_IS_SOCKET (object) && atk_socket_is_occupied (ATK_SOCKET (object)))
139
                   ? 1
140
1
                   : atk_object_get_n_accessible_children (object);
141
1
  return droute_return_v_int32 (iter, childCount);
142
}
143

            
144
static DBusMessage *
145
138
impl_GetChildAtIndex (DBusConnection *bus,
146
                      DBusMessage *message,
147
                      void *user_data)
148
{
149
138
  AtkObject *object = (AtkObject *) user_data;
150
  DBusMessage *reply;
151
  dbus_int32_t i;
152
  AtkObject *child;
153

            
154
138
  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
155
                        droute_not_yet_handled_error (message));
156
138
  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &i, DBUS_TYPE_INVALID))
157
    {
158
      return droute_invalid_arguments_error (message);
159
    }
160

            
161
138
  if (ATK_IS_SOCKET (object) && atk_socket_is_occupied (ATK_SOCKET (object)) && i == 0)
162
    {
163
      AtkSocket *socket = ATK_SOCKET (object);
164
      gchar *child_name, *child_path;
165
      child_name = g_strdup (socket->embedded_plug_id);
166
      child_path = g_utf8_strchr (child_name + 1, -1, ':');
167
      if (child_path)
168
        {
169
          DBusMessageIter iter, iter_socket;
170
          *(child_path++) = '\0';
171
          reply = dbus_message_new_method_return (message);
172
          if (!reply)
173
            return NULL;
174
          dbus_message_iter_init_append (reply, &iter);
175
          dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL,
176
                                            &iter_socket);
177
          dbus_message_iter_append_basic (&iter_socket, DBUS_TYPE_STRING, &child_name);
178
          dbus_message_iter_append_basic (&iter_socket, DBUS_TYPE_OBJECT_PATH, &child_path);
179
          g_free (child_name);
180
          dbus_message_iter_close_container (&iter, &iter_socket);
181
          return reply;
182
        }
183
      g_free (child_name);
184
    }
185
138
  child = atk_object_ref_accessible_child (object, i);
186
138
  reply = spi_object_return_reference (message, child);
187
138
  if (child)
188
138
    g_object_unref (child);
189

            
190
138
  return reply;
191
}
192

            
193
static DBusMessage *
194
impl_GetChildren (DBusConnection *bus,
195
                  DBusMessage *message,
196
                  void *user_data)
197
{
198
  AtkObject *object = (AtkObject *) user_data;
199
  gint i;
200
  gint count;
201
  DBusMessage *reply;
202
  DBusMessageIter iter, iter_array;
203

            
204
  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
205
                        droute_not_yet_handled_error (message));
206
  count = atk_object_get_n_accessible_children (object);
207

            
208
  if (count > MAX_CHILDREN)
209
    {
210
      gchar *errmsg = g_strdup_printf (
211
          "Accessible's child count %d exceeds the maximum of %d handled by GetChildren.", count, MAX_CHILDREN);
212
      reply = dbus_message_new_error (message, DBUS_ERROR_INVALID_ARGS, errmsg);
213
      g_free (errmsg);
214
      return reply;
215
    }
216

            
217
  reply = dbus_message_new_method_return (message);
218
  if (!reply)
219
    goto oom;
220
  dbus_message_iter_init_append (reply, &iter);
221
  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(so)", &iter_array))
222
    goto oom;
223

            
224
  if (ATK_IS_SOCKET (object) && atk_socket_is_occupied (ATK_SOCKET (object)))
225
    {
226
      AtkSocket *socket = ATK_SOCKET (object);
227
      gchar *child_name, *child_path;
228
      child_name = g_strdup (socket->embedded_plug_id);
229
      child_path = g_utf8_strchr (child_name + 1, -1, ':');
230
      if (child_path)
231
        {
232
          DBusMessageIter iter_struct;
233
          *(child_path++) = '\0';
234
          dbus_message_iter_open_container (&iter_array, DBUS_TYPE_STRUCT, NULL,
235
                                            &iter_struct);
236
          dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING,
237
                                          &child_name);
238
          dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH,
239
                                          &child_path);
240
          dbus_message_iter_close_container (&iter_array, &iter_struct);
241
          g_free (child_name);
242
          if (!dbus_message_iter_close_container (&iter, &iter_array))
243
            goto oom;
244
          return reply;
245
        }
246
      g_free (child_name);
247
    }
248

            
249
  for (i = 0; i < count; i++)
250
    {
251
      AtkObject *child = atk_object_ref_accessible_child (object, i);
252
      spi_object_append_reference (&iter_array, child);
253
      if (child)
254
        g_object_unref (child);
255
    }
256
  if (!dbus_message_iter_close_container (&iter, &iter_array))
257
    goto oom;
258
  return reply;
259
oom:
260
  // TODO: handle out-of-memory
261
  return reply;
262
}
263

            
264
static DBusMessage *
265
1
impl_GetIndexInParent (DBusConnection *bus,
266
                       DBusMessage *message,
267
                       void *user_data)
268
{
269
1
  AtkObject *object = (AtkObject *) user_data;
270
  dbus_int32_t rv;
271
  DBusMessage *reply;
272

            
273
1
  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
274
                        droute_not_yet_handled_error (message));
275

            
276
1
  rv = atk_object_get_index_in_parent (object);
277
1
  reply = dbus_message_new_method_return (message);
278
1
  dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv, DBUS_TYPE_INVALID);
279
1
  return reply;
280
}
281

            
282
static gboolean
283
2
spi_init_relation_type_table (AtspiRelationType *types)
284
{
285
  gint i;
286

            
287
44
  for (i = 0; i < ATK_RELATION_LAST_DEFINED; i++)
288
42
    types[i] = ATSPI_RELATION_NULL;
289

            
290
2
  types[ATK_RELATION_CONTROLLED_BY] = ATSPI_RELATION_CONTROLLED_BY;
291
2
  types[ATK_RELATION_CONTROLLER_FOR] = ATSPI_RELATION_CONTROLLER_FOR;
292
2
  types[ATK_RELATION_LABEL_FOR] = ATSPI_RELATION_LABEL_FOR;
293
2
  types[ATK_RELATION_LABELLED_BY] = ATSPI_RELATION_LABELLED_BY;
294
2
  types[ATK_RELATION_MEMBER_OF] = ATSPI_RELATION_MEMBER_OF;
295
2
  types[ATK_RELATION_NODE_CHILD_OF] = ATSPI_RELATION_NODE_CHILD_OF;
296
2
  types[ATK_RELATION_FLOWS_TO] = ATSPI_RELATION_FLOWS_TO;
297
2
  types[ATK_RELATION_FLOWS_FROM] = ATSPI_RELATION_FLOWS_FROM;
298
2
  types[ATK_RELATION_SUBWINDOW_OF] = ATSPI_RELATION_SUBWINDOW_OF;
299
2
  types[ATK_RELATION_EMBEDS] = ATSPI_RELATION_EMBEDS;
300
2
  types[ATK_RELATION_EMBEDDED_BY] = ATSPI_RELATION_EMBEDDED_BY;
301
2
  types[ATK_RELATION_POPUP_FOR] = ATSPI_RELATION_POPUP_FOR;
302
2
  types[ATK_RELATION_PARENT_WINDOW_OF] =
303
      ATSPI_RELATION_PARENT_WINDOW_OF;
304
2
  types[ATK_RELATION_DESCRIPTION_FOR] =
305
      ATSPI_RELATION_DESCRIPTION_FOR;
306
2
  types[ATK_RELATION_DESCRIBED_BY] = ATSPI_RELATION_DESCRIBED_BY;
307
2
  types[ATK_RELATION_DETAILS] = ATSPI_RELATION_DETAILS;
308
2
  types[ATK_RELATION_DETAILS_FOR] = ATSPI_RELATION_DETAILS_FOR;
309
2
  types[ATK_RELATION_ERROR_MESSAGE] = ATSPI_RELATION_ERROR_MESSAGE;
310
2
  types[ATK_RELATION_ERROR_FOR] = ATSPI_RELATION_ERROR_FOR;
311
2
  types[ATK_RELATION_NODE_PARENT_OF] = ATSPI_RELATION_NODE_PARENT_OF;
312

            
313
2
  return TRUE;
314
}
315

            
316
static AtspiRelationType
317
2
spi_relation_type_from_atk_relation_type (AtkRelationType type)
318
{
319
  static gboolean is_initialized = FALSE;
320
  static AtspiRelationType
321
      spi_relation_type_table[ATK_RELATION_LAST_DEFINED];
322
  AtspiRelationType spi_type;
323

            
324
2
  if (!is_initialized)
325
2
    is_initialized = spi_init_relation_type_table (spi_relation_type_table);
326

            
327
2
  if (type > ATK_RELATION_NULL && type < ATK_RELATION_LAST_DEFINED)
328
2
    spi_type = spi_relation_type_table[type];
329
  else
330
    spi_type = ATSPI_RELATION_EXTENDED;
331
2
  return spi_type;
332
}
333

            
334
static DBusMessage *
335
2
impl_GetRelationSet (DBusConnection *bus,
336
                     DBusMessage *message,
337
                     void *user_data)
338
{
339
2
  AtkObject *object = (AtkObject *) user_data;
340
  DBusMessage *reply;
341
  AtkRelationSet *set;
342
  DBusMessageIter iter, iter_array, iter_struct, iter_targets;
343
  gint count;
344
  gint i, j;
345

            
346
2
  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
347
                        droute_not_yet_handled_error (message));
348
2
  reply = dbus_message_new_method_return (message);
349
2
  if (!reply)
350
    return NULL;
351
2
  set = atk_object_ref_relation_set (object);
352
2
  dbus_message_iter_init_append (reply, &iter);
353
2
  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ua(so))", &iter_array))
354
    {
355
      goto oom;
356
    }
357
2
  count = 0;
358
2
  if (set)
359
2
    count = atk_relation_set_get_n_relations (set);
360
4
  for (i = 0; i < count; i++)
361
    {
362
2
      AtkRelation *r = atk_relation_set_get_relation (set, i);
363
      AtkRelationType rt;
364
      GPtrArray *target;
365
      dbus_uint32_t type;
366
2
      if (!r)
367
        continue;
368
2
      rt = atk_relation_get_relation_type (r);
369
2
      type = spi_relation_type_from_atk_relation_type (rt);
370
2
      target = atk_relation_get_target (r);
371
2
      if (!dbus_message_iter_open_container (&iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct))
372
        {
373
          goto oom;
374
        }
375
2
      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &type);
376
2
      if (!dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "(so)", &iter_targets))
377
        {
378
          goto oom;
379
        }
380
4
      for (j = 0; j < target->len; j++)
381
        {
382
2
          AtkObject *obj = target->pdata[j];
383
2
          if (!obj)
384
            continue;
385
2
          spi_object_append_reference (&iter_targets, obj);
386
        }
387
2
      dbus_message_iter_close_container (&iter_struct, &iter_targets);
388
2
      dbus_message_iter_close_container (&iter_array, &iter_struct);
389
    }
390
2
  dbus_message_iter_close_container (&iter, &iter_array);
391
2
oom:
392
2
  if (set)
393
2
    g_object_unref (set);
394
  // TODO: handle out of memory */
395
2
  return reply;
396
}
397

            
398
static DBusMessage *
399
5
impl_GetRole (DBusConnection *bus, DBusMessage *message, void *user_data)
400
{
401
5
  AtkObject *object = (AtkObject *) user_data;
402
  gint role;
403
  dbus_uint32_t rv;
404
  DBusMessage *reply;
405

            
406
5
  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
407
                        droute_not_yet_handled_error (message));
408
5
  role = atk_object_get_role (object);
409
5
  rv = spi_accessible_role_from_atk_role (role);
410
5
  reply = dbus_message_new_method_return (message);
411
5
  if (reply)
412
    {
413
5
      dbus_message_append_args (reply, DBUS_TYPE_UINT32, &rv,
414
                                DBUS_TYPE_INVALID);
415
    }
416
5
  return reply;
417
}
418

            
419
static DBusMessage *
420
impl_GetRoleName (DBusConnection *bus,
421
                  DBusMessage *message,
422
                  void *user_data)
423
{
424
  AtkObject *object = (AtkObject *) user_data;
425
  gint role;
426
  const char *role_name;
427
  DBusMessage *reply;
428

            
429
  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
430
                        droute_not_yet_handled_error (message));
431
  role = atk_object_get_role (object);
432
  role_name = atk_role_get_name (role);
433
  if (!role_name)
434
    role_name = "";
435
  reply = dbus_message_new_method_return (message);
436
  if (reply)
437
    {
438
      dbus_message_append_args (reply, DBUS_TYPE_STRING, &role_name,
439
                                DBUS_TYPE_INVALID);
440
    }
441
  return reply;
442
}
443

            
444
static DBusMessage *
445
impl_GetLocalizedRoleName (DBusConnection *bus,
446
                           DBusMessage *message,
447
                           void *user_data)
448
{
449
  AtkObject *object = (AtkObject *) user_data;
450
  gint role;
451
  const char *role_name;
452
  DBusMessage *reply;
453

            
454
  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
455
                        droute_not_yet_handled_error (message));
456
  role = atk_object_get_role (object);
457
  role_name = atk_role_get_localized_name (role);
458
  if (!role_name)
459
    role_name = "";
460
  reply = dbus_message_new_method_return (message);
461
  if (reply)
462
    {
463
      dbus_message_append_args (reply, DBUS_TYPE_STRING, &role_name,
464
                                DBUS_TYPE_INVALID);
465
    }
466
  return reply;
467
}
468

            
469
static DBusMessage *
470
12
impl_GetState (DBusConnection *bus, DBusMessage *message, void *user_data)
471
{
472
12
  AtkObject *object = (AtkObject *) user_data;
473

            
474
12
  DBusMessage *reply = NULL;
475
  DBusMessageIter iter, iter_array;
476

            
477
  dbus_uint32_t states[2];
478

            
479
  guint count;
480

            
481
12
  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
482
                        droute_not_yet_handled_error (message));
483

            
484
12
  reply = dbus_message_new_method_return (message);
485
12
  dbus_message_iter_init_append (reply, &iter);
486

            
487
12
  spi_atk_state_to_dbus_array (object, states);
488
12
  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "u", &iter_array);
489
36
  for (count = 0; count < 2; count++)
490
    {
491
24
      dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_UINT32,
492
24
                                      &states[count]);
493
    }
494
12
  dbus_message_iter_close_container (&iter, &iter_array);
495
12
  return reply;
496
}
497

            
498
static DBusMessage *
499
2
impl_GetAttributes (DBusConnection *bus,
500
                    DBusMessage *message,
501
                    void *user_data)
502
{
503
2
  AtkObject *object = (AtkObject *) user_data;
504
  AtkAttributeSet *attributes;
505
2
  DBusMessage *reply = NULL;
506
  DBusMessageIter iter;
507

            
508
2
  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
509
                        droute_not_yet_handled_error (message));
510

            
511
2
  attributes = atk_object_get_attributes (object);
512

            
513
2
  reply = dbus_message_new_method_return (message);
514
2
  dbus_message_iter_init_append (reply, &iter);
515
2
  spi_object_append_attribute_set (&iter, attributes);
516

            
517
2
  atk_attribute_set_free (attributes);
518

            
519
2
  return reply;
520
}
521

            
522
static dbus_bool_t
523
impl_get_Attributes (DBusMessageIter *iter, void *user_data)
524
{
525
  DBusMessageIter iter_variant;
526
  AtkObject *object = (AtkObject *) user_data;
527
  AtkAttributeSet *attributes;
528

            
529
  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
530

            
531
  attributes = atk_object_get_attributes (object);
532

            
533
  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "a{ss}", &iter_variant);
534
  spi_object_append_attribute_set (&iter_variant, attributes);
535
  dbus_message_iter_close_container (iter, &iter_variant);
536

            
537
  atk_attribute_set_free (attributes);
538

            
539
  return TRUE;
540
}
541

            
542
static DBusMessage *
543
impl_GetApplication (DBusConnection *bus,
544
                     DBusMessage *message,
545
                     void *user_data)
546
{
547
  return spi_object_return_reference (message, atk_get_root ());
548
}
549

            
550
static DBusMessage *
551
122
impl_GetInterfaces (DBusConnection *bus,
552
                    DBusMessage *message,
553
                    void *user_data)
554
{
555
122
  AtkObject *object = (AtkObject *) user_data;
556
  DBusMessage *reply;
557
  DBusMessageIter iter, iter_array;
558

            
559
122
  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
560
                        droute_not_yet_handled_error (message));
561
122
  reply = dbus_message_new_method_return (message);
562
122
  if (reply)
563
    {
564
122
      dbus_message_iter_init_append (reply, &iter);
565
122
      dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "s",
566
                                        &iter_array);
567
122
      spi_object_append_interfaces (&iter_array, object);
568
122
      dbus_message_iter_close_container (&iter, &iter_array);
569
    }
570
122
  return reply;
571
}
572

            
573
static dbus_bool_t
574
impl_get_AccessibleId (DBusMessageIter *iter, void *user_data)
575
{
576
  AtkObject *object = (AtkObject *) user_data;
577

            
578
  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
579

            
580
  return droute_return_v_string (iter, atk_object_get_accessible_id (object));
581
}
582

            
583
static dbus_bool_t
584
1
impl_get_HelpText (DBusMessageIter *iter, void *user_data)
585
{
586
1
  AtkObject *object = (AtkObject *) user_data;
587

            
588
1
  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
589

            
590
1
  return droute_return_v_string (iter, atk_object_get_help_text (object));
591
}
592

            
593
static DRouteMethod methods[] = {
594
  { impl_GetChildAtIndex, "GetChildAtIndex" },
595
  { impl_GetChildren, "GetChildren" },
596
  { impl_GetIndexInParent, "GetIndexInParent" },
597
  { impl_GetRelationSet, "GetRelationSet" },
598
  { impl_GetRole, "GetRole" },
599
  { impl_GetRoleName, "GetRoleName" },
600
  { impl_GetLocalizedRoleName, "GetLocalizedRoleName" },
601
  { impl_GetState, "GetState" },
602
  { impl_GetAttributes, "GetAttributes" },
603
  { impl_GetApplication, "GetApplication" },
604
  { impl_GetInterfaces, "GetInterfaces" },
605
  { NULL, NULL }
606
};
607

            
608
static DRouteProperty properties[] = {
609
  { impl_get_Name, NULL, "Name" },
610
  { impl_get_Description, NULL, "Description" },
611
  { impl_get_Locale, NULL, "Locale" },
612
  { impl_get_Parent, NULL, "Parent" },
613
  { impl_get_ChildCount, NULL, "ChildCount" },
614
  { impl_get_Attributes, NULL, "Attributes" },
615
  { impl_get_AccessibleId, NULL, "AccessibleId" },
616
  { impl_get_HelpText, NULL, "HelpText" },
617
  { NULL, NULL, NULL }
618
};
619

            
620
void
621
161
spi_initialize_accessible (DRoutePath *path)
622
{
623
161
  spi_atk_add_interface (path,
624
                         ATSPI_DBUS_INTERFACE_ACCESSIBLE,
625
                         spi_org_a11y_atspi_Accessible,
626
                         methods, properties);
627
161
};