Initial commit.
[platform/core/uifw/at-spi2-atk.git] / libspi / accessible.c
index ad7084f..df18012 100644 (file)
@@ -2,6 +2,7 @@
  * AT-SPI - Assistive Technology Service Provider Interface
  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
  *
+ * Copyright 2008 Novell, Inc.
  * Copyright 2001, 2002 Sun Microsystems Inc.,
  * Copyright 2001, 2002 Ximian, Inc.
  *
  * Boston, MA 02111-1307, USA.
  */
 
-/* accessible.c: the core of the accessibility implementation */
+#include "accessible.h"
+#include "bitarray.h"
 
-#include <config.h>
-#include <stdio.h>
-#include <bonobo/bonobo-exception.h>
-#include <atk/atk.h>
-#include <libspi/libspi.h>
-#include "spi-private.h"
+#define get_object(message) spi_dbus_get_object(dbus_message_get_path(message))
 
-/* Our parent Gtk object type  */
-#define PARENT_TYPE SPI_TYPE_BASE
-
-static gboolean spi_init_role_lookup_table (Accessibility_Role *role_table);
-Accessibility_Role spi_accessible_role_from_atk_role (AtkRole role);
-
-static gboolean
-spi_init_role_lookup_table (Accessibility_Role *role_table)
+static AtkObject *
+get_object_from_path (const char *path, void *user_data)
 {
-  int i;
-  /* if it's not in the list below, dunno what it is */
-  for (i = 0; i < ATK_ROLE_LAST_DEFINED; ++i)
-    {
-      role_table [i] = Accessibility_ROLE_UNKNOWN;
-    }
-  
-  role_table [ATK_ROLE_INVALID] =             Accessibility_ROLE_INVALID;
-  role_table [ATK_ROLE_ACCEL_LABEL] =         Accessibility_ROLE_ACCELERATOR_LABEL;
-  role_table [ATK_ROLE_ALERT] =               Accessibility_ROLE_ALERT;
-  role_table [ATK_ROLE_ANIMATION] =           Accessibility_ROLE_ANIMATION; 
-  role_table [ATK_ROLE_ARROW] =               Accessibility_ROLE_ARROW; 
-  role_table [ATK_ROLE_CALENDAR] =            Accessibility_ROLE_CALENDAR; 
-  role_table [ATK_ROLE_CANVAS] =              Accessibility_ROLE_CANVAS;
-  role_table [ATK_ROLE_CHECK_BOX] =           Accessibility_ROLE_CHECK_BOX;
-  role_table [ATK_ROLE_CHECK_MENU_ITEM] =     Accessibility_ROLE_CHECK_MENU_ITEM;
-  role_table [ATK_ROLE_COLOR_CHOOSER] =       Accessibility_ROLE_COLOR_CHOOSER;
-  role_table [ATK_ROLE_COLUMN_HEADER] =       Accessibility_ROLE_COLUMN_HEADER;
-  role_table [ATK_ROLE_COMBO_BOX] =           Accessibility_ROLE_COMBO_BOX;
-  role_table [ATK_ROLE_DATE_EDITOR] =         Accessibility_ROLE_DATE_EDITOR;
-  role_table [ATK_ROLE_DESKTOP_ICON] =        Accessibility_ROLE_DESKTOP_ICON;
-  role_table [ATK_ROLE_DESKTOP_FRAME] =       Accessibility_ROLE_DESKTOP_FRAME;
-  role_table [ATK_ROLE_DIAL] =                Accessibility_ROLE_DIAL;
-  role_table [ATK_ROLE_DIALOG] =              Accessibility_ROLE_DIALOG;
-  role_table [ATK_ROLE_DIRECTORY_PANE] =      Accessibility_ROLE_DIRECTORY_PANE;
-  role_table [ATK_ROLE_DRAWING_AREA] =        Accessibility_ROLE_DRAWING_AREA;
-  role_table [ATK_ROLE_FILE_CHOOSER] =        Accessibility_ROLE_FILE_CHOOSER;
-  role_table [ATK_ROLE_FILLER] =              Accessibility_ROLE_FILLER;
-  role_table [ATK_ROLE_FONT_CHOOSER] =        Accessibility_ROLE_FONT_CHOOSER;
-  role_table [ATK_ROLE_FRAME] =               Accessibility_ROLE_FRAME;
-  role_table [ATK_ROLE_GLASS_PANE] =          Accessibility_ROLE_GLASS_PANE;
-  role_table [ATK_ROLE_HTML_CONTAINER] =      Accessibility_ROLE_HTML_CONTAINER;
-  role_table [ATK_ROLE_ICON] =                Accessibility_ROLE_ICON;
-  role_table [ATK_ROLE_IMAGE] =               Accessibility_ROLE_IMAGE; 
-  role_table [ATK_ROLE_INTERNAL_FRAME] =      Accessibility_ROLE_INTERNAL_FRAME; 
-  role_table [ATK_ROLE_LABEL] =               Accessibility_ROLE_LABEL;
-  role_table [ATK_ROLE_LAYERED_PANE] =        Accessibility_ROLE_LAYERED_PANE;
-  role_table [ATK_ROLE_LIST] =                Accessibility_ROLE_LIST;
-  role_table [ATK_ROLE_LIST_ITEM] =           Accessibility_ROLE_LIST_ITEM;
-  role_table [ATK_ROLE_MENU] =                Accessibility_ROLE_MENU;
-  role_table [ATK_ROLE_MENU_BAR] =            Accessibility_ROLE_MENU_BAR;
-  role_table [ATK_ROLE_MENU_ITEM] =           Accessibility_ROLE_MENU_ITEM;
-  role_table [ATK_ROLE_OPTION_PANE] =         Accessibility_ROLE_OPTION_PANE;
-  role_table [ATK_ROLE_PAGE_TAB] =            Accessibility_ROLE_PAGE_TAB;
-  role_table [ATK_ROLE_PAGE_TAB_LIST] =       Accessibility_ROLE_PAGE_TAB_LIST; 
-  role_table [ATK_ROLE_PANEL] =               Accessibility_ROLE_PANEL;
-  role_table [ATK_ROLE_PASSWORD_TEXT] =       Accessibility_ROLE_PASSWORD_TEXT;
-  role_table [ATK_ROLE_POPUP_MENU] =          Accessibility_ROLE_POPUP_MENU;
-  role_table [ATK_ROLE_PROGRESS_BAR] =        Accessibility_ROLE_PROGRESS_BAR;
-  role_table [ATK_ROLE_PUSH_BUTTON] =         Accessibility_ROLE_PUSH_BUTTON;
-  role_table [ATK_ROLE_RADIO_BUTTON] =        Accessibility_ROLE_RADIO_BUTTON;
-  role_table [ATK_ROLE_RADIO_MENU_ITEM] =     Accessibility_ROLE_RADIO_MENU_ITEM;
-  role_table [ATK_ROLE_ROOT_PANE] =           Accessibility_ROLE_ROOT_PANE;
-  role_table [ATK_ROLE_ROW_HEADER] =          Accessibility_ROLE_ROW_HEADER;
-  role_table [ATK_ROLE_SCROLL_BAR] =          Accessibility_ROLE_SCROLL_BAR;
-  role_table [ATK_ROLE_SCROLL_PANE] =         Accessibility_ROLE_SCROLL_PANE;
-  role_table [ATK_ROLE_SEPARATOR] =           Accessibility_ROLE_SEPARATOR;
-  role_table [ATK_ROLE_SLIDER] =              Accessibility_ROLE_SLIDER;
-  role_table [ATK_ROLE_SPIN_BUTTON] =         Accessibility_ROLE_SPIN_BUTTON;
-  role_table [ATK_ROLE_SPLIT_PANE] =          Accessibility_ROLE_SPLIT_PANE;
-  role_table [ATK_ROLE_STATUSBAR] =           Accessibility_ROLE_STATUS_BAR;
-  role_table [ATK_ROLE_TABLE] =               Accessibility_ROLE_TABLE;
-  role_table [ATK_ROLE_TABLE_CELL] =          Accessibility_ROLE_TABLE_CELL;
-  role_table [ATK_ROLE_TABLE_COLUMN_HEADER] = Accessibility_ROLE_TABLE_COLUMN_HEADER;
-  role_table [ATK_ROLE_TABLE_ROW_HEADER] =    Accessibility_ROLE_TABLE_ROW_HEADER;
-  role_table [ATK_ROLE_TEAR_OFF_MENU_ITEM] =  Accessibility_ROLE_TEAROFF_MENU_ITEM;
-  role_table [ATK_ROLE_TERMINAL] =            Accessibility_ROLE_TERMINAL;
-  role_table [ATK_ROLE_TEXT] =                Accessibility_ROLE_TEXT;
-  role_table [ATK_ROLE_TOGGLE_BUTTON] =       Accessibility_ROLE_TOGGLE_BUTTON;
-  role_table [ATK_ROLE_TOOL_BAR] =            Accessibility_ROLE_TOOL_BAR;
-  role_table [ATK_ROLE_TOOL_TIP] =            Accessibility_ROLE_TOOL_TIP;
-  role_table [ATK_ROLE_TREE] =                Accessibility_ROLE_TREE;
-  role_table [ATK_ROLE_TREE_TABLE] =          Accessibility_ROLE_TREE_TABLE;
-  role_table [ATK_ROLE_UNKNOWN] =             Accessibility_ROLE_UNKNOWN;
-  role_table [ATK_ROLE_VIEWPORT] =            Accessibility_ROLE_VIEWPORT;
-  role_table [ATK_ROLE_WINDOW] =              Accessibility_ROLE_WINDOW;
-  role_table [ATK_ROLE_HEADER] =              Accessibility_ROLE_HEADER;
-  role_table [ATK_ROLE_FOOTER] =              Accessibility_ROLE_FOOTER;
-  role_table [ATK_ROLE_PARAGRAPH] =           Accessibility_ROLE_PARAGRAPH;
-  role_table [ATK_ROLE_RULER] =               Accessibility_ROLE_RULER;
-  role_table [ATK_ROLE_APPLICATION] =         Accessibility_ROLE_APPLICATION;
-  role_table [ATK_ROLE_AUTOCOMPLETE] =        Accessibility_ROLE_AUTOCOMPLETE;
-  role_table [ATK_ROLE_EDITBAR] =             Accessibility_ROLE_EDITBAR;
-  role_table [ATK_ROLE_EMBEDDED] =            Accessibility_ROLE_EMBEDDED;
-  role_table [ATK_ROLE_ENTRY] =               Accessibility_ROLE_ENTRY;
-  role_table [ATK_ROLE_CHART] =               Accessibility_ROLE_CHART;
-  role_table [ATK_ROLE_CAPTION] =             Accessibility_ROLE_CAPTION;
-  role_table [ATK_ROLE_DOCUMENT_FRAME] =      Accessibility_ROLE_DOCUMENT_FRAME;
-  role_table [ATK_ROLE_HEADING] =             Accessibility_ROLE_HEADING;
-  role_table [ATK_ROLE_PAGE] =                Accessibility_ROLE_PAGE;
-  role_table [ATK_ROLE_SECTION] =             Accessibility_ROLE_SECTION;
-  role_table [ATK_ROLE_FORM] =                Accessibility_ROLE_FORM;
-  role_table [ATK_ROLE_REDUNDANT_OBJECT] =    Accessibility_ROLE_REDUNDANT_OBJECT;
-  role_table [ATK_ROLE_LINK] =                Accessibility_ROLE_LINK;
-  role_table [ATK_ROLE_INPUT_METHOD_WINDOW] = Accessibility_ROLE_INPUT_METHOD_WINDOW;
-  return TRUE;
+  return spi_dbus_get_object (path);
 }
 
