2009-07-06 Mark Doffman <mark.doffman@codethink.co.uk>
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / text-adaptor.c
index 7c88211..de91f6b 100644 (file)
 #include <atk/atk.h>
 #include <droute/droute.h>
 
-#include "spi-common/spi-dbus.h"
+#include "common/spi-dbus.h"
 
 static dbus_bool_t
 impl_get_characterCount (DBusMessageIter * iter,
-                        void *user_data)
+                         void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   g_return_val_if_fail (ATK_IS_TEXT (user_data), FALSE);
@@ -40,7 +40,7 @@ impl_get_characterCount (DBusMessageIter * iter,
 
 static dbus_bool_t
 impl_get_caretOffset (DBusMessageIter * iter,
-                     void *user_data)
+                      void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   g_return_val_if_fail (ATK_IS_TEXT (user_data), FALSE);
@@ -63,7 +63,7 @@ impl_getText (DBusConnection * bus, DBusMessage * message, void *user_data)
       (message, &error, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
        &endOffset, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   txt = atk_text_get_text (text, startOffset, endOffset);
   if (!txt)
@@ -72,7 +72,7 @@ impl_getText (DBusConnection * bus, DBusMessage * message, void *user_data)
   if (reply)
     {
       dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
-                               DBUS_TYPE_INVALID);
+                                DBUS_TYPE_INVALID);
     }
   g_free (txt);
   return reply;
@@ -80,7 +80,7 @@ impl_getText (DBusConnection * bus, DBusMessage * message, void *user_data)
 
 static DBusMessage *
 impl_setCaretOffset (DBusConnection * bus, DBusMessage * message,
-                    void *user_data)
+                     void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t offset;
@@ -94,21 +94,21 @@ impl_setCaretOffset (DBusConnection * bus, DBusMessage * message,
   if (!dbus_message_get_args
       (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   rv = atk_text_set_caret_offset (text, offset);
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
       dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
-                               DBUS_TYPE_INVALID);
+                                DBUS_TYPE_INVALID);
     }
   return reply;
 }
 
 static DBusMessage *
 impl_getTextBeforeOffset (DBusConnection * bus, DBusMessage * message,
-                         void *user_data)
+                          void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t offset;
@@ -126,11 +126,11 @@ impl_getTextBeforeOffset (DBusConnection * bus, DBusMessage * message,
       (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
        DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   txt =
     atk_text_get_text_before_offset (text, offset, (AtkTextBoundary) type,
-                                    &intstart_offset, &intend_offset);
+                                     &intstart_offset, &intend_offset);
   startOffset = intstart_offset;
   endOffset = intend_offset;
   if (!txt)
@@ -138,9 +138,9 @@ impl_getTextBeforeOffset (DBusConnection * bus, DBusMessage * message,
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
-      dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
-                               DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_STRING,
-                               &txt, DBUS_TYPE_INVALID);
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt, DBUS_TYPE_INT32,
+                                &startOffset, DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_INVALID);
     }
   g_free (txt);
   return reply;
@@ -148,7 +148,7 @@ impl_getTextBeforeOffset (DBusConnection * bus, DBusMessage * message,
 
 static DBusMessage *
 impl_getTextAtOffset (DBusConnection * bus, DBusMessage * message,
-                     void *user_data)
+                      void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t offset, type;
@@ -165,11 +165,11 @@ impl_getTextAtOffset (DBusConnection * bus, DBusMessage * message,
       (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
        DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   txt =
     atk_text_get_text_at_offset (text, offset, (AtkTextBoundary) type,
-                                &intstart_offset, &intend_offset);
+                                 &intstart_offset, &intend_offset);
   startOffset = intstart_offset;
   endOffset = intend_offset;
   if (!txt)
@@ -177,9 +177,9 @@ impl_getTextAtOffset (DBusConnection * bus, DBusMessage * message,
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
-      dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
-                               DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_STRING,
-                               &txt, DBUS_TYPE_INVALID);
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt, DBUS_TYPE_INT32,
+                                &startOffset, DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_INVALID);
     }
   g_free (txt);
   return reply;
