#include <atk/atk.h>
#include <droute/droute.h>
-#include "common/spi-dbus.h"
+#include "spi-dbus.h"
#include "object.h"
#include "introspection.h"
{
AtkTable *table = (AtkTable *) user_data;
dbus_int32_t row, column;
+ DBusMessage *reply;
DBusError error;
AtkObject *obj;
return droute_invalid_arguments_error (message);
}
obj = atk_table_ref_at (table, row, column);
- return spi_object_return_reference (message, obj, TRUE);
+ reply = spi_object_return_reference (message, obj);
+ if (obj)
+ g_object_unref (obj);
+
+ return reply;
}
static DBusMessage *
return reply;
}
+static const gchar *
+validate_unallocated_string (const gchar *str)
+{
+ if (!str)
+ return "";
+ if (!g_utf8_validate (str, -1, NULL))
+ {
+ g_warning ("atk-bridge: received bad UTF-8 string from a table function");
+ return "";
+ }
+ return str;
+}
+
static DBusMessage *
impl_GetRowDescription (DBusConnection * bus, DBusMessage * message,
void *user_data)
return droute_invalid_arguments_error (message);
}
description = atk_table_get_row_description (table, row);
- if (!description)
- description = "";
+ description = validate_unallocated_string (description);
reply = dbus_message_new_method_return (message);
if (reply)
{
return droute_invalid_arguments_error (message);
}
description = atk_table_get_column_description (table, column);
- if (!description)
- description = "";
+ description = validate_unallocated_string (description);
reply = dbus_message_new_method_return (message);
if (reply)
{
return droute_invalid_arguments_error (message);
}
obj = atk_table_get_row_header (table, row);
- return spi_object_return_reference (message, obj, FALSE);
+ return spi_object_return_reference (message, obj);
}
static DBusMessage *
return droute_invalid_arguments_error (message);
}
obj = atk_table_get_column_header (table, column);
- return spi_object_return_reference (message, obj, FALSE);
+ return spi_object_return_reference (message, obj);
}
static DBusMessage *
dbus_bool_t is_selected;
dbus_bool_t ret;
DBusMessage *reply;
-
AtkObject *cell;
- AtkRole role;
+ AtkRole role = ATK_ROLE_INVALID;
g_return_val_if_fail (ATK_IS_TABLE (user_data),
droute_not_yet_handled_error (message));
col_extents = atk_table_get_column_extent_at (table, row, column);
is_selected = atk_table_is_selected (table, row, column);
cell = atk_table_ref_at (table, row, column);
- role = atk_object_get_role (cell);
- g_object_unref (cell);
+ if (cell)
+ {
+ role = atk_object_get_role (cell);
+ g_object_unref (cell);
+ }
ret = (role == ATK_ROLE_TABLE_CELL ? TRUE : FALSE);
reply = dbus_message_new_method_return (message);
if (reply)
spi_initialize_table (DRoutePath * path)
{
droute_path_add_interface (path,
- SPI_DBUS_INTERFACE_TABLE, spi_org_a11y_atspi_Table, methods, properties);
+ ATSPI_DBUS_INTERFACE_TABLE, spi_org_a11y_atspi_Table, methods, properties);
};