-Accessibility_Role
-spi_accessible_role_from_atk_role (AtkRole role)
+static dbus_bool_t
+impl_get_name (const char *path, DBusMessageIter * iter, void *user_data)
 {
-  static gboolean is_initialized = FALSE;
-  static Accessibility_Role spi_role_table [ATK_ROLE_LAST_DEFINED];
-  Accessibility_Role spi_role;
-
-  if (!is_initialized)
-   {
-     is_initialized = spi_init_role_lookup_table (spi_role_table);        
-   }
-
-  if (role >= 0 && role < ATK_ROLE_LAST_DEFINED)
-    {
-      spi_role = spi_role_table [role];
-    }
-  else
-    {
-      spi_role = Accessibility_ROLE_EXTENDED;      
-    }
-  return spi_role;
+  AtkObject *object = spi_dbus_get_object (path);
+  if (!object)
+    return FALSE;
+  return droute_return_v_string (iter, atk_object_get_name (object));
 }
 
-static AtkObject *
-get_atkobject_from_servant (PortableServer_Servant servant)
+static char *
+impl_get_name_str (void *datum)
 {
-  SpiBase *object = SPI_BASE (bonobo_object_from_servant (servant));
-
-  g_return_val_if_fail (object, NULL);
-  g_return_val_if_fail (ATK_IS_OBJECT(object->gobj), NULL);
-  return ATK_OBJECT(object->gobj);
+  g_assert (ATK_IS_OBJECT (datum));
+  return g_strdup (atk_object_get_name ((AtkObject *) datum));
 }
 
-/*
- * CORBA Accessibility::Accessible::get_name method implementation
- */
-static CORBA_char *
-impl_accessibility_accessible_get_name (PortableServer_Servant servant,
-                                        CORBA_Environment     *ev)
+static dbus_bool_t
+impl_set_name (const char *path, DBusMessageIter * iter, void *user_data)
 {
-  const gchar *name;
-  CORBA_char  *retval;
-  AtkObject   *object = get_atkobject_from_servant (servant);
-
-  g_return_val_if_fail (object != NULL, CORBA_string_dup (""));
-
-  name = atk_object_get_name (object);
-
-  if (name)
-    {
-      retval = CORBA_string_dup (name);
-    }
-  else
-    {
-      retval = CORBA_string_dup ("");
-    }
-
-  return retval;
+  AtkObject *object = spi_dbus_get_object (path);
+  const char *name = droute_get_v_string (iter);
+  atk_object_set_name (object, name);
+  return TRUE;
 }
 
-/*
- * CORBA Accessibility::Accessible::set_name method implementation
- */
-static void
-impl_accessibility_accessible_set_name (PortableServer_Servant servant,
-                                        const CORBA_char      *name,
-                                        CORBA_Environment     *ev)
+static dbus_bool_t
+impl_get_description (const char *path, DBusMessageIter * iter,
+                     void *user_data)
 {
-  AtkObject *object = get_atkobject_from_servant (servant);
-
-  g_return_if_fail (object != NULL);
-
-  atk_object_set_name (object, name);
+  AtkObject *object = spi_dbus_get_object (path);
+  if (!object)
+    return FALSE;
+  return droute_return_v_string (iter, atk_object_get_description (object));
 }
 
-/*
- * CORBA Accessibility::Accessible::get_description method implementation
- */
-static CORBA_char *
-impl_accessibility_accessible_get_description (PortableServer_Servant servant,
-                                               CORBA_Environment     *ev)
+static char *
+impl_get_description_str (void *datum)
 {
-  const gchar *descr;
-  CORBA_char  *retval;
-  AtkObject   *object = get_atkobject_from_servant (servant);
-
-  g_return_val_if_fail (object != NULL, CORBA_string_dup (""));
-
-  descr = atk_object_get_description (object);
-
-  if (descr)
-    {
-      retval = CORBA_string_dup (descr);
-    }
-  else
-    {
-      retval = CORBA_string_dup ("");
-    }
-
-  return retval;
+  g_assert (ATK_IS_OBJECT (datum));
+  return g_strdup (atk_object_get_description ((AtkObject *) datum));
 }
 
