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 "spi-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,
69 AtkTable *table = (AtkTable *) user_data;
70 gint *selected_rows = NULL;
72 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
73 count = atk_table_get_selected_rows (table, &selected_rows);
75 g_free (selected_rows);
76 return droute_return_v_int32 (iter, count);
80 impl_get_nSelectedColumns (DBusMessageIter * iter,
83 AtkTable *table = (AtkTable *) user_data;
84 gint *selected_columns = NULL;
86 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
87 count = atk_table_get_selected_columns (table, &selected_columns);
89 g_free (selected_columns);
90 return droute_return_v_int32 (iter, count);
94 impl_getAccessibleAt (DBusConnection * bus, DBusMessage * message,
97 AtkTable *table = (AtkTable *) user_data;
98 dbus_int32_t row, column;
102 g_return_val_if_fail (ATK_IS_TABLE (user_data),
103 droute_not_yet_handled_error (message));
104 dbus_error_init (&error);
105 if (!dbus_message_get_args
106 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
109 return droute_invalid_arguments_error (message);
111 obj = atk_table_ref_at (table, row, column);
112 return spi_dbus_return_object (message, obj, TRUE);
116 impl_getIndexAt (DBusConnection * bus, DBusMessage * message, void *user_data)
118 AtkTable *table = (AtkTable *) user_data;
119 dbus_int32_t row, column;
124 g_return_val_if_fail (ATK_IS_TABLE (user_data),
125 droute_not_yet_handled_error (message));
126 dbus_error_init (&error);
127 if (!dbus_message_get_args
128 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
131 return droute_invalid_arguments_error (message);
133 index = atk_table_get_index_at (table, row, column);
134 reply = dbus_message_new_method_return (message);
137 dbus_message_append_args (reply, DBUS_TYPE_INT32, &index,
144 impl_getRowAtIndex (DBusConnection * bus, DBusMessage * message,
147 AtkTable *table = (AtkTable *) user_data;
153 g_return_val_if_fail (ATK_IS_TABLE (user_data),
154 droute_not_yet_handled_error (message));
155 dbus_error_init (&error);
156 if (!dbus_message_get_args
157 (message, &error, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
159 return droute_invalid_arguments_error (message);
161 row = atk_table_get_row_at_index (table, index);
162 reply = dbus_message_new_method_return (message);
165 dbus_message_append_args (reply, DBUS_TYPE_INT32, &row,
172 impl_getColumnAtIndex (DBusConnection * bus, DBusMessage * message,
175 AtkTable *table = (AtkTable *) user_data;
181 g_return_val_if_fail (ATK_IS_TABLE (user_data),
182 droute_not_yet_handled_error (message));
183 dbus_error_init (&error);
184 if (!dbus_message_get_args
185 (message, &error, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
187 return droute_invalid_arguments_error (message);
189 column = atk_table_get_column_at_index (table, index);
190 reply = dbus_message_new_method_return (message);
193 dbus_message_append_args (reply, DBUS_TYPE_INT32, &column,
200 impl_getRowDescription (DBusConnection * bus, DBusMessage * message,
204 AtkTable *table = (AtkTable *) user_data;
205 const gchar *description;
209 g_return_val_if_fail (ATK_IS_TABLE (user_data),
210 droute_not_yet_handled_error (message));
211 dbus_error_init (&error);
212 if (!dbus_message_get_args
213 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
215 return droute_invalid_arguments_error (message);
217 description = atk_table_get_row_description (table, row);
220 reply = dbus_message_new_method_return (message);
223 dbus_message_append_args (reply, DBUS_TYPE_STRING, &description,
230 impl_getColumnDescription (DBusConnection * bus, DBusMessage * message,
233 AtkTable *table = (AtkTable *) user_data;
235 const char *description;
239 g_return_val_if_fail (ATK_IS_TABLE (user_data),
240 droute_not_yet_handled_error (message));
241 dbus_error_init (&error);
242 if (!dbus_message_get_args
243 (message, &error, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
245 return droute_invalid_arguments_error (message);
247 description = atk_table_get_column_description (table, column);
250 reply = dbus_message_new_method_return (message);
253 dbus_message_append_args (reply, DBUS_TYPE_STRING, &description,
260 impl_getRowExtentAt (DBusConnection * bus, DBusMessage * message,
263 AtkTable *table = (AtkTable *) user_data;
264 dbus_int32_t row, column;
269 g_return_val_if_fail (ATK_IS_TABLE (user_data),
270 droute_not_yet_handled_error (message));
271 dbus_error_init (&error);
272 if (!dbus_message_get_args
273 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
276 return droute_invalid_arguments_error (message);
278 extent = atk_table_get_row_extent_at (table, row, column);
279 reply = dbus_message_new_method_return (message);
282 dbus_message_append_args (reply, DBUS_TYPE_INT32, &extent,
289 impl_getColumnExtentAt (DBusConnection * bus, DBusMessage * message,
292 AtkTable *table = (AtkTable *) user_data;
293 dbus_int32_t row, column;
298 g_return_val_if_fail (ATK_IS_TABLE (user_data),
299 droute_not_yet_handled_error (message));
300 dbus_error_init (&error);
301 if (!dbus_message_get_args
302 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
305 return droute_invalid_arguments_error (message);
307 extent = atk_table_get_column_extent_at (table, row, column);
308 reply = dbus_message_new_method_return (message);
311 dbus_message_append_args (reply, DBUS_TYPE_INT32, &extent,
318 impl_getRowHeader (DBusConnection * bus, DBusMessage * message,
321 AtkTable *table = (AtkTable *) user_data;
326 g_return_val_if_fail (ATK_IS_TABLE (user_data),
327 droute_not_yet_handled_error (message));
328 dbus_error_init (&error);
329 if (!dbus_message_get_args
330 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
332 return droute_invalid_arguments_error (message);
334 obj = atk_table_get_row_header (table, row);
335 return spi_dbus_return_object (message, obj, FALSE);
339 impl_getColumnHeader (DBusConnection * bus, DBusMessage * message,
342 AtkTable *table = (AtkTable *) user_data;
347 g_return_val_if_fail (ATK_IS_TABLE (user_data),
348 droute_not_yet_handled_error (message));
349 dbus_error_init (&error);
350 if (!dbus_message_get_args
351 (message, &error, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
353 return droute_invalid_arguments_error (message);
355 obj = atk_table_get_column_header (table, column);
356 return spi_dbus_return_object (message, obj, 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_INT32, row, DBUS_TYPE_INT32,
643 column, DBUS_TYPE_INT32, row_extents,
644 DBUS_TYPE_INT32, col_extents,
645 DBUS_TYPE_BOOLEAN, is_selected,
646 DBUS_TYPE_BOOLEAN, &ret, DBUS_TYPE_INVALID);
651 static DRouteMethod methods[] = {
652 {impl_getAccessibleAt, "getAccessibleAt"},
653 {impl_getIndexAt, "getIndexAt"},
654 {impl_getRowAtIndex, "getRowAtIndex"},
655 {impl_getColumnAtIndex, "getColumnAtIndex"},
656 {impl_getRowDescription, "getRowDescription"},
657 {impl_getColumnDescription, "getColumnDescription"},
658 {impl_getRowExtentAt, "getRowExtentAt"},
659 {impl_getColumnExtentAt, "getColumnExtentAt"},
660 {impl_getRowHeader, "getRowHeader"},
661 {impl_getColumnHeader, "getColumnHeader"},
662 {impl_getSelectedRows, "getSelectedRows"},
663 {impl_getSelectedColumns, "getSelectedColumns"},
664 {impl_isRowSelected, "isRowSelected"},
665 {impl_isColumnSelected, "isColumnSelected"},
666 {impl_isSelected, "isSelected"},
667 {impl_addRowSelection, "addRowSelection"},
668 {impl_addColumnSelection, "addColumnSelection"},
669 {impl_removeRowSelection, "removeRowSelection"},
670 {impl_removeColumnSelection, "removeColumnSelection"},
671 {impl_getRowColumnExtentsAtIndex, "getRowColumnExtentsAtIndex"},
675 static DRouteProperty properties[] = {
676 {impl_get_nRows, NULL, "nRows"},
677 {impl_get_nColumns, NULL, "nColumns"},
678 {impl_get_caption, NULL, "caption"},
679 {impl_get_summary, NULL, "summary"},
680 {impl_get_nSelectedRows, NULL, "nSelectedRows"},
681 {impl_get_nSelectedColumns, NULL, "nSelectedColumns"},
686 spi_initialize_table (DRoutePath *path)
688 droute_path_add_interface (path,
689 SPI_DBUS_INTERFACE_TABLE,