2009-06-11 Mark Doffman <mark.doffman@codethink.co.uk>
[platform/core/uifw/at-spi2-atk.git] / login-helper / login-helper.c
index 180ea93..68e5017 100644 (file)
 
 /* login-helper.c: minimal implementation of Accessibility_LoginHelper.idl */
 #include <config.h>
-#include <libbonobo.h>
 #include "login-helper.h"
+#include "spi-common/spi-dbus.h"
+#include "droute/droute.h"
 
 /* Our parent Gtk object type */
-#define PARENT_TYPE BONOBO_TYPE_OBJECT
+#define PARENT_TYPE G_TYPE_OBJECT
 
 /* A pointer to our parent object class */
-static BonoboObjectClass *bonobo_object_parent_class;
+static GObjectClass *g_object_parent_class;
 
 static void
 login_helper_finalize (GObject *object)
 {
-  (G_OBJECT_CLASS (bonobo_object_parent_class))->finalize (object);
+  (G_OBJECT_CLASS (g_object_parent_class))->finalize (object);
 }
 
 static gboolean
 login_helper_set_safe (LoginHelper *helper, gboolean safe)
 {
   LoginHelperClass *klass = LOGIN_HELPER_GET_CLASS (helper);
-  
+
   if (klass->set_safe)
     return (* klass->set_safe)(helper, safe);
   else
     return FALSE;
 }
 
-static CORBA_boolean
-impl_login_helper_set_safe (PortableServer_Servant servant,
-                           const CORBA_boolean safe,
-                           CORBA_Environment *ev)
+static DBusMessage *
+impl_set_safe (DBusConnection *bus, DBusMessage *message, void *user_data)
 {
-  LoginHelper *helper = LOGIN_HELPER (bonobo_object_from_servant (servant));
+  LoginHelper *helper = user_data;
+
+  DBusError error;
+  dbus_bool_t safe;
+  dbus_bool_t rv;
+  DBusMessage *reply;
 
-  return login_helper_set_safe (helper, safe);
+  dbus_error_init (&error);
+  if (!dbus_message_get_args
+      (message, &error, DBUS_TYPE_BOOLEAN, &safe, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rv = login_helper_set_safe (helper, safe);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv, DBUS_TYPE_INVALID);
+    }
+  return reply;
 }
 
 static LoginHelperDeviceReqFlags
 login_helper_get_device_reqs (LoginHelper *helper)
 {
   LoginHelperClass *klass = LOGIN_HELPER_GET_CLASS (helper);
-  
+
   if (klass->get_device_reqs)
     return  (* klass->get_device_reqs)(helper);
   else
     return 0;
 }
 
-static Accessibility_LoginHelper_DeviceReqList*
-impl_login_helper_get_device_reqs (PortableServer_Servant servant,
-                                  CORBA_Environment *ev)
+static DBusMessage *
+impl_get_device_reqs (DBusConnection *bus, DBusMessage *message, void *user_data)
 {
-  LoginHelper *helper = LOGIN_HELPER (bonobo_object_from_servant (servant));
-  LoginHelperDeviceReqFlags flags = 0;
-  gint n_reqs = 0, i = 1, j = 1;
-  Accessibility_LoginHelper_DeviceReqList *list;
+  LoginHelper *helper = user_data;
+  dbus_uint32_t flags = 0;
+  DBusMessage *reply;
 
   flags = login_helper_get_device_reqs (helper);
 
-  while (i <= LOGIN_HELPER_LAST_DEFINED) 
-  {
-      if (flags & i) n_reqs++;
-      i <<= 1;
-  }
-  
-  list = Accessibility_LoginHelper_DeviceReqList__alloc ();
-  list->_length = n_reqs; 
-  list->_buffer = Accessibility_LoginHelper_DeviceReqList_allocbuf (list->_length);
-
-  for (i = 0, j = 1; i < n_reqs; i++) 
-  {
-      Accessibility_LoginHelper_DeviceReq req;
-      while ((flags & j) == 0) {
-         j <<= 1;
-      }
-      switch (j)
-      {
-         case LOGIN_HELPER_GUI_EVENTS:
-             req = Accessibility_LoginHelper_GUI_EVENTS;
-             break;
-         case LOGIN_HELPER_CORE_KEYBOARD:
-             req = Accessibility_LoginHelper_CORE_KEYBOARD;
-             break;
-         case LOGIN_HELPER_CORE_POINTER:
-             req = Accessibility_LoginHelper_CORE_POINTER;
-             break;
-         case LOGIN_HELPER_EXT_INPUT:
-             req = Accessibility_LoginHelper_EXT_INPUT;
-             break;
-         case LOGIN_HELPER_POST_WINDOWS:
-             req = Accessibility_LoginHelper_POST_WINDOWS;
-             break;
-         case LOGIN_HELPER_AUDIO_OUT:
-             req = Accessibility_LoginHelper_AUDIO_OUT;
-             break;
-         case LOGIN_HELPER_AUDIO_IN:
-             req = Accessibility_LoginHelper_AUDIO_IN;
-             break;
-         case LOGIN_HELPER_NETWORK:
-             req = Accessibility_LoginHelper_NETWORK;
-             break;
-         case LOGIN_HELPER_LOCALHOST:
-             req = Accessibility_LoginHelper_LOCALHOST;
-             break;
-         case LOGIN_HELPER_SERIAL_OUT:
-             req = Accessibility_LoginHelper_SERIAL_OUT;
-             break;
-         case LOGIN_HELPER_SERIAL_IN:
-             req = Accessibility_LoginHelper_SERIAL_IN;
-             break;
-         default:
-             req = 0;
-             break;
-      }
-      list->_buffer[i] = req;
-      j <<= 1;
-  }  
-
-  return list;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_UINT32, &flags, DBUS_TYPE_INVALID);
+    }
+  return reply;
 }
 
 static Window*