-/*
- * CORBA Accessibility::Accessible::set_description method implementation
- */
-static void
-impl_accessibility_accessible_set_description (PortableServer_Servant servant,
-                                               const CORBA_char      *descr,
-                                               CORBA_Environment     *ev)
+static dbus_bool_t
+impl_set_description (const char *path, DBusMessageIter * iter,
+                     void *user_data)
 {
-  AtkObject *object = get_atkobject_from_servant (servant);
-
-  g_return_if_fail (object != NULL);
-
-  atk_object_set_description (object, descr);
+  AtkObject *object = spi_dbus_get_object (path);
+  const char *description = droute_get_v_string (iter);
+  atk_object_set_description (object, description);
+  return TRUE;
 }
 
-/*
- * CORBA Accessibility::Accessible::get_parent method implementation
- */
-static Accessibility_Accessible
-impl_accessibility_accessible_get_parent (PortableServer_Servant servant,
-                                          CORBA_Environment     *ev)
+static dbus_bool_t
+impl_get_parent (const char *path, DBusMessageIter * iter, void *user_data)
 {
-  AtkObject *parent;
-  AtkObject *object = get_atkobject_from_servant (servant);
-
-  g_return_val_if_fail (object != NULL, CORBA_OBJECT_NIL);
-
-  parent = atk_object_get_parent (object);
+  AtkObject *object = spi_dbus_get_object (path);
 
-  return spi_accessible_new_return (parent, FALSE, ev);
+  if (!object)
+    return FALSE;
+  return spi_dbus_return_v_object (iter, atk_object_get_parent (object),
+                                  FALSE);
 }
 
-/*
- * CORBA Accessibility::Accessible::get_IndexInParent method implementation
- */
-static CORBA_long
-impl_accessibility_accessible_get_index_in_parent (PortableServer_Servant servant,
-                                                   CORBA_Environment     *ev)
+static char *
+impl_get_parent_str (void *datum)
 {
-  AtkObject *object = get_atkobject_from_servant (servant);
+  g_assert (ATK_IS_OBJECT (datum));
+  return spi_dbus_get_path (atk_object_get_parent ((AtkObject *) datum));
+}
 
-  g_return_val_if_fail (object != NULL, -1);
+static dbus_bool_t
+impl_get_childCount (const char *path, DBusMessageIter * iter,
+                    void *user_data)
+{
+  AtkObject *object = spi_dbus_get_object (path);
 
-  return atk_object_get_index_in_parent (object);
+  if (!object)
+    return FALSE;
+  return droute_return_v_int32 (iter,
+                               atk_object_get_n_accessible_children
+                               (object));
 }
 
-/*
- * CORBA Accessibility::Accessible::get_childCount method implementation
- */
-static CORBA_long
-impl_accessibility_accessible_get_child_count (PortableServer_Servant servant,
-                                               CORBA_Environment     *ev)
+static char *
+impl_get_childCount_str (void *datum)
 {
-  AtkObject *object = get_atkobject_from_servant (servant);
-
-  g_return_val_if_fail (object != NULL, 0);
+  int count;
+  g_assert (ATK_IS_OBJECT (datum));
+  count = atk_object_get_n_accessible_children ((AtkObject *) datum);
+  return g_strdup_printf ("%d", count);
+}
 
-  return atk_object_get_n_accessible_children (object);
+#if 0
+static DBusMessage *
+impl_isEqual (DBusConnection * bus, DBusMessage * message, void *user_data)
+{
 }
+#endif
 