@@ -187,7 +187,7 @@ impl_getTextAtOffset (DBusConnection * bus, DBusMessage * message,
 
 static DBusMessage *
 impl_getTextAfterOffset (DBusConnection * bus, DBusMessage * message,
-                        void *user_data)
+                         void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t offset;
@@ -205,11 +205,11 @@ impl_getTextAfterOffset (DBusConnection * bus, DBusMessage * message,
       (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
        DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   txt =
     atk_text_get_text_after_offset (text, offset, (AtkTextBoundary) type,
-                                   &intstart_offset, &intend_offset);
+                                    &intstart_offset, &intend_offset);
   startOffset = intstart_offset;
   endOffset = intend_offset;
   if (!txt)
@@ -217,9 +217,9 @@ impl_getTextAfterOffset (DBusConnection * bus, DBusMessage * message,
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
-      dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
-                               DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_STRING,
-                               &txt, DBUS_TYPE_INVALID);
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt, DBUS_TYPE_INT32,
+                                &startOffset, DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_INVALID);
     }
   g_free (txt);
   return reply;
@@ -227,7 +227,7 @@ impl_getTextAfterOffset (DBusConnection * bus, DBusMessage * message,
 
 static DBusMessage *
 impl_getCharacterAtOffset (DBusConnection * bus, DBusMessage * message,
-                        void *user_data)
+                         void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t offset;
@@ -241,7 +241,7 @@ impl_getCharacterAtOffset (DBusConnection * bus, DBusMessage * message,
   if (!dbus_message_get_args
       (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   ch = atk_text_get_character_at_offset (text, offset);
   reply = dbus_message_new_method_return (message);
@@ -254,7 +254,7 @@ impl_getCharacterAtOffset (DBusConnection * bus, DBusMessage * message,
 
 static DBusMessage *
 impl_getAttributeValue (DBusConnection * bus, DBusMessage * message,
-                       void *user_data)
+                        void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t offset;
@@ -262,7 +262,7 @@ impl_getAttributeValue (DBusConnection * bus, DBusMessage * message,
   dbus_int32_t startOffset, endOffset;
   dbus_bool_t defined;
   gint intstart_offset = 0, intend_offset = 0;
-  char *rv;
+  char *rv = NULL;
   DBusError error;
   DBusMessage *reply;
   AtkAttributeSet *set;
@@ -276,11 +276,11 @@ impl_getAttributeValue (DBusConnection * bus, DBusMessage * message,
       (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_STRING,
        &attributeName, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
 
   set = atk_text_get_run_attributes (text, offset,
-                                    &intstart_offset, &intend_offset);
+                                     &intstart_offset, &intend_offset);
   startOffset = intstart_offset;
   endOffset = intend_offset;
   defined = FALSE;
@@ -289,11 +289,11 @@ impl_getAttributeValue (DBusConnection * bus, DBusMessage * message,
     {
       at = (AtkAttribute *) cur_attr->data;
       if (!strcmp (at->name, attributeName))
-       {
-         rv = at->value;
-         defined = TRUE;
-         break;
-       }
+        {
+          rv = at->value;
+          defined = TRUE;
+          break;
+        }
       cur_attr = cur_attr->next;
     }
   if (!rv)
@@ -301,10 +301,9 @@ impl_getAttributeValue (DBusConnection * bus, DBusMessage * message,
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
-      dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
-                               DBUS_TYPE_INT32, &endOffset,
-                               DBUS_TYPE_BOOLEAN, &defined, DBUS_TYPE_STRING,
-                               &rv, DBUS_TYPE_INVALID);
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv, DBUS_TYPE_INT32,
+                                &startOffset, DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_BOOLEAN, &defined, DBUS_TYPE_INVALID);
     }
   atk_attribute_set_free (set);
   return reply;
@@ -323,9 +322,9 @@ _string_from_attribute_set (AtkAttributeSet * set)
     {
       at = (AtkAttribute *) cur_attr->data;
       tmp = g_strdup_printf ("%s%s:%s%s",
-                            ((GSList *) (set) == cur_attr) ? "" : " ",
-                            at->name, at->value,
-                            (cur_attr->next) ? ";" : "");
+                             ((GSList *) (set) == cur_attr) ? "" : " ",
+                             at->name, at->value,
+                             (cur_attr->next) ? ";" : "");
       tmp2 = g_strconcat (attributes, tmp, NULL);
       g_free (tmp);
       g_free (attributes);
@@ -337,16 +336,16 @@ _string_from_attribute_set (AtkAttributeSet * set)
 
 static DBusMessage *
 impl_getAttributes (DBusConnection * bus, DBusMessage * message,
-                   void *user_data)
+                    void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t offset;
   dbus_int32_t startOffset, endOffset;
   gint intstart_offset, intend_offset;
-  char *rv;
   DBusError error;
   DBusMessage *reply;
   AtkAttributeSet *set;
+  DBusMessageIter iter;
 
   g_return_val_if_fail (ATK_IS_TEXT (user_data),
                         droute_not_yet_handled_error (message));
@@ -354,61 +353,58 @@ impl_getAttributes (DBusConnection * bus, DBusMessage * message,
   if (!dbus_message_get_args
       (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
 
   set = atk_text_get_run_attributes (text, offset,
-                                    &intstart_offset, &intend_offset);
-
-  rv = _string_from_attribute_set (set);
+                                     &intstart_offset, &intend_offset);
 
   startOffset = intstart_offset;
   endOffset = intend_offset;
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
-      dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv, DBUS_TYPE_INT32, &startOffset,
-                               DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_INVALID);
+      dbus_message_iter_init_append (reply, &iter);
+      spi_atk_append_attribute_set (&iter, set);
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
+                                DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_INVALID);
     }
   atk_attribute_set_free (set);
-  g_free(rv);
   return reply;
 }
 
 static DBusMessage *
 impl_getDefaultAttributes (DBusConnection * bus, DBusMessage * message,
-                          void *user_data)
+                           void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
-  char *rv;
   DBusError error;
   DBusMessage *reply;
   AtkAttributeSet *set;
+  DBusMessageIter iter;
 
   g_return_val_if_fail (ATK_IS_TEXT (user_data),
                         droute_not_yet_handled_error (message));
   dbus_error_init (&error);
 
   set = atk_text_get_default_attributes (text);
-  rv = _string_from_attribute_set (set);
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
-      dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv,
-                               DBUS_TYPE_INVALID);
+      dbus_message_iter_init_append (reply, &iter);
+      spi_atk_append_attribute_set (&iter, set);
     }
-  g_free (rv);
   atk_attribute_set_free (set);
   return reply;
 }
 
 static DBusMessage *
 impl_getCharacterExtents (DBusConnection * bus, DBusMessage * message,
-                         void *user_data)
+                          void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t offset;
-  dbus_int16_t coordType;
+  dbus_uint32_t coordType;
   dbus_int32_t x, y, width, height;
   gint ix = 0, iy = 0, iw = 0, ih = 0;
   DBusError error;
@@ -418,13 +414,13 @@ impl_getCharacterExtents (DBusConnection * bus, DBusMessage * message,
                         droute_not_yet_handled_error (message));
   dbus_error_init (&error);
   if (!dbus_message_get_args
-      (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INT16, &coordType,
+      (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &coordType,
        DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   atk_text_get_character_extents (text, offset, &ix, &iy, &iw, &ih,
-                                 (AtkCoordType) coordType);
+                                  (AtkCoordType) coordType);
   x = ix;
   y = iy;
   width = iw;
@@ -433,19 +429,19 @@ impl_getCharacterExtents (DBusConnection * bus, DBusMessage * message,
   if (reply)
     {
       dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
-                               &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
-                               &height, DBUS_TYPE_INVALID);
+                                &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
+                                &height, DBUS_TYPE_INVALID);
     }
   return reply;
 }
 
 static DBusMessage *
 impl_getOffsetAtPoint (DBusConnection * bus, DBusMessage * message,
-                      void *user_data)
+                       void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t x, y;
-  dbus_int16_t coordType;
+  dbus_uint32_t coordType;
   dbus_int32_t rv;
   DBusError error;
   DBusMessage *reply;
@@ -455,23 +451,23 @@ impl_getOffsetAtPoint (DBusConnection * bus, DBusMessage * message,
   dbus_error_init (&error);
   if (!dbus_message_get_args
       (message, &error, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
-       DBUS_TYPE_INT16, &coordType, DBUS_TYPE_INVALID))
+       DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   rv = atk_text_get_offset_at_point (text, x, y, coordType);
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
       dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
-                               DBUS_TYPE_INVALID);
+                                DBUS_TYPE_INVALID);
     }
   return reply;
 }
 
 static DBusMessage *
 impl_getNSelections (DBusConnection * bus, DBusMessage * message,
-                    void *user_data)
+                     void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t rv;
@@ -484,14 +480,14 @@ impl_getNSelections (DBusConnection * bus, DBusMessage * message,
   if (reply)
     {
       dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
-                               DBUS_TYPE_INVALID);
+                                DBUS_TYPE_INVALID);
     }
   return reply;
 }
 
 static DBusMessage *
 impl_getSelection (DBusConnection * bus, DBusMessage * message,
-                  void *user_data)
+                   void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t selectionNum;
@@ -506,26 +502,26 @@ impl_getSelection (DBusConnection * bus, DBusMessage * message,
   if (!dbus_message_get_args
       (message, &error, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   /* atk_text_get_selection returns gchar * which we discard */
   g_free (atk_text_get_selection
-         (text, selectionNum, &intstart_offset, &intend_offset));
+          (text, selectionNum, &intstart_offset, &intend_offset));
   startOffset = intstart_offset;
   endOffset = intend_offset;
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
       dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
-                               DBUS_TYPE_INT32, &endOffset,
-                               DBUS_TYPE_INVALID);
+                                DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_INVALID);
     }
   return reply;
 }
 
 static DBusMessage *
 impl_addSelection (DBusConnection * bus, DBusMessage * message,
-                  void *user_data)
+                   void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t startOffset, endOffset;
@@ -540,21 +536,21 @@ impl_addSelection (DBusConnection * bus, DBusMessage * message,
       (message, &error, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
        &endOffset, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   rv = atk_text_add_selection (text, startOffset, endOffset);
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
       dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
-                               DBUS_TYPE_INVALID);
+                                DBUS_TYPE_INVALID);
     }
   return reply;
 }
 
 static DBusMessage *
 impl_removeSelection (DBusConnection * bus, DBusMessage * message,
-                     void *user_data)
+                      void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t selectionNum;
@@ -568,21 +564,21 @@ impl_removeSelection (DBusConnection * bus, DBusMessage * message,
   if (!dbus_message_get_args
       (message, &error, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   rv = atk_text_remove_selection (text, selectionNum);
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
       dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
-                               DBUS_TYPE_INVALID);
+                                DBUS_TYPE_INVALID);
     }
   return reply;
 }
 
 static DBusMessage *
 impl_setSelection (DBusConnection * bus, DBusMessage * message,
-                  void *user_data)
+                   void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t selectionNum, startOffset, endOffset;
@@ -597,25 +593,25 @@ impl_setSelection (DBusConnection * bus, DBusMessage * message,
       (message, &error, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INT32,
        &startOffset, DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   rv = atk_text_set_selection (text, selectionNum, startOffset, endOffset);
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
       dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
-                               DBUS_TYPE_INVALID);
+                                DBUS_TYPE_INVALID);
     }
   return reply;
 }
 
 static DBusMessage *
 impl_getRangeExtents (DBusConnection * bus, DBusMessage * message,
-                     void *user_data)
+                      void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t startOffset, endOffset;
-  dbus_int16_t coordType;
+  dbus_uint32_t coordType;
   AtkTextRectangle rect;
   dbus_int32_t x, y, width, height;
   DBusError error;
