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 "common/spi-dbus.h"
30 #include "introspection.h"
33 impl_get_NRows (DBusMessageIter * iter, void *user_data)
35 AtkTable *table = (AtkTable *) user_data;
36 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
37 return droute_return_v_int32 (iter, atk_table_get_n_rows (table));
41 impl_get_NColumns (DBusMessageIter * iter, void *user_data)
43 AtkTable *table = (AtkTable *) user_data;
44 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
45 return droute_return_v_int32 (iter, atk_table_get_n_columns (table));
49 impl_get_Caption (DBusMessageIter * iter, void *user_data)
51 AtkTable *table = (AtkTable *) user_data;
52 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
53 spi_object_append_v_reference (iter, atk_table_get_caption (table));
58 impl_get_Summary (DBusMessageIter * iter, void *user_data)
60 AtkTable *table = (AtkTable *) user_data;
61 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
62 spi_object_append_v_reference (iter, atk_table_get_summary (table));
67 impl_get_NSelectedRows (DBusMessageIter * iter, void *user_data)
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, void *user_data)
82 AtkTable *table = (AtkTable *) user_data;
83 gint *selected_columns = NULL;
85 g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
86 count = atk_table_get_selected_columns (table, &selected_columns);
88 g_free (selected_columns);
89 return droute_return_v_int32 (iter, count);
93 impl_GetAccessibleAt (DBusConnection * bus, DBusMessage * message,
96 AtkTable *table = (AtkTable *) user_data;
97 dbus_int32_t row, column;
101 g_return_val_if_fail (ATK_IS_TABLE (user_data),
102 droute_not_yet_handled_error (message));
103 dbus_error_init (&error);
104 if (!dbus_message_get_args
105 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
108 return droute_invalid_arguments_error (message);
110 obj = atk_table_ref_at (table, row, column);
111 return spi_object_return_reference (message, obj);
115 impl_GetIndexAt (DBusConnection * bus, DBusMessage * message, void *user_data)
117 AtkTable *table = (AtkTable *) user_data;
118 dbus_int32_t row, column;
123 g_return_val_if_fail (ATK_IS_TABLE (user_data),
124 droute_not_yet_handled_error (message));
125 dbus_error_init (&error);
126 if (!dbus_message_get_args
127 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
130 return droute_invalid_arguments_error (message);
132 index = atk_table_get_index_at (table, row, column);
133 reply = dbus_message_new_method_return (message);
136 dbus_message_append_args (reply, DBUS_TYPE_INT32, &index,
143 impl_GetRowAtIndex (DBusConnection * bus, DBusMessage * message,
146 AtkTable *table = (AtkTable *) user_data;
152 g_return_val_if_fail (ATK_IS_TABLE (user_data),
153 droute_not_yet_handled_error (message));
154 dbus_error_init (&error);
155 if (!dbus_message_get_args
156 (message, &error, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
158 return droute_invalid_arguments_error (message);
160 row = atk_table_get_row_at_index (table, index);
161 reply = dbus_message_new_method_return (message);
164 dbus_message_append_args (reply, DBUS_TYPE_INT32, &row,
171 impl_GetColumnAtIndex (DBusConnection * bus, DBusMessage * message,
174 AtkTable *table = (AtkTable *) user_data;
180 g_return_val_if_fail (ATK_IS_TABLE (user_data),
181 droute_not_yet_handled_error (message));
182 dbus_error_init (&error);
183 if (!dbus_message_get_args
184 (message, &error, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
186 return droute_invalid_arguments_error (message);
188 column = atk_table_get_column_at_index (table, index);
189 reply = dbus_message_new_method_return (message);
192 dbus_message_append_args (reply, DBUS_TYPE_INT32, &column,
199 impl_GetRowDescription (DBusConnection * bus, DBusMessage * message,
203 AtkTable *table = (AtkTable *) user_data;
204 const gchar *description;
208 g_return_val_if_fail (ATK_IS_TABLE (user_data),
209 droute_not_yet_handled_error (message));
210 dbus_error_init (&error);
211 if (!dbus_message_get_args
212 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
214 return droute_invalid_arguments_error (message);
216 description = atk_table_get_row_description (table, row);
219 reply = dbus_message_new_method_return (message);
222 dbus_message_append_args (reply, DBUS_TYPE_STRING, &description,
229 impl_GetColumnDescription (DBusConnection * bus, DBusMessage * message,
232 AtkTable *table = (AtkTable *) user_data;
234 const char *description;
238 g_return_val_if_fail (ATK_IS_TABLE (user_data),
239 droute_not_yet_handled_error (message));
240 dbus_error_init (&error);
241 if (!dbus_message_get_args
242 (message, &error, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
244 return droute_invalid_arguments_error (message);
246 description = atk_table_get_column_description (table, column);
249 reply = dbus_message_new_method_return (message);
252 dbus_message_append_args (reply, DBUS_TYPE_STRING, &description,
259 impl_GetRowExtentAt (DBusConnection * bus, DBusMessage * message,
262 AtkTable *table = (AtkTable *) user_data;
263 dbus_int32_t row, column;
268 g_return_val_if_fail (ATK_IS_TABLE (user_data),
269 droute_not_yet_handled_error (message));
270 dbus_error_init (&error);
271 if (!dbus_message_get_args
272 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
275 return droute_invalid_arguments_error (message);
277 extent = atk_table_get_row_extent_at (table, row, column);
278 reply = dbus_message_new_method_return (message);
281 dbus_message_append_args (reply, DBUS_TYPE_INT32, &extent,
288 impl_GetColumnExtentAt (DBusConnection * bus, DBusMessage * message,
291 AtkTable *table = (AtkTable *) user_data;
292 dbus_int32_t row, column;
297 g_return_val_if_fail (ATK_IS_TABLE (user_data),
298 droute_not_yet_handled_error (message));
299 dbus_error_init (&error);
300 if (!dbus_message_get_args
301 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
304 return droute_invalid_arguments_error (message);
306 extent = atk_table_get_column_extent_at (table, row, column);
307 reply = dbus_message_new_method_return (message);
310 dbus_message_append_args (reply, DBUS_TYPE_INT32, &extent,
317 impl_GetRowHeader (DBusConnection * bus, DBusMessage * message,
320 AtkTable *table = (AtkTable *) user_data;
323 AtkObject *obj = NULL;
325 g_return_val_if_fail (ATK_IS_TABLE (user_data),
326 droute_not_yet_handled_error (message));
327 dbus_error_init (&error);
328 if (!dbus_message_get_args
329 (message, &error, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
331 return droute_invalid_arguments_error (message);
333 obj = atk_table_get_row_header (table, row);
334 return spi_object_return_reference (message, obj);
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_object_return_reference (message, obj);
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, spi_org_freedesktop_atspi_Table, methods, properties);