-/*
- * CORBA Accessibility::Accessible::getChildAtIndex method implementation
- */
-static Accessibility_Accessible
-impl_accessibility_accessible_get_child_at_index (PortableServer_Servant servant,
-                                                  const CORBA_long      index,
-                                                  CORBA_Environment     *ev)
+#if 0
+static DBusMessage *
+impl_getChildAtIndex (DBusConnection * bus, DBusMessage * message,
+                     void *user_data)
 {
+  AtkObject *object = get_object (message);
+  dbus_int32_t index;
+  DBusError error;
   AtkObject *child;
-  AtkObject *object = get_atkobject_from_servant (servant);
 
-  g_return_val_if_fail (object != NULL, CORBA_OBJECT_NIL);
-
-  child = atk_object_ref_accessible_child (object, index);
-
-  return spi_accessible_new_return (child, TRUE, ev);
+  if (!object)
+    return spi_dbus_general_error (message);
+  dbus_error_init (&error);
+  if (!dbus_message_get_args
+      (message, &error, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
+    {
+      return SPI_DBUS_RETURN_ERROR (message, &error);
+    }
+  child = atk_object_ref_accessible - child (object, index);
+  return spi_dbus_return_object (message, child, TRUE);
 }
+#endif
 
-/*
- * CORBA Accessibility::Accessible::getState method implementation
- */
-static Accessibility_StateSet
-impl_accessibility_accessible_get_state (PortableServer_Servant servant,
-                                        CORBA_Environment     *ev)
+static DBusMessage *
+impl_getChildren (DBusConnection * bus, DBusMessage * message,
+                 void *user_data)
 {
-  AtkObject *object = get_atkobject_from_servant (servant);
-  AtkStateSet *atk_set;
-  SpiStateSet *set;
-  Accessibility_StateSet retval;
-
-  bonobo_return_val_if_fail (object != NULL, NULL, ev);
-
-  atk_set = atk_object_ref_state_set (object);
-  
-  set = spi_state_set_new (atk_set);
-  retval = CORBA_Object_duplicate (
-                                 BONOBO_OBJREF(set),
-                                 NULL);
+  AtkObject *object = get_object (message);
+  gint i;
+  gint count;
+  DBusMessage *reply;
+  DBusMessageIter iter, iter_array;
+
+  if (!object)
+    return spi_dbus_general_error (message);
+  count = atk_object_get_n_accessible_children (object);
+  reply = dbus_message_new_method_return (message);
+  dbus_message_iter_init_append (reply, &iter);
+  if (!dbus_message_iter_open_container
+      (&iter, DBUS_TYPE_ARRAY, "o", &iter_array))
+    goto oom;
+  for (i = 0; i < count; i++)
+    {
+      AtkObject *child = atk_object_ref_accessible_child (object, i);
+      char *path = spi_dbus_get_path (child);
+      if (path)
+       {
+         dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_OBJECT_PATH,
+                                         &path);
+         g_free (path);
+       }
+      if (child)
+       g_object_unref (child);
+    }
+  if (!dbus_message_iter_close_container (&iter, &iter_array))
+    goto oom;
+  return reply;
+oom:
+  // TODO: handle out-of-memory
+  return reply;
+}
 
-  g_object_unref (atk_set);
+static DBusMessage *
+impl_getIndexInParent (DBusConnection * bus, DBusMessage * message,
+                      void *user_data)
+{
+  AtkObject *object = get_object (message);
+  dbus_uint32_t rv;
+  DBusMessage *reply;
+
+  if (!object)
+    return spi_dbus_general_error (message);
+  rv = atk_object_get_index_in_parent (object);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_UINT32, &rv,
+                               DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
 
-  return retval;
+#if 0
+static DBusMessage *
+impl_getRelationSet (DBusConnection * bus, DBusMessage * message,
+                    void *user_data)
+{
 }
+#endif
 
-/*
- * CORBA Accessibility::Accessible::getRelationSet method implementation
- */
-static Accessibility_RelationSet *
-impl_accessibility_accessible_get_relation_set (PortableServer_Servant servant,
-                                               CORBA_Environment     *ev)
+static gboolean
+spi_init_role_lookup_table (Accessibility_Role * role_table)
 {
-  Accessibility_RelationSet *retval;
-  gint n_relations = 0;
-  gint i;
-  AtkRelationSet *relation_set;
-  AtkObject      *object = get_atkobject_from_servant (servant);
+  int i;
+  /* if it's not in the list below, dunno what it is */
+  for (i = 0; i < ATK_ROLE_LAST_DEFINED; ++i)
+    {
+      role_table[i] = Accessibility_ROLE_UNKNOWN;
+    }
 
-  bonobo_return_val_if_fail (object != NULL, NULL, ev);
+  role_table[ATK_ROLE_INVALID] = Accessibility_ROLE_INVALID;
+  role_table[ATK_ROLE_ACCEL_LABEL] = Accessibility_ROLE_ACCELERATOR_LABEL;
+  role_table[ATK_ROLE_ALERT] = Accessibility_ROLE_ALERT;
+  role_table[ATK_ROLE_ANIMATION] = Accessibility_ROLE_ANIMATION;
+  role_table[ATK_ROLE_ARROW] = Accessibility_ROLE_ARROW;
+  role_table[ATK_ROLE_CALENDAR] = Accessibility_ROLE_CALENDAR;
+  role_table[ATK_ROLE_CANVAS] = Accessibility_ROLE_CANVAS;
+  role_table[ATK_ROLE_CHECK_BOX] = Accessibility_ROLE_CHECK_BOX;
+  role_table[ATK_ROLE_CHECK_MENU_ITEM] = Accessibility_ROLE_CHECK_MENU_ITEM;
+  role_table[ATK_ROLE_COLOR_CHOOSER] = Accessibility_ROLE_COLOR_CHOOSER;
+  role_table[ATK_ROLE_COLUMN_HEADER] = Accessibility_ROLE_COLUMN_HEADER;
+  role_table[ATK_ROLE_COMBO_BOX] = Accessibility_ROLE_COMBO_BOX;
+  role_table[ATK_ROLE_DATE_EDITOR] = Accessibility_ROLE_DATE_EDITOR;
+  role_table[ATK_ROLE_DESKTOP_ICON] = Accessibility_ROLE_DESKTOP_ICON;
+  role_table[ATK_ROLE_DESKTOP_FRAME] = Accessibility_ROLE_DESKTOP_FRAME;
+  role_table[ATK_ROLE_DIAL] = Accessibility_ROLE_DIAL;
+  role_table[ATK_ROLE_DIALOG] = Accessibility_ROLE_DIALOG;
+  role_table[ATK_ROLE_DIRECTORY_PANE] = Accessibility_ROLE_DIRECTORY_PANE;
+  role_table[ATK_ROLE_DRAWING_AREA] = Accessibility_ROLE_DRAWING_AREA;
+  role_table[ATK_ROLE_FILE_CHOOSER] = Accessibility_ROLE_FILE_CHOOSER;
+  role_table[ATK_ROLE_FILLER] = Accessibility_ROLE_FILLER;
+  role_table[ATK_ROLE_FONT_CHOOSER] = Accessibility_ROLE_FONT_CHOOSER;
+  role_table[ATK_ROLE_FRAME] = Accessibility_ROLE_FRAME;
+  role_table[ATK_ROLE_GLASS_PANE] = Accessibility_ROLE_GLASS_PANE;
+  role_table[ATK_ROLE_HTML_CONTAINER] = Accessibility_ROLE_HTML_CONTAINER;
+  role_table[ATK_ROLE_ICON] = Accessibility_ROLE_ICON;
+  role_table[ATK_ROLE_IMAGE] = Accessibility_ROLE_IMAGE;
+  role_table[ATK_ROLE_INTERNAL_FRAME] = Accessibility_ROLE_INTERNAL_FRAME;
+  role_table[ATK_ROLE_LABEL] = Accessibility_ROLE_LABEL;
+  role_table[ATK_ROLE_LAYERED_PANE] = Accessibility_ROLE_LAYERED_PANE;
+  role_table[ATK_ROLE_LIST] = Accessibility_ROLE_LIST;
+  role_table[ATK_ROLE_LIST_ITEM] = Accessibility_ROLE_LIST_ITEM;
+  role_table[ATK_ROLE_MENU] = Accessibility_ROLE_MENU;
+  role_table[ATK_ROLE_MENU_BAR] = Accessibility_ROLE_MENU_BAR;
+  role_table[ATK_ROLE_MENU_ITEM] = Accessibility_ROLE_MENU_ITEM;
+  role_table[ATK_ROLE_OPTION_PANE] = Accessibility_ROLE_OPTION_PANE;
+  role_table[ATK_ROLE_PAGE_TAB] = Accessibility_ROLE_PAGE_TAB;
+  role_table[ATK_ROLE_PAGE_TAB_LIST] = Accessibility_ROLE_PAGE_TAB_LIST;
+  role_table[ATK_ROLE_PANEL] = Accessibility_ROLE_PANEL;
+  role_table[ATK_ROLE_PASSWORD_TEXT] = Accessibility_ROLE_PASSWORD_TEXT;
+  role_table[ATK_ROLE_POPUP_MENU] = Accessibility_ROLE_POPUP_MENU;
+  role_table[ATK_ROLE_PROGRESS_BAR] = Accessibility_ROLE_PROGRESS_BAR;
+  role_table[ATK_ROLE_PUSH_BUTTON] = Accessibility_ROLE_PUSH_BUTTON;
+  role_table[ATK_ROLE_RADIO_BUTTON] = Accessibility_ROLE_RADIO_BUTTON;
+  role_table[ATK_ROLE_RADIO_MENU_ITEM] = Accessibility_ROLE_RADIO_MENU_ITEM;
+  role_table[ATK_ROLE_ROOT_PANE] = Accessibility_ROLE_ROOT_PANE;
+  role_table[ATK_ROLE_ROW_HEADER] = Accessibility_ROLE_ROW_HEADER;
+  role_table[ATK_ROLE_SCROLL_BAR] = Accessibility_ROLE_SCROLL_BAR;
+  role_table[ATK_ROLE_SCROLL_PANE] = Accessibility_ROLE_SCROLL_PANE;
+  role_table[ATK_ROLE_SEPARATOR] = Accessibility_ROLE_SEPARATOR;
+  role_table[ATK_ROLE_SLIDER] = Accessibility_ROLE_SLIDER;
+  role_table[ATK_ROLE_SPIN_BUTTON] = Accessibility_ROLE_SPIN_BUTTON;
+  role_table[ATK_ROLE_SPLIT_PANE] = Accessibility_ROLE_SPLIT_PANE;
+  role_table[ATK_ROLE_STATUSBAR] = Accessibility_ROLE_STATUS_BAR;
+  role_table[ATK_ROLE_TABLE] = Accessibility_ROLE_TABLE;
+  role_table[ATK_ROLE_TABLE_CELL] = Accessibility_ROLE_TABLE_CELL;
+  role_table[ATK_ROLE_TABLE_COLUMN_HEADER] =
+    Accessibility_ROLE_TABLE_COLUMN_HEADER;
+  role_table[ATK_ROLE_TABLE_ROW_HEADER] = Accessibility_ROLE_TABLE_ROW_HEADER;
+  role_table[ATK_ROLE_TEAR_OFF_MENU_ITEM] =
+    Accessibility_ROLE_TEAROFF_MENU_ITEM;
+  role_table[ATK_ROLE_TERMINAL] = Accessibility_ROLE_TERMINAL;
+  role_table[ATK_ROLE_TEXT] = Accessibility_ROLE_TEXT;
+  role_table[ATK_ROLE_TOGGLE_BUTTON] = Accessibility_ROLE_TOGGLE_BUTTON;
+  role_table[ATK_ROLE_TOOL_BAR] = Accessibility_ROLE_TOOL_BAR;
+  role_table[ATK_ROLE_TOOL_TIP] = Accessibility_ROLE_TOOL_TIP;
+  role_table[ATK_ROLE_TREE] = Accessibility_ROLE_TREE;
+  role_table[ATK_ROLE_TREE_TABLE] = Accessibility_ROLE_TREE_TABLE;
+  role_table[ATK_ROLE_UNKNOWN] = Accessibility_ROLE_UNKNOWN;
+  role_table[ATK_ROLE_VIEWPORT] = Accessibility_ROLE_VIEWPORT;
+  role_table[ATK_ROLE_WINDOW] = Accessibility_ROLE_WINDOW;
+  role_table[ATK_ROLE_HEADER] = Accessibility_ROLE_HEADER;
+  role_table[ATK_ROLE_FOOTER] = Accessibility_ROLE_FOOTER;
+  role_table[ATK_ROLE_PARAGRAPH] = Accessibility_ROLE_PARAGRAPH;
+  role_table[ATK_ROLE_RULER] = Accessibility_ROLE_RULER;
+  role_table[ATK_ROLE_APPLICATION] = Accessibility_ROLE_APPLICATION;
+  role_table[ATK_ROLE_AUTOCOMPLETE] = Accessibility_ROLE_AUTOCOMPLETE;
+  role_table[ATK_ROLE_EDITBAR] = Accessibility_ROLE_EDITBAR;
+  role_table[ATK_ROLE_EMBEDDED] = Accessibility_ROLE_EMBEDDED;
+  role_table[ATK_ROLE_ENTRY] = Accessibility_ROLE_ENTRY;
+  role_table[ATK_ROLE_CHART] = Accessibility_ROLE_CHART;
+  role_table[ATK_ROLE_CAPTION] = Accessibility_ROLE_CAPTION;
+  role_table[ATK_ROLE_DOCUMENT_FRAME] = Accessibility_ROLE_DOCUMENT_FRAME;
+  role_table[ATK_ROLE_HEADING] = Accessibility_ROLE_HEADING;
+  role_table[ATK_ROLE_PAGE] = Accessibility_ROLE_PAGE;
+  role_table[ATK_ROLE_SECTION] = Accessibility_ROLE_SECTION;
+  role_table[ATK_ROLE_FORM] = Accessibility_ROLE_FORM;
+  role_table[ATK_ROLE_REDUNDANT_OBJECT] = Accessibility_ROLE_REDUNDANT_OBJECT;
+  role_table[ATK_ROLE_LINK] = Accessibility_ROLE_LINK;
+  role_table[ATK_ROLE_INPUT_METHOD_WINDOW] =
+    Accessibility_ROLE_INPUT_METHOD_WINDOW;
+  return TRUE;
+}
 
-  relation_set = atk_object_ref_relation_set (object);
+Accessibility_Role
+spi_accessible_role_from_atk_role (AtkRole role)
+{
+  static gboolean is_initialized = FALSE;
+  static Accessibility_Role spi_role_table[ATK_ROLE_LAST_DEFINED];
+  Accessibility_Role spi_role;
 
-  if (relation_set)
-    n_relations = atk_relation_set_get_n_relations (relation_set);
+  if (!is_initialized)
+    {
+      is_initialized = spi_init_role_lookup_table (spi_role_table);
+    }
 
-  retval = CORBA_sequence_Accessibility_Relation__alloc ();
-  retval->_length = retval->_maximum = n_relations;
-  retval->_buffer = CORBA_sequence_Accessibility_Relation_allocbuf (n_relations);
-  CORBA_sequence_set_release (retval, CORBA_TRUE);
-         
-  for (i = 0; i < n_relations; ++i)
+  if (role >= 0 && role < ATK_ROLE_LAST_DEFINED)
     {
-      retval->_buffer[i] =
-        CORBA_Object_duplicate (
-          BONOBO_OBJREF (
-            spi_relation_new (atk_relation_set_get_relation (relation_set, i))),
-         NULL);
+      spi_role = spi_role_table[role];
     }
-  
-  return retval;
+  else
+    {
+      spi_role = Accessibility_ROLE_EXTENDED;
+    }
+  return spi_role;
 }
 
-/*
- * CORBA Accessibility::Accessible::getRole method implementation
- */
-static Accessibility_Role
-impl_accessibility_accessible_get_role (PortableServer_Servant servant,
-                                       CORBA_Environment     *ev)
+static DBusMessage *
+impl_getRole (DBusConnection * bus, DBusMessage * message, void *user_data)
 {
-  AtkRole            role;
-  Accessibility_Role retval;
-  AtkObject         *object = get_atkobject_from_servant (servant);
-
-  g_return_val_if_fail (object != NULL, 0);
+  AtkObject *object = get_object (message);
+  gint role;
+  dbus_uint32_t rv;
+  DBusMessage *reply;
 
+  if (!object)
+    return spi_dbus_general_error (message);
   role = atk_object_get_role (object);
-  retval = spi_role_from_atk_role (role);
-
-  return retval;
+  rv = spi_accessible_role_from_atk_role (role);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_UINT32, &rv,
+                               DBUS_TYPE_INVALID);
+    }
+  return reply;
 }
 