@@ -154,62 +114,46 @@ login_helper_get_raise_windows (LoginHelper *helper)
     return NULL;
 }
 
-static Accessibility_LoginHelper_WindowList*
-impl_login_helper_get_raise_windows (PortableServer_Servant servant,
-                                    CORBA_Environment *ev)
+static DBusMessage *
+impl_get_raise_windows (DBusConnection *bus, DBusMessage *message, void *user_data)
 {
-  LoginHelper *helper = LOGIN_HELPER (bonobo_object_from_servant (servant));
+  LoginHelper *helper = user_data;
   unsigned long *wids;
-  Accessibility_LoginHelper_WindowList *windows;
+  gint count = 0;
+  DBusMessage *reply;
+  DBusMessageIter iter, iter_array;
 
   wids = login_helper_get_raise_windows (helper);
-
-  if (wids && *wids)
-    {
-      gint i, count = 0;
-      while (wids[count])
-       {
-         ++count;
-       }
-      windows = Accessibility_LoginHelper_WindowList__alloc ();
-      windows->_length = count;
-      windows->_buffer = Accessibility_LoginHelper_WindowList_allocbuf (windows->_length);
-      for (i = 0; i < count; ++i)
-       {
-          Accessibility_LoginHelper_WindowInfo winfo;
-         winfo.winID = wids[i];
-         windows->_buffer [i] = winfo;
-       }
-      g_free (wids);
-      return windows;
-    }
-  else
+  reply = dbus_message_new_method_return (message);
+  if (!reply) return NULL;
+  dbus_message_iter_init_append (message, &iter);
+  if (dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "i", &iter_array) && wids)
+  {
+    while (*wids)
     {
-      return NULL;
+      // TODO: figure out if this will break on 64-bit systems
+      dbus_int32_t id = *wids++;
+      dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_INT32, &id);
     }
+    dbus_message_iter_close_container (&iter, &iter_array);
+  }
+  if (wids) g_free (wids);
+  return reply;
 }
 
 static void
 login_helper_class_init (LoginHelperClass *klass)
 {
   GObjectClass * object_class = (GObjectClass *) klass;
-  POA_Accessibility_LoginHelper__epv *epv = &klass->epv;
 
-  bonobo_object_parent_class = g_type_class_peek_parent (klass);
+  g_object_parent_class = g_type_class_peek_parent (klass);
 
   object_class->finalize = login_helper_finalize;
-  
-  epv->getRaiseWindows = impl_login_helper_get_raise_windows;
-  epv->getDeviceReqs = impl_login_helper_get_device_reqs;
-  epv->setSafe = impl_login_helper_set_safe;
 }
 
 static void
-login_helper_init (GObject *object)
+login_helper_init (LoginHelper *object)
 {
 }
 
-BONOBO_TYPE_FUNC_FULL (LoginHelper,
-                      Accessibility_LoginHelper,
-                      PARENT_TYPE, login_helper)
-
+G_DEFINE_TYPE (LoginHelper, login_helper, PARENT_TYPE)