Have spi_initialize_introspectable take a verify function
[platform/core/uifw/at-spi2-atk.git] / libspi / dbus.c
index 9d1800c..7152b66 100644 (file)
 #include "accessible.h"
 #include <stdio.h>
 #include <stdlib.h>
-#include "dbus.h"
+#include <string.h>
 
 static GHashTable *path2ptr;
 static guint objindex;
 
 static void
-deregister_object (gpointer obj)
+deregister_object (gpointer data, GObject *obj)
 {
-  g_hash_table_remove (path2ptr, obj);
+  spi_dbus_notify_remove(ATK_OBJECT(obj), NULL);
+  g_hash_table_remove (path2ptr, &obj);
 }
 
 static guint
@@ -59,8 +60,9 @@ register_object (AtkObject * obj)
     *new_int = objindex;
     g_hash_table_insert (path2ptr, new_int, obj);
   }
-  g_object_set_data_full (G_OBJECT (obj), "dbus-id", (gpointer) objindex,
-                         deregister_object);
+  g_object_set_data (G_OBJECT (obj), "dbus-id", (gpointer) objindex);
+  g_object_weak_ref(G_OBJECT(obj), deregister_object, NULL);
+  spi_dbus_notify_change(obj, TRUE, NULL);
   return objindex;
 }
 
@@ -86,6 +88,7 @@ spi_dbus_get_object (const char *path)
 gchar *
 spi_dbus_get_path (AtkObject * obj)
 {
+  if (!obj) return NULL;
   guint index = (guint) g_object_get_data (G_OBJECT (obj), "dbus-id");
   if (!index)
     index = register_object (obj);
@@ -179,9 +182,22 @@ spi_dbus_initialize (DRouteData * data)
   spi_initialize_image (data);
   spi_initialize_selection (data);
   spi_initialize_table (data);
-  spi_initialize_tree (data);
   spi_initialize_text (data);
   spi_initialize_value (data);
+  spi_initialize_introspectable(data, (DRouteGetDatumFunction) spi_dbus_get_object);
+}
+
+void spi_dbus_emit_valist(DBusConnection *bus, const char *path, const char *interface, const char *name, int first_arg_type, va_list args)
+{
+  DBusMessage *sig;
+
+  sig = dbus_message_new_signal(path, interface, name);
+  if (first_arg_type != DBUS_TYPE_INVALID)
+  {
+    dbus_message_append_args_valist(sig, first_arg_type, args);
+  }
+  dbus_connection_send(bus, sig, NULL);
+  dbus_message_unref(sig);
 }
 
 static GString *
@@ -228,3 +244,68 @@ spi_get_tree (AtkObject * obj, GString * str, DRouteData * data)
   str = g_string_append (str, "</object>\n");
   return str;
 }
+
+dbus_bool_t spi_dbus_message_iter_get_struct(DBusMessageIter *iter, ...)
+{
+  va_list args;
+  DBusMessageIter iter_struct;
+  int type;
+  void *ptr;
+
+  dbus_message_iter_recurse(iter, &iter_struct);
+  va_start(args, iter);
+  for (;;)
+  {
+    type = va_arg(args, int);
+    if (type == DBUS_TYPE_INVALID) break;
+    if (type != dbus_message_iter_get_arg_type(&iter_struct))
+    {
+      va_end(args);
+      return FALSE;
+    }
+    ptr = va_arg(args, void *);
+    dbus_message_iter_get_basic(&iter_struct, ptr);
+    dbus_message_iter_next(&iter_struct);
+  }
+  dbus_message_iter_next(iter);
+  va_end(args);
+  return TRUE;
+}
+
+dbus_bool_t spi_dbus_message_iter_append_struct(DBusMessageIter *iter, ...)
+{
+  va_list args;
+  DBusMessageIter iter_struct;
+  int type;
+  void *ptr;
+
+  if (!dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT, NULL, &iter_struct)) return FALSE;
+  va_start(args, iter);
+  for (;;)
+  {
+    type = va_arg(args, int);
+    if (type == DBUS_TYPE_INVALID) break;
+    ptr = va_arg(args, void *);
+    dbus_message_iter_append_basic(&iter_struct, type, ptr);
+  }
+  if (!dbus_message_iter_close_container(iter, &iter_struct)) return FALSE;
+  va_end(args);
+  return TRUE;
+}
+
+dbus_bool_t spi_dbus_marshall_deviceEvent(DBusMessage *message, const Accessibility_DeviceEvent *e)
+{
+  DBusMessageIter iter;
+
+  if (!message) return FALSE;
+  dbus_message_iter_init_append(message, &iter);
+  return spi_dbus_message_iter_append_struct(&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT16, &e->hw_code, DBUS_TYPE_INT16, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID);
+}
+
+dbus_bool_t spi_dbus_demarshall_deviceEvent(DBusMessage *message, Accessibility_DeviceEvent *e)
+{
+  DBusMessageIter iter;
+
+  dbus_message_iter_init(message, &iter);
+  return spi_dbus_message_iter_get_struct(&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT16, &e->hw_code, DBUS_TYPE_INT16, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID);
+}