-/*
- * CORBA Accessibility::Accessible::getRole method implementation
- */
-static CORBA_char *
-impl_accessibility_accessible_get_role_name (PortableServer_Servant servant,
-                                            CORBA_Environment     *ev)
+static char *
+impl_get_role_str (void *datum)
 {
-  const gchar     *role_name;
-  AtkRole    role;
-  AtkObject *object = get_atkobject_from_servant (servant);
+  g_assert (ATK_IS_OBJECT (datum));
+  return g_strdup_printf ("%d",
+                         spi_accessible_role_from_atk_role
+                         (atk_object_get_role ((AtkObject *) datum)));
+}
 
-  g_return_val_if_fail (object != NULL, NULL);
+static DBusMessage *
+impl_getRoleName (DBusConnection * bus, DBusMessage * message,
+                 void *user_data)
+{
+  AtkObject *object = get_object (message);
+  gint role;
+  const char *role_name;
+  DBusMessage *reply;
 
+  if (!object)
+    return spi_dbus_general_error (message);
   role = atk_object_get_role (object);
-
   role_name = atk_role_get_name (role);
-  if (role_name)
-    return CORBA_string_dup (role_name);
-  else
-    return CORBA_string_dup ("");
+  if (!role_name)
+    role_name = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &role_name,
+                               DBUS_TYPE_INVALID);
+    }
+  return reply;
 }
 
-/*
- * CORBA Accessibility::Accessible::getLocalizedRole method implementation
- */
-static CORBA_char *
-impl_accessibility_accessible_get_local_role_name (PortableServer_Servant servant,
-                                                  CORBA_Environment     *ev)
+static DBusMessage *
+impl_getLocalizedRoleName (DBusConnection * bus, DBusMessage * message,
+                          void *user_data)
 {
-  const gchar     *role_name;
-  AtkRole    role;
-  AtkObject *object = get_atkobject_from_servant (servant);
-
-  g_return_val_if_fail (object != NULL, NULL);
+  AtkObject *object = get_object (message);
+  gint role;
+  const char *role_name;
+  DBusMessage *reply;
 
+  if (!object)
+    return spi_dbus_general_error (message);
   role = atk_object_get_role (object);
-
   role_name = atk_role_get_localized_name (role);
-  if (role_name)
-    return CORBA_string_dup (role_name);
-  else
-    return CORBA_string_dup ("");
+  if (!role_name)
+    role_name = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &role_name,
+                               DBUS_TYPE_INVALID);
+    }
+  return reply;
 }
 