@@ -626,13 +622,13 @@ impl_getRangeExtents (DBusConnection * bus, DBusMessage * message,
   dbus_error_init (&error);
   if (!dbus_message_get_args
       (message, &error, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
-       &endOffset, DBUS_TYPE_INT16, &coordType, DBUS_TYPE_INVALID))
+       &endOffset, DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   memset (&rect, 0, sizeof (rect));
   atk_text_get_range_extents (text, startOffset, endOffset,
-                             (AtkCoordType) coordType, &rect);
+                              (AtkCoordType) coordType, &rect);
   x = rect.x;
   y = rect.y;
   width = rect.width;
@@ -641,8 +637,8 @@ impl_getRangeExtents (DBusConnection * bus, DBusMessage * message,
   if (reply)
     {
       dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
-                               &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
-                               &height, DBUS_TYPE_INVALID);
+                                &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
+                                &height, DBUS_TYPE_INVALID);
     }
   return reply;
 }
@@ -651,11 +647,11 @@ impl_getRangeExtents (DBusConnection * bus, DBusMessage * message,
 
 static DBusMessage *
 impl_getBoundedRanges (DBusConnection * bus, DBusMessage * message,
-                      void *user_data)
+                       void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   dbus_int32_t x, y, width, height;
-  dbus_int16_t coordType, xClipType, yClipType;
+  dbus_uint32_t coordType, xClipType, yClipType;
   DBusError error;
   AtkTextRange **range_list = NULL;
   AtkTextRectangle rect;
@@ -667,11 +663,11 @@ impl_getBoundedRanges (DBusConnection * bus, DBusMessage * message,
   dbus_error_init (&error);
   if (!dbus_message_get_args
       (message, &error, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
-       DBUS_TYPE_INT32, &height, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
-       &coordType, DBUS_TYPE_INT32, &xClipType, DBUS_TYPE_INT32, &yClipType,
+       DBUS_TYPE_INT32, &height, DBUS_TYPE_INT32, &width, DBUS_TYPE_UINT32,
+       &coordType, DBUS_TYPE_UINT32, &xClipType, DBUS_TYPE_UINT32, &yClipType,
        DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
   rect.x = x;
   rect.y = y;
@@ -680,8 +676,8 @@ impl_getBoundedRanges (DBusConnection * bus, DBusMessage * message,
 
   range_list =
     atk_text_get_bounded_ranges (text, &rect, (AtkCoordType) coordType,
-                                (AtkTextClipType) xClipType,
-                                (AtkTextClipType) yClipType);
+                                 (AtkTextClipType) xClipType,
+                                 (AtkTextClipType) yClipType);
   reply = dbus_message_new_method_return (message);
   if (!reply)
     return NULL;
@@ -692,31 +688,31 @@ impl_getBoundedRanges (DBusConnection * bus, DBusMessage * message,
     {
       int len;
       for (len = 0; len < MAXRANGELEN && range_list[len]; ++len)
-       {
-         if (dbus_message_iter_open_container
-             (&array, DBUS_TYPE_STRUCT, NULL, &struc))
-           {
-             dbus_int32_t val;
-             val = range_list[len]->start_offset;
-             dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
-             val = range_list[len]->end_offset;
-             dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
-             dbus_message_iter_append_basic (&struc, DBUS_TYPE_STRING,
-                                             &range_list[len]->content);
-             /* The variant is unimplemented in atk, but I don't want to
-              * unilaterally muck with the spec and remove it, so I'll just
-              * throw in a dummy value */
-             if (dbus_message_iter_open_container
-                 (&array, DBUS_TYPE_VARIANT, "i", &variant))
-               {
-                 dbus_uint32_t dummy = 0;
-                 dbus_message_iter_append_basic (&variant, DBUS_TYPE_INT32,
-                                                 &dummy);
-                 dbus_message_iter_close_container (&struc, &variant);
-               }
-             dbus_message_iter_close_container (&array, &struc);
-           }
-       }
+        {
+          if (dbus_message_iter_open_container
+              (&array, DBUS_TYPE_STRUCT, NULL, &struc))
+            {
+              dbus_int32_t val;
+              val = range_list[len]->start_offset;
+              dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
+              val = range_list[len]->end_offset;
+              dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
+              dbus_message_iter_append_basic (&struc, DBUS_TYPE_STRING,
+                                              &range_list[len]->content);
+              /* The variant is unimplemented in atk, but I don't want to
+               * unilaterally muck with the spec and remove it, so I'll just
+               * throw in a dummy value */
+              if (dbus_message_iter_open_container
+                  (&struc, DBUS_TYPE_VARIANT, "i", &variant))
+                {
+                  dbus_uint32_t dummy = 0;
+                  dbus_message_iter_append_basic (&variant, DBUS_TYPE_INT32,
+                                                  &dummy);
+                  dbus_message_iter_close_container (&struc, &variant);
+                }
+              dbus_message_iter_close_container (&array, &struc);
+            }
+        }
       dbus_message_iter_close_container (&iter, &array);
     }
   return reply;
@@ -724,7 +720,7 @@ impl_getBoundedRanges (DBusConnection * bus, DBusMessage * message,
 
 static DBusMessage *
 impl_getAttributeRun (DBusConnection * bus, DBusMessage * message,
-                     void *user_data)
+                      void *user_data)
 {
   DBusError error;
   AtkText *text = (AtkText *) user_data;
@@ -735,9 +731,7 @@ impl_getAttributeRun (DBusConnection * bus, DBusMessage * message,
   DBusMessage *reply;
   AtkAttributeSet *attributes, *default_attributes = NULL;
   AtkAttribute *attr = NULL;
-  char **retval;
-  gint n_attributes = 0, total_attributes = 0, n_default_attributes = 0;
-  gint i, j;
+  DBusMessageIter iter, iterArray;
 
   g_return_val_if_fail (ATK_IS_TEXT (user_data),
                         droute_not_yet_handled_error (message));
@@ -746,98 +740,63 @@ impl_getAttributeRun (DBusConnection * bus, DBusMessage * message,
       (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_BOOLEAN,
        &includeDefaults, DBUS_TYPE_INVALID))
     {
-      return SPI_DBUS_RETURN_ERROR (message, &error);
+      return droute_invalid_arguments_error (message);
     }
 
   attributes =
     atk_text_get_run_attributes (text, offset, &intstart_offset,
-                                &intend_offset);
+                                 &intend_offset);
 
-  if (attributes)
-    total_attributes = n_attributes = g_slist_length (attributes);
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    return NULL;
 
+  dbus_message_iter_init_append (reply, &iter);
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{ss}", &iterArray);
+  spi_atk_append_attribute_set_inner (&iterArray, attributes);
   if (includeDefaults)
     {
       default_attributes = atk_text_get_default_attributes (text);
-      if (default_attributes)
-       n_default_attributes = g_slist_length (default_attributes);
-      total_attributes += n_default_attributes;
+      spi_atk_append_attribute_set_inner (&iterArray, default_attributes);
     }
+  dbus_message_iter_close_container (&iter, &iterArray);
 
   startOffset = intstart_offset;
   endOffset = intend_offset;
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &startOffset);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &endOffset);
 
-  retval = (char **) g_malloc (total_attributes * sizeof (char *));
-
-  if (total_attributes)
-    {
-      for (i = 0; i < n_attributes; ++i)
-       {
-         attr = g_slist_nth_data (attributes, i);
-         retval[i] = g_strconcat (attr->name, ":", attr->value, NULL);
-       }
-
-      for (j = 0; j < n_default_attributes; ++i, ++j)
-       {
-         attr = g_slist_nth_data (default_attributes, j);
-         retval[i] = g_strconcat (attr->name, ":", attr->value, NULL);
-       }
+  atk_attribute_set_free (attributes);
+  if (default_attributes)
+    atk_attribute_set_free (default_attributes);
 
-      atk_attribute_set_free (attributes);
-      if (default_attributes)
-       atk_attribute_set_free (default_attributes);
-    }
-  reply = dbus_message_new_method_return (message);
-  if (reply)
-    {
-      dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
-                               DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_ARRAY,
-                               DBUS_TYPE_STRING, &retval, total_attributes,
-                               DBUS_TYPE_INVALID);
-    }
-  for (i = 0; i < total_attributes; i++)
-    g_free (retval[i]);
-  g_free (retval);
   return reply;
 }
 
 static DBusMessage *
 impl_getDefaultAttributeSet (DBusConnection * bus, DBusMessage * message,
-                            void *user_data)
+                             void *user_data)
 {
   AtkText *text = (AtkText *) user_data;
   DBusMessage *reply;
+  DBusMessageIter iter;
   AtkAttributeSet *attributes;
-  AtkAttribute *attr = NULL;
-  char **retval;
-  gint n_attributes = 0;
-  gint i;
 
   g_return_val_if_fail (ATK_IS_TEXT (user_data),
                         droute_not_yet_handled_error (message));
 
   attributes = atk_text_get_default_attributes (text);
-  if (attributes)
-    n_attributes = g_slist_length (attributes);
 
-  retval = g_new (char *, n_attributes);
-
-  for (i = 0; i < n_attributes; ++i)
-    {
-      attr = g_slist_nth_data (attributes, i);
-      retval[i] = g_strconcat (attr->name, ":", attr->value, NULL);
-    }
-  if (attributes)
-    atk_attribute_set_free (attributes);
   reply = dbus_message_new_method_return (message);
   if (reply)
     {
-      dbus_message_append_args (reply, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
-                               &retval, n_attributes, DBUS_TYPE_INVALID);
+      dbus_message_iter_init_append (reply, &iter);
+      spi_atk_append_attribute_set (&iter, attributes);
     }
-  for (i = 0; i < n_attributes; i++)
-    g_free (retval[i]);
-  g_free (retval);
+
+  if (attributes)
+    atk_attribute_set_free (attributes);
+
   return reply;
 }