1
/*
2
 * AT-SPI - Assistive Technology Service Provider Interface
3
 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
4
 *
5
 * Copyright 2013 SUSE LLC.
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 <atk/atk.h>
26
#include <droute/droute.h>
27

            
28
#include "spi-dbus.h"
29

            
30
#include "introspection.h"
31
#include "object.h"
32

            
33
static dbus_bool_t
34
3
impl_get_ColumnSpan (DBusMessageIter *iter, void *user_data)
35
{
36
3
  AtkTableCell *cell = (AtkTableCell *) user_data;
37
3
  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data), FALSE);
38
3
  return droute_return_v_int32 (iter, atk_table_cell_get_column_span (cell));
39
}
40

            
41
static DBusMessage *
42
message_from_object_array (DBusMessage *message, GPtrArray *array)
43
{
44
  DBusMessage *reply;
45
  DBusMessageIter iter, iter_array;
46
  gint len;
47
  gint i;
48

            
49
  reply = dbus_message_new_method_return (message);
50
  if (!reply)
51
    return NULL;
52

            
53
  dbus_message_iter_init_append (reply, &iter);
54

            
55
  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(so)", &iter_array))
56
    return reply; /* TODO: handle out of memory */
57
  len = (array ? array->len : 0);
58
  for (i = 0; i < len; i++)
59
    {
60
      spi_object_append_reference (&iter_array, g_ptr_array_index (array, i));
61
    }
62
  dbus_message_iter_close_container (&iter, &iter_array);
63
  if (array)
64
    g_ptr_array_unref (array);
65
  return reply;
66
}
67

            
68
static DBusMessage *
69
impl_GetColumnHeaderCells (DBusConnection *bus, DBusMessage *message, void *user_data)
70
{
71
  AtkTableCell *cell = user_data;
72
  GPtrArray *array;
73

            
74
  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data),
75
                        droute_not_yet_handled_error (message));
76

            
77
  array = atk_table_cell_get_column_header_cells (cell);
78
  return message_from_object_array (message, array);
79
}
80

            
81
static dbus_bool_t
82
1
impl_get_RowSpan (DBusMessageIter *iter, void *user_data)
83
{
84
1
  AtkTableCell *cell = (AtkTableCell *) user_data;
85
1
  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data), FALSE);
86
1
  return droute_return_v_int32 (iter, atk_table_cell_get_row_span (cell));
87
}
88

            
89
static DBusMessage *
90
impl_GetRowHeaderCells (DBusConnection *bus, DBusMessage *message, void *user_data)
91
{
92
  AtkTableCell *cell = user_data;
93
  GPtrArray *array;
94

            
95
  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data),
96
                        droute_not_yet_handled_error (message));
97

            
98
  array = atk_table_cell_get_row_header_cells (cell);
99
  return message_from_object_array (message, array);
100
}
101

            
102
static dbus_bool_t
103
1
impl_get_Position (DBusMessageIter *iter, void *user_data)
104
{
105
1
  AtkTableCell *cell = (AtkTableCell *) user_data;
106
1
  gint row = -1, column = -1;
107
  DBusMessageIter iter_struct, iter_variant;
108

            
109
1
  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data), FALSE);
110
1
  if (!atk_table_cell_get_position (cell, &row, &column))
111
    return FALSE;
112

            
113
1
  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(ii)", &iter_variant);
114
1
  dbus_message_iter_open_container (&iter_variant, DBUS_TYPE_STRUCT, NULL, &iter_struct);
115
1
  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, (dbus_int32_t *) &row);
116
1
  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, (dbus_int32_t *) &column);
117
1
  dbus_message_iter_close_container (&iter_variant, &iter_struct);
118
1
  dbus_message_iter_close_container (iter, &iter_variant);
119
1
  return TRUE;
120
}
121

            
122
static dbus_bool_t
123
1
impl_get_Table (DBusMessageIter *iter, void *user_data)
124
{
125
1
  AtkTableCell *cell = (AtkTableCell *) user_data;
126
  AtkObject *table;
127
  DBusMessageIter iter_variant;
128

            
129
1
  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data), FALSE);
130

            
131
1
  table = atk_table_cell_get_table (cell);
132
1
  if (!table)
133
    return FALSE;
134
1
  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(so)", &iter_variant);
135
1
  spi_object_append_reference (&iter_variant, table);
136
1
  dbus_message_iter_close_container (iter, &iter_variant);
137
1
  return TRUE;
138
}
139

            
140
static DBusMessage *
141
1
impl_GetRowColumnSpan (DBusConnection *bus, DBusMessage *message, void *user_data)
142
{
143
1
  AtkTableCell *cell = (AtkTableCell *) user_data;
144
  gint row, column, row_span, column_span;
145
  dbus_int32_t d_row, d_column, d_row_span, d_column_span;
146
  DBusMessage *reply;
147

            
148
1
  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data),
149
                        droute_not_yet_handled_error (message));
150
1
  atk_table_cell_get_row_column_span (cell, &row, &column, &row_span,
151
                                      &column_span);
152
1
  d_row = row;
153
1
  d_column = column;
154
1
  d_row_span = row_span;
155
1
  d_column_span = column_span;
156
1
  reply = dbus_message_new_method_return (message);
157
1
  if (reply)
158
    {
159
1
      dbus_message_append_args (reply, DBUS_TYPE_INT32, &d_row, DBUS_TYPE_INT32,
160
                                &d_column, DBUS_TYPE_INT32, &d_row_span,
161
                                DBUS_TYPE_INT32, &d_column_span,
162
                                DBUS_TYPE_INVALID);
163
    }
164
1
  return reply;
165
}
166

            
167
static DRouteMethod methods[] = {
168
  { impl_GetRowHeaderCells, "GetRowHeaderCells" },
169
  { impl_GetColumnHeaderCells, "GetColumnHeaderCells" },
170
  { impl_GetRowColumnSpan, "GetRowColumnSpan" },
171
  { NULL, NULL }
172
};
173

            
174
static DRouteProperty properties[] = {
175
  { impl_get_ColumnSpan, NULL, "ColumnSpan" },
176
  { impl_get_Position, NULL, "Position" },
177
  { impl_get_RowSpan, NULL, "RowSpan" },
178
  { impl_get_Table, NULL, "Table" },
179
  { NULL, NULL, NULL }
180
};
181

            
182
void
183
161
spi_initialize_table_cell (DRoutePath *path)
184
{
185
161
  droute_path_add_interface (path,
186
                             ATSPI_DBUS_INTERFACE_TABLE_CELL,
187
                             spi_org_a11y_atspi_TableCell,
188
                             methods, properties);
189
161
};