-static Accessibility_Accessible 
-impl_accessibility_accessible_get_application (PortableServer_Servant servant,
-                                              CORBA_Environment     *ev)
-{
-    return spi_accessible_new_return (atk_get_root (), FALSE, ev);
-}
+static Accessibility_StateType *accessible_state_types = NULL;
+static AtkStateType *atk_state_types = NULL;
 
-static Accessibility_AttributeSet* 
-impl_accessibility_accessible_get_attributes (PortableServer_Servant servant,
-                                              CORBA_Environment     *ev)
+static gboolean
+spi_init_state_type_tables (void)
 {
-    Accessibility_AttributeSet *retval;
-    AtkAttributeSet *attributes = NULL;
-    AtkAttribute *attr = NULL;
-    gint n_attributes = 0;
-    gint i;
-    
-    AtkObject *object = get_atkobject_from_servant (servant);
-    
-    g_return_val_if_fail (object != NULL, NULL);
-    attributes = atk_object_get_attributes (object);
-
-    if (attributes)
-      n_attributes = g_slist_length (attributes);
-    
-    retval = CORBA_sequence_CORBA_string__alloc ();
-    retval->_length = retval->_maximum = n_attributes;
-    retval->_buffer = CORBA_sequence_CORBA_string_allocbuf (n_attributes);
-    CORBA_sequence_set_release (retval, CORBA_TRUE);
-    
-    for (i = 0; i < n_attributes; ++i)
+  gint i;
+
+  if (accessible_state_types || atk_state_types)
+    return FALSE;
+  if (!accessible_state_types)
+    accessible_state_types =
+      g_new (Accessibility_StateType, ATK_STATE_LAST_DEFINED);
+  if (!atk_state_types)
+    atk_state_types = g_new (AtkStateType, Accessibility_STATE_LAST_DEFINED);
+  g_return_val_if_fail (accessible_state_types, FALSE);
+  g_return_val_if_fail (atk_state_types, FALSE);
+
+  for (i = 0; i < Accessibility_STATE_LAST_DEFINED; i++)
     {
-       attr = g_slist_nth_data (attributes, i);
-       retval->_buffer[i] = CORBA_string_dup (g_strconcat (attr->name, ":", attr->value, NULL));
+      atk_state_types[i] = ATK_STATE_INVALID;
     }
 
-    atk_attribute_set_free (attributes);
-    
-  return retval;
-}
+  for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
+    {
+      accessible_state_types[i] = Accessibility_STATE_INVALID;
+    }
 
-static void
-spi_accessible_class_init (SpiAccessibleClass *klass)
-{
-        POA_Accessibility_Accessible__epv *epv = &klass->epv;
-
-        epv->_get_name = impl_accessibility_accessible_get_name;
-        epv->_set_name = impl_accessibility_accessible_set_name;
-        epv->_get_description = impl_accessibility_accessible_get_description;
-        epv->_set_description = impl_accessibility_accessible_set_description;
-
-        epv->_get_parent = impl_accessibility_accessible_get_parent;
-        epv->_get_childCount = impl_accessibility_accessible_get_child_count;
-        epv->getChildAtIndex = impl_accessibility_accessible_get_child_at_index;
-        epv->getIndexInParent = impl_accessibility_accessible_get_index_in_parent;
-
-        epv->getRelationSet = impl_accessibility_accessible_get_relation_set;
-        epv->getState = impl_accessibility_accessible_get_state;
-        epv->getRole = impl_accessibility_accessible_get_role;
-        epv->getRoleName = impl_accessibility_accessible_get_role_name;
-       epv->getLocalizedRoleName = impl_accessibility_accessible_get_local_role_name;
-       epv->getApplication = impl_accessibility_accessible_get_application;
-       epv->getAttributes = impl_accessibility_accessible_get_attributes;
+  accessible_state_types[ATK_STATE_ACTIVE] = Accessibility_STATE_ACTIVE;
+  atk_state_types[Accessibility_STATE_ACTIVE] = ATK_STATE_ACTIVE;
+  accessible_state_types[ATK_STATE_ARMED] = Accessibility_STATE_ARMED;
+  atk_state_types[Accessibility_STATE_ARMED] = ATK_STATE_ARMED;
+  accessible_state_types[ATK_STATE_BUSY] = Accessibility_STATE_BUSY;
+  atk_state_types[Accessibility_STATE_BUSY] = ATK_STATE_BUSY;
+  accessible_state_types[ATK_STATE_CHECKED] = Accessibility_STATE_CHECKED;
+  atk_state_types[Accessibility_STATE_CHECKED] = ATK_STATE_CHECKED;
+  accessible_state_types[ATK_STATE_DEFUNCT] = Accessibility_STATE_DEFUNCT;
+  atk_state_types[Accessibility_STATE_DEFUNCT] = ATK_STATE_DEFUNCT;
+  accessible_state_types[ATK_STATE_EDITABLE] = Accessibility_STATE_EDITABLE;
+  atk_state_types[Accessibility_STATE_EDITABLE] = ATK_STATE_EDITABLE;
+  accessible_state_types[ATK_STATE_ENABLED] = Accessibility_STATE_ENABLED;
+  atk_state_types[Accessibility_STATE_ENABLED] = ATK_STATE_ENABLED;
+  accessible_state_types[ATK_STATE_EXPANDABLE] =
+    Accessibility_STATE_EXPANDABLE;
+  atk_state_types[Accessibility_STATE_EXPANDABLE] = ATK_STATE_EXPANDABLE;
+  accessible_state_types[ATK_STATE_EXPANDED] = Accessibility_STATE_EXPANDED;
+  atk_state_types[Accessibility_STATE_EXPANDED] = ATK_STATE_EXPANDED;
+  accessible_state_types[ATK_STATE_FOCUSABLE] = Accessibility_STATE_FOCUSABLE;
+  atk_state_types[Accessibility_STATE_FOCUSABLE] = ATK_STATE_FOCUSABLE;
+  accessible_state_types[ATK_STATE_FOCUSED] = Accessibility_STATE_FOCUSED;
+  atk_state_types[Accessibility_STATE_FOCUSED] = ATK_STATE_FOCUSED;
+  accessible_state_types[ATK_STATE_HORIZONTAL] =
+    Accessibility_STATE_HORIZONTAL;
+  atk_state_types[Accessibility_STATE_HORIZONTAL] = ATK_STATE_HORIZONTAL;
+  accessible_state_types[ATK_STATE_ICONIFIED] = Accessibility_STATE_ICONIFIED;
+  atk_state_types[Accessibility_STATE_ICONIFIED] = ATK_STATE_ICONIFIED;
+  accessible_state_types[ATK_STATE_MODAL] = Accessibility_STATE_MODAL;
+  atk_state_types[Accessibility_STATE_MODAL] = ATK_STATE_MODAL;
+  accessible_state_types[ATK_STATE_MULTI_LINE] =
+    Accessibility_STATE_MULTI_LINE;
+  atk_state_types[Accessibility_STATE_MULTI_LINE] = ATK_STATE_MULTI_LINE;
+  accessible_state_types[ATK_STATE_MULTISELECTABLE] =
+    Accessibility_STATE_MULTISELECTABLE;
+  atk_state_types[Accessibility_STATE_MULTISELECTABLE] =
+    ATK_STATE_MULTISELECTABLE;
+  accessible_state_types[ATK_STATE_OPAQUE] = Accessibility_STATE_OPAQUE;
+  atk_state_types[Accessibility_STATE_OPAQUE] = ATK_STATE_OPAQUE;
+  accessible_state_types[ATK_STATE_PRESSED] = Accessibility_STATE_PRESSED;
+  atk_state_types[Accessibility_STATE_PRESSED] = ATK_STATE_PRESSED;
+  accessible_state_types[ATK_STATE_RESIZABLE] = Accessibility_STATE_RESIZABLE;
+  atk_state_types[Accessibility_STATE_RESIZABLE] = ATK_STATE_RESIZABLE;
+  accessible_state_types[ATK_STATE_SELECTABLE] =
+    Accessibility_STATE_SELECTABLE;
+  atk_state_types[Accessibility_STATE_SELECTABLE] = ATK_STATE_SELECTABLE;
+  accessible_state_types[ATK_STATE_SELECTED] = Accessibility_STATE_SELECTED;
+  atk_state_types[Accessibility_STATE_SELECTED] = ATK_STATE_SELECTED;
+  accessible_state_types[ATK_STATE_SENSITIVE] = Accessibility_STATE_SENSITIVE;
+  atk_state_types[Accessibility_STATE_SENSITIVE] = ATK_STATE_SENSITIVE;
+  accessible_state_types[ATK_STATE_SHOWING] = Accessibility_STATE_SHOWING;
+  atk_state_types[Accessibility_STATE_SHOWING] = ATK_STATE_SHOWING;
+  accessible_state_types[ATK_STATE_SINGLE_LINE] =
+    Accessibility_STATE_SINGLE_LINE;
+  atk_state_types[Accessibility_STATE_SINGLE_LINE] = ATK_STATE_SINGLE_LINE;
+  accessible_state_types[ATK_STATE_STALE] = Accessibility_STATE_STALE;
+  atk_state_types[Accessibility_STATE_STALE] = ATK_STATE_STALE;
+  accessible_state_types[ATK_STATE_TRANSIENT] = Accessibility_STATE_TRANSIENT;
+  atk_state_types[Accessibility_STATE_TRANSIENT] = ATK_STATE_TRANSIENT;
+  accessible_state_types[ATK_STATE_VERTICAL] = Accessibility_STATE_VERTICAL;
+  atk_state_types[Accessibility_STATE_VERTICAL] = ATK_STATE_VERTICAL;
+  accessible_state_types[ATK_STATE_VISIBLE] = Accessibility_STATE_VISIBLE;
+  atk_state_types[Accessibility_STATE_VISIBLE] = ATK_STATE_VISIBLE;
+  accessible_state_types[ATK_STATE_MANAGES_DESCENDANTS] =
+    Accessibility_STATE_MANAGES_DESCENDANTS;
+  atk_state_types[Accessibility_STATE_MANAGES_DESCENDANTS] =
+    ATK_STATE_MANAGES_DESCENDANTS;
+  accessible_state_types[ATK_STATE_INDETERMINATE] =
+    Accessibility_STATE_INDETERMINATE;
+  atk_state_types[Accessibility_STATE_INDETERMINATE] =
+    ATK_STATE_INDETERMINATE;
+  accessible_state_types[ATK_STATE_TRUNCATED] = Accessibility_STATE_TRUNCATED;
+  atk_state_types[Accessibility_STATE_TRUNCATED] = ATK_STATE_TRUNCATED;
+  accessible_state_types[ATK_STATE_REQUIRED] = Accessibility_STATE_REQUIRED;
+  atk_state_types[Accessibility_STATE_REQUIRED] = ATK_STATE_REQUIRED;
+  accessible_state_types[ATK_STATE_INVALID_ENTRY] =
+    Accessibility_STATE_INVALID_ENTRY;
+  atk_state_types[Accessibility_STATE_INVALID_ENTRY] =
+    ATK_STATE_INVALID_ENTRY;
+  accessible_state_types[ATK_STATE_SUPPORTS_AUTOCOMPLETION] =
+    Accessibility_STATE_SUPPORTS_AUTOCOMPLETION;
+  atk_state_types[Accessibility_STATE_SUPPORTS_AUTOCOMPLETION] =
+    ATK_STATE_SUPPORTS_AUTOCOMPLETION;
+  accessible_state_types[ATK_STATE_SELECTABLE_TEXT] =
+    Accessibility_STATE_SELECTABLE_TEXT;
+  atk_state_types[Accessibility_STATE_SELECTABLE_TEXT] =
+    ATK_STATE_SELECTABLE_TEXT;
+  accessible_state_types[ATK_STATE_DEFAULT] = Accessibility_STATE_IS_DEFAULT;
+  atk_state_types[Accessibility_STATE_IS_DEFAULT] = ATK_STATE_DEFAULT;
+  accessible_state_types[ATK_STATE_VISITED] = Accessibility_STATE_VISITED;
+  atk_state_types[Accessibility_STATE_VISITED] = ATK_STATE_VISITED;
+
+
+  return TRUE;
 }
 
 static void
