2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2008 Novell, Inc.
6 * Copyright 2001, 2002 Sun Microsystems Inc.,
7 * Copyright 2001, 2002 Ximian, Inc.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
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 * Library General Public License for more details.
19 * You should have received a copy of the GNU Library General Public
20 * License along with this library; if not, write to the
21 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 * Boston, MA 02111-1307, USA.
26 #include <droute/droute.h>
28 #include "accessible-marshaller.h"
29 #include "common/spi-dbus.h"
32 impl_get_NRows (DBusMessageIter * iter, void *user_data)
34 AtkTable *table = (AtkTable *) user_data;
35 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
36 return droute_return_v_int32 (iter, atk_table_get_n_rows (table));
40 impl_get_NColumns (DBusMessageIter * iter, void *user_data)
42 AtkTable *table = (AtkTable *) user_data;
43 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
44 return droute_return_v_int32 (iter, atk_table_get_n_columns (table));
48 impl_get_Caption (DBusMessageIter * iter, void *user_data)
50 AtkTable *table = (AtkTable *) user_data;
51 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
52 return spi_dbus_return_v_object (iter, atk_table_get_caption (table),
57 impl_get_Summary (DBusMessageIter * iter, void *user_data)
59 AtkTable *table = (AtkTable *) user_data;
60 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
61 return spi_dbus_return_v_object (iter, atk_table_get_summary (table),
66 impl_get_NSelectedRows (DBusMessageIter * iter, void *user_data)
68 AtkTable *table = (AtkTable *) user_data;
69 gint *selected_rows = NULL;
71 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
72 count = atk_table_get_selected_rows (table, &selected_rows);
74 g_free (selected_rows);
75 return droute_return_v_int32 (iter, count);
79 impl_get_NSelectedColumns (DBusMessageIter * iter, void *user_data)
81 AtkTable *table = (AtkTable *) user_data;
82 gint *selected_columns = NULL;
84 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
85 count = atk_table_get_selected_columns (table, &selected_columns);
87 g_free (selected_columns);
88 return droute_return_v_int32 (iter, count);
92 impl_GetAccessibleAt (DBusConnection * bus, DBusMessage * message,
95 AtkTable *table = (AtkTable *) user_data;
96 dbus_int32_t row, column;
100 g_return_val_if_fail (ATK_IS_TABLE (user_data),
101 droute_not_yet_handled_error (message));
102 dbus_error_init (&error);
103 if (!dbus_message_get_args
104 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
107 return droute_invalid_arguments_error (message);
109 obj = atk_table_ref_at (table, row, column);
110 return spi_dbus_return_object (message, obj, TRUE, TRUE);
114 impl_GetIndexAt (DBusConnection * bus, DBusMessage * message, void *user_data)
116 AtkTable *table = (AtkTable *) user_data;
117 dbus_int32_t row, column;
122 g_return_val_if_fail (ATK_IS_TABLE (user_data),
123 droute_not_yet_handled_error (message));
124 dbus_error_init (&error);
125 if (!dbus_message_get_args
126 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
129 return droute_invalid_arguments_error (message);
131 index = atk_table_get_index_at (table, row, column);
132 reply = dbus_message_new_method_return (message);
135 dbus_message_append_args (reply, DBUS_TYPE_INT32, &index,
142 impl_GetRowAtIndex (DBusConnection * bus, DBusMessage * message,
145 AtkTable *table = (AtkTable *) user_data;
151 g_return_val_if_fail (ATK_IS_TABLE (user_data),
152 droute_not_yet_handled_error (message));
153 dbus_error_init (&error);
154 if (!dbus_message_get_args
155 (message, &error, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
157 return droute_invalid_arguments_error (message);
159 row = atk_table_get_row_at_index (table, index);
160 reply = dbus_message_new_method_return (message);
163 dbus_message_append_args (reply, DBUS_TYPE_INT32, &row,
170 impl_GetColumnAtIndex (DBusConnection * bus, DBusMessage * message,
173 AtkTable *table = (AtkTable *) user_data;
179 g_return_val_if_fail (ATK_IS_TABLE (user_data),
180 droute_not_yet_handled_error (message));
181 dbus_error_init (&error);
182 if (!dbus_message_get_args
183 (message, &error, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
185 return droute_invalid_arguments_error (message);
187 column = atk_table_get_column_at_index (table, index);
188 reply = dbus_message_new_method_return (message);
191 dbus_message_append_args (reply, DBUS_TYPE_INT32, &column,
198 impl_GetRowDescription (DBusConnection * bus, DBusMessage * message,
202 AtkTable *table = (AtkTable *) user_data;
203 const gchar *description;
207 g_return_val_if_fail (ATK_IS_TABLE (user_data),
208 droute_not_yet_handled_error (message));
209 dbus_error_init (&error);
210 if (!dbus_message_get_args
211 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
213 return droute_invalid_arguments_error (message);
215 description = atk_table_get_row_description (table, row);
218 reply = dbus_message_new_method_return (message);
221 dbus_message_append_args (reply, DBUS_TYPE_STRING, &description,
228 impl_GetColumnDescription (DBusConnection * bus, DBusMessage * message,
231 AtkTable *table = (AtkTable *) user_data;
233 const char *description;
237 g_return_val_if_fail (ATK_IS_TABLE (user_data),
238 droute_not_yet_handled_error (message));
239 dbus_error_init (&error);
240 if (!dbus_message_get_args
241 (message, &error, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
243 return droute_invalid_arguments_error (message);
245 description = atk_table_get_column_description (table, column);
248 reply = dbus_message_new_method_return (message);
251 dbus_message_append_args (reply, DBUS_TYPE_STRING, &description,
258 impl_GetRowExtentAt (DBusConnection * bus, DBusMessage * message,
261 AtkTable *table = (AtkTable *) user_data;
262 dbus_int32_t row, column;
267 g_return_val_if_fail (ATK_IS_TABLE (user_data),
268 droute_not_yet_handled_error (message));
269 dbus_error_init (&error);
270 if (!dbus_message_get_args
271 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
274 return droute_invalid_arguments_error (message);
276 extent = atk_table_get_row_extent_at (table, row, column);
277 reply = dbus_message_new_method_return (message);
280 dbus_message_append_args (reply, DBUS_TYPE_INT32, &extent,
287 impl_GetColumnExtentAt (DBusConnection * bus, DBusMessage * message,
290 AtkTable *table = (AtkTable *) user_data;
291 dbus_int32_t row, column;
296 g_return_val_if_fail (ATK_IS_TABLE (user_data),
297 droute_not_yet_handled_error (message));
298 dbus_error_init (&error);
299 if (!dbus_message_get_args
300 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
303 return droute_invalid_arguments_error (message);
305 extent = atk_table_get_column_extent_at (table, row, column);
306 reply = dbus_message_new_method_return (message);
309 dbus_message_append_args (reply, DBUS_TYPE_INT32, &extent,
316 impl_GetRowHeader (DBusConnection * bus, DBusMessage * message,
319 AtkTable *table = (AtkTable *) user_data;
324 g_return_val_if_fail (ATK_IS_TABLE (user_data),
325 droute_not_yet_handled_error (message));
326 dbus_error_init (&error);
327 if (!dbus_message_get_args
328 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
330 return droute_invalid_arguments_error (message);
332 obj = atk_table_get_row_header (table, row);
333 obj = atk_table_get_row_header (table, row);
334 return spi_dbus_return_object (message, obj, TRUE, FALSE);
338 impl_GetColumnHeader (DBusConnection * bus, DBusMessage * message,
341 AtkTable *table = (AtkTable *) user_data;
346 g_return_val_if_fail (ATK_IS_TABLE (user_data),
347 droute_not_yet_handled_error (message));
348 dbus_error_init (&error);
349 if (!dbus_message_get_args
350 (message, &error, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
352 return droute_invalid_arguments_error (message);
354 obj = atk_table_get_column_header (table, column);
355 obj = atk_table_get_column_header (table, column);
356 return spi_dbus_return_object (message, obj, TRUE, FALSE);
360 impl_GetSelectedRows (DBusConnection * bus, DBusMessage * message,
363 AtkTable *table = (AtkTable *) user_data;
364 gint *selected_rows = NULL;
368 g_return_val_if_fail (ATK_IS_TABLE (user_data),
369 droute_not_yet_handled_error (message));
370 count = atk_table_get_selected_rows (table, &selected_rows);
373 reply = dbus_message_new_method_return (message);
376 /* tbd - figure out if this is safe for a 0-length array */
377 dbus_message_append_args (reply, DBUS_TYPE_ARRAY, DBUS_TYPE_INT32,
378 &selected_rows, count, DBUS_TYPE_INVALID);
381 g_free (selected_rows);
386 impl_GetSelectedColumns (DBusConnection * bus, DBusMessage * message,
389 AtkTable *table = (AtkTable *) user_data;
390 gint *selected_columns = NULL;
394 g_return_val_if_fail (ATK_IS_TABLE (user_data),
395 droute_not_yet_handled_error (message));
396 count = atk_table_get_selected_columns (table, &selected_columns);
397 if (!selected_columns)
399 reply = dbus_message_new_method_return (message);
402 /* tbd - figure out if this is safe for a 0-length array */
403 dbus_message_append_args (reply, DBUS_TYPE_ARRAY, DBUS_TYPE_INT32,
404 &selected_columns, count, DBUS_TYPE_INVALID);
406 if (selected_columns)
407 g_free (selected_columns);
412 impl_IsRowSelected (DBusConnection * bus, DBusMessage * message,
415 AtkTable *table = (AtkTable *) user_data;
421 g_return_val_if_fail (ATK_IS_TABLE (user_data),
422 droute_not_yet_handled_error (message));
423 dbus_error_init (&error);
424 if (!dbus_message_get_args
425 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
427 return droute_invalid_arguments_error (message);
429 ret = atk_table_is_row_selected (table, row);
430 reply = dbus_message_new_method_return (message);
433 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
440 impl_IsColumnSelected (DBusConnection * bus, DBusMessage * message,
443 AtkTable *table = (AtkTable *) user_data;
449 g_return_val_if_fail (ATK_IS_TABLE (user_data),
450 droute_not_yet_handled_error (message));
451 dbus_error_init (&error);
452 if (!dbus_message_get_args
453 (message, &error, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
455 return droute_invalid_arguments_error (message);
457 ret = atk_table_is_column_selected (table, column);
458 reply = dbus_message_new_method_return (message);
461 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
468 impl_IsSelected (DBusConnection * bus, DBusMessage * message, void *user_data)
470 AtkTable *table = (AtkTable *) user_data;
471 dbus_int32_t row, column;
476 g_return_val_if_fail (ATK_IS_TABLE (user_data),
477 droute_not_yet_handled_error (message));
478 dbus_error_init (&error);
479 if (!dbus_message_get_args
480 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
483 return droute_invalid_arguments_error (message);
485 ret = atk_table_is_selected (table, row, column);
486 reply = dbus_message_new_method_return (message);
489 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
496 impl_AddRowSelection (DBusConnection * bus, DBusMessage * message,
499 AtkTable *table = (AtkTable *) user_data;
505 g_return_val_if_fail (ATK_IS_TABLE (user_data),
506 droute_not_yet_handled_error (message));
507 dbus_error_init (&error);
508 if (!dbus_message_get_args
509 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
511 return droute_invalid_arguments_error (message);
513 ret = atk_table_add_row_selection (table, row);
514 reply = dbus_message_new_method_return (message);
517 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
524 impl_AddColumnSelection (DBusConnection * bus, DBusMessage * message,
527 AtkTable *table = (AtkTable *) user_data;
533 g_return_val_if_fail (ATK_IS_TABLE (user_data),
534 droute_not_yet_handled_error (message));
535 dbus_error_init (&error);
536 if (!dbus_message_get_args
537 (message, &error, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
539 return droute_invalid_arguments_error (message);
541 ret = atk_table_add_column_selection (table, column);
542 reply = dbus_message_new_method_return (message);
545 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
552 impl_RemoveRowSelection (DBusConnection * bus, DBusMessage * message,
555 AtkTable *table = (AtkTable *) user_data;
561 g_return_val_if_fail (ATK_IS_TABLE (user_data),
562 droute_not_yet_handled_error (message));
563 dbus_error_init (&error);
564 if (!dbus_message_get_args
565 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
567 return droute_invalid_arguments_error (message);
569 ret = atk_table_remove_row_selection (table, row);
570 reply = dbus_message_new_method_return (message);
573 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
580 impl_RemoveColumnSelection (DBusConnection * bus, DBusMessage * message,
583 AtkTable *table = (AtkTable *) user_data;
589 g_return_val_if_fail (ATK_IS_TABLE (user_data),
590 droute_not_yet_handled_error (message));
591 dbus_error_init (&error);
592 if (!dbus_message_get_args
593 (message, &error, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
595 return droute_invalid_arguments_error (message);
597 ret = atk_table_remove_column_selection (table, column);
598 reply = dbus_message_new_method_return (message);
601 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
608 impl_GetRowColumnExtentsAtIndex (DBusConnection * bus, DBusMessage * message,
611 AtkTable *table = (AtkTable *) user_data;
614 dbus_int32_t row, column, row_extents, col_extents;
615 dbus_bool_t is_selected;
622 g_return_val_if_fail (ATK_IS_TABLE (user_data),
623 droute_not_yet_handled_error (message));
624 dbus_error_init (&error);
625 if (!dbus_message_get_args
626 (message, &error, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
628 return droute_invalid_arguments_error (message);
630 column = atk_table_get_column_at_index (table, index);
631 row = atk_table_get_row_at_index (table, index);
632 row_extents = atk_table_get_row_extent_at (table, row, column);
633 col_extents = atk_table_get_column_extent_at (table, row, column);
634 is_selected = atk_table_is_selected (table, row, column);
635 cell = atk_table_ref_at (table, row, column);
636 role = atk_object_get_role (cell);
637 g_object_unref (cell);
638 ret = (role == ATK_ROLE_TABLE_CELL ? TRUE : FALSE);
639 reply = dbus_message_new_method_return (message);
642 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
643 DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32,
644 &column, DBUS_TYPE_INT32, &row_extents,
645 DBUS_TYPE_INT32, &col_extents,
646 DBUS_TYPE_BOOLEAN, &is_selected,
652 static DRouteMethod methods[] = {
653 {impl_GetAccessibleAt, "GetAccessibleAt"},
654 {impl_GetIndexAt, "GetIndexAt"},
655 {impl_GetRowAtIndex, "GetRowAtIndex"},
656 {impl_GetColumnAtIndex, "GetColumnAtIndex"},
657 {impl_GetRowDescription, "GetRowDescription"},
658 {impl_GetColumnDescription, "GetColumnDescription"},
659 {impl_GetRowExtentAt, "GetRowExtentAt"},
660 {impl_GetColumnExtentAt, "GetColumnExtentAt"},
661 {impl_GetRowHeader, "GetRowHeader"},
662 {impl_GetColumnHeader, "GetColumnHeader"},
663 {impl_GetSelectedRows, "GetSelectedRows"},
664 {impl_GetSelectedColumns, "GetSelectedColumns"},
665 {impl_IsRowSelected, "IsRowSelected"},
666 {impl_IsColumnSelected, "IsColumnSelected"},
667 {impl_IsSelected, "IsSelected"},
668 {impl_AddRowSelection, "AddRowSelection"},
669 {impl_AddColumnSelection, "AddColumnSelection"},
670 {impl_RemoveRowSelection, "RemoveRowSelection"},
671 {impl_RemoveColumnSelection, "RemoveColumnSelection"},
672 {impl_GetRowColumnExtentsAtIndex, "GetRowColumnExtentsAtIndex"},
676 static DRouteProperty properties[] = {
677 {impl_get_NRows, NULL, "NRows"},
678 {impl_get_NColumns, NULL, "NColumns"},
679 {impl_get_Caption, NULL, "Caption"},
680 {impl_get_Summary, NULL, "Summary"},
681 {impl_get_NSelectedRows, NULL, "nSelectedRows"},
682 {impl_get_NSelectedColumns, NULL, "nSelectedColumns"},
687 spi_initialize_table (DRoutePath * path)
689 droute_path_add_interface (path,
690 SPI_DBUS_INTERFACE_TABLE, methods, properties);