-spi_accessible_init (SpiAccessible *accessible)
+get_state (AtkObject * object, dbus_uint32_t * array)
 {
-}
-
-BONOBO_TYPE_FUNC_FULL (SpiAccessible,
-                      Accessibility_Accessible,
-                      PARENT_TYPE,
-                      spi_accessible)
+  AtkStateSet *set = atk_object_ref_state_set (object);
+  int i;
 
-static GHashTable *public_corba_refs = NULL;
+  array[0] = 0;
+  array[1] = 0;
+  if (!set)
+    return;
+  spi_init_state_type_tables ();
 
-static GHashTable *
-get_public_refs (void)
-{
-  if (!public_corba_refs)
+  g_assert (ATK_STATE_LAST_DEFINED <= 64);
+  for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
     {
-      public_corba_refs = g_hash_table_new (NULL, NULL);
+      if (atk_state_set_contains_state (set, i))
+       {
+         int a = accessible_state_types[i];
+         g_assert (a < 64);
+         BITARRAY_SET (array, a);
+       }
     }
-  return public_corba_refs;
+  g_object_unref (set);
 }
 
-static void
-de_register_public_ref (SpiBase *object)
+static DBusMessage *
+impl_getState (DBusConnection * bus, DBusMessage * message, void *user_data)
 {
-  g_hash_table_remove (get_public_refs (), object->gobj);
+  AtkObject *object = get_object (message);
+  dbus_uint32_t rv[2];
+  DBusMessage *reply;
+
+  if (!object)
+    return spi_dbus_general_error (message);
+  get_state (object, rv);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_ARRAY, DBUS_TYPE_INT32, &rv,
+                               2, DBUS_TYPE_INVALID);
+    }
+  return reply;
 }
 
-SpiAccessible *
-spi_accessible_new (AtkObject *o)
+static DBusMessage *
+impl_getAttributes (DBusConnection * bus, DBusMessage * message,
+                   void *user_data)
 {
-  return spi_accessible_construct (SPI_ACCESSIBLE_TYPE, o);      
-}
+  AtkObject *object = get_object (message);
+  DBusMessage *reply;
+  AtkAttributeSet *attributes;
+  AtkAttribute *attr = NULL;
+  char **retval;
+  gint n_attributes = 0;
+  gint i;
 
-SpiAccessible *
-spi_accessible_construct (GType type, AtkObject *o)
-{
-    SpiAccessible *retval;
-    CORBA_Environment ev;
-
-    CORBA_exception_init (&ev);
-
-    g_assert (o);
-    g_assert (g_type_is_a (type, SPI_ACCESSIBLE_TYPE));
-
-    if ((retval = g_hash_table_lookup (get_public_refs (), o)))
-      {
-        bonobo_object_ref (BONOBO_OBJECT (retval));
-       return retval;
-      }
-    else
-      {
-        retval = g_object_new (type, NULL);
-        spi_base_construct (SPI_BASE (retval), G_OBJECT(o));
-      }
-    
-    g_hash_table_insert (get_public_refs (), o, retval);
-    g_signal_connect (G_OBJECT (retval), "destroy",
-                     G_CALLBACK (de_register_public_ref),
-                     NULL);
-
-    /* aggregate appropriate SPI interfaces based on ATK interfaces */
-    if (ATK_IS_ACTION (o))
-      {
-        bonobo_object_add_interface (bonobo_object (retval),
-               BONOBO_OBJECT (spi_action_interface_new (o)));
-      }
-
-    if (ATK_IS_COMPONENT (o))
-      {
-        bonobo_object_add_interface (bonobo_object (retval),
-                                    BONOBO_OBJECT (spi_component_interface_new (o)));
-      }
-
-    if (ATK_IS_EDITABLE_TEXT (o))
-      {
-         bonobo_object_add_interface (bonobo_object (retval),
-                                     BONOBO_OBJECT(spi_editable_text_interface_new (o)));
-      }
-
-    else if (ATK_IS_TEXT (o))
-       {
-         bonobo_object_add_interface (bonobo_object (retval),
-                                     BONOBO_OBJECT (spi_text_interface_new (o)));
-       }
-
-    if (ATK_IS_HYPERTEXT (o))
-      {
-        bonobo_object_add_interface (bonobo_object (retval),
-                                    BONOBO_OBJECT (spi_hypertext_interface_new (o)));
-      }
-
-    if (ATK_IS_IMAGE (o))
-      {
-        bonobo_object_add_interface (bonobo_object (retval),
-                                    BONOBO_OBJECT (spi_image_interface_new (o)));
-      }
-
-    if (ATK_IS_SELECTION (o))
-      {
-        bonobo_object_add_interface (bonobo_object (retval),
-                                    BONOBO_OBJECT (spi_selection_interface_new (o)));
-      }
-
-    if (ATK_IS_TABLE (o))
-      {
-        bonobo_object_add_interface (bonobo_object (retval),
-                                    BONOBO_OBJECT (spi_table_interface_new (o)));
-      }
-
-    if (ATK_IS_VALUE (o))
-      {
-        bonobo_object_add_interface (bonobo_object (retval),
-                                    BONOBO_OBJECT (spi_value_interface_new (o)));
-      }
-
-    if (ATK_IS_STREAMABLE_CONTENT (o))
-      {
-        bonobo_object_add_interface (bonobo_object (retval),
-                                    BONOBO_OBJECT (spi_streamable_interface_new (o)));
-      }
-    if (ATK_IS_DOCUMENT (o)) /* We add collection interface to document */
-      {
-
-          
-        SpiDocument *doc = spi_document_interface_new (o);
-        bonobo_object_add_interface (BONOBO_OBJECT (doc), 
-                                     BONOBO_OBJECT (spi_collection_interface_new (o)));
-
-        bonobo_object_add_interface (bonobo_object (retval),
-                                       BONOBO_OBJECT (doc));
-      }
-    if (ATK_IS_HYPERLINK_IMPL (o))
-      {
-         /* !!! the cast below is used instead of the ATK_HYPERLINK macro, since 
-          the object 'o' is not really a hyperlink, but is in fact an AtkHyperlinkImpl.
-          Ouch.  This works since it gets cast back to GObject, but it's nasty and needs
-          to be cleaned up.
-         */
-       bonobo_object_add_interface (bonobo_object (retval),
-                                    BONOBO_OBJECT (spi_hyperlink_new ((AtkHyperlink*)o)));
-      }
-
-    return retval;
-}
+  if (!object)
+    return spi_dbus_general_error (message);
 
-/**
- * spi_accessible_new_return:
- * @o: an AtkObject or NULL
- * @release_ref: whether to unref this AtkObject before return
- * @ev: a CORBA environment
- * 
- * A helper function to instantiate a CORBA accessiblility
- * proxy from an AtkObject.
- * 
- * Return value: the proxy or CORBA_OBJECT_NIL
- **/
-Accessibility_Accessible
-spi_accessible_new_return (AtkObject         *o,
-                          gboolean           release_ref,
-                          CORBA_Environment *ev)
-{
-  SpiAccessible *accessible;
-  Accessibility_Accessible retval;
+  attributes = atk_object_get_attributes (object);
+  if (attributes)
+    n_attributes = g_slist_length (attributes);
 
-  if (!o)
-    {
-      return CORBA_OBJECT_NIL;
-    }
-  else if (SPI_IS_REMOTE_OBJECT (o))
+  retval = (char **) g_malloc (n_attributes * sizeof (char *));
+
+  for (i = 0; i < n_attributes; ++i)
     {
-      retval = spi_remote_object_get_accessible (SPI_REMOTE_OBJECT (o));
+      attr = g_slist_nth_data (attributes, i);
+      retval[i] = g_strconcat (attr->name, ":", attr->value, NULL);
     }
-  else
+  if (attributes)
+    atk_attribute_set_free (attributes);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
     {
-      accessible = spi_accessible_construct (SPI_ACCESSIBLE_TYPE, o);
-      retval = CORBA_Object_duplicate (BONOBO_OBJREF (accessible), ev); 
+      dbus_message_append_args (reply, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
+                               &retval, n_attributes, DBUS_TYPE_INVALID);
     }
+  for (i = 0; i < n_attributes; i++)
+    g_free (retval[i]);
+  g_free (retval);
+  return reply;
+}
 
-  if (release_ref)
-    {
-      g_object_unref (G_OBJECT (o));
-    }
-  
-  return retval;
+static DBusMessage *
+impl_getApplication (DBusConnection * bus, DBusMessage * message,
+                    void *user_data)
+{
+  AtkObject *root = atk_get_root ();
+  return spi_dbus_return_object (message, root, FALSE);
 }
+
+// TODO: sync spec with updates made here
+static DRouteMethod methods[] = {
+  //{ DROUTE_METHOD, impl_isEqual, "isEqual", "o,obj,i:b,,o" },
+  {DROUTE_METHOD, impl_getChildren, "getChildren", "ao,,o"},
+  {DROUTE_METHOD, impl_getIndexInParent, "getIndexInParent", "i,,o"},
+  //{ DROUTE_METHOD, impl_getRelationSet, "getRelationSet", "a{so},,o" },
+  {DROUTE_METHOD, impl_getRole, "getRole", "u,,o"},
+  {DROUTE_METHOD, impl_getRoleName, "getRoleName", "s,,o"},
+  {DROUTE_METHOD, impl_getLocalizedRoleName, "getLocalizedRoleName", "s,,o"},
+  {DROUTE_METHOD, impl_getState, "getState", "o,,au"},
+  {DROUTE_METHOD, impl_getAttributes, "getAttributes", "as,,o"},
+  {DROUTE_METHOD, impl_getApplication, "getApplication", "o,,o"},
+  {0, NULL, NULL, NULL}
+};
+
+static DRouteProperty properties[] = {
+  {impl_get_name, impl_get_name_str, impl_set_name, NULL, "name", "s"},
+  {impl_get_description, impl_get_description_str, impl_set_description, NULL,
+   "description", "s"},
+  {impl_get_parent, impl_get_parent_str, NULL, NULL, "parent", "o"},
+  //{ impl_get_childCount, impl_get_childCount_str, NULL, NULL, "childCount", "n" },
+  {NULL, impl_get_role_str, NULL, NULL, "role", "u"},
+  {NULL, NULL, NULL, NULL, NULL, NULL}
+};
+
+void
+spi_initialize_accessible (DRouteData * data)
+{
+  droute_add_interface (data, "org.freedesktop.accessibility.Accessible",
+                       methods, properties,
+                       (DRouteGetDatumFunction) get_object_from_path, NULL);
+};