2009-06-11 Mark Doffman <mark.doffman@codethink.co.uk>
[platform/core/uifw/at-spi2-atk.git] / registryd / registry-main.c
index 2c72844..3b738af 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
-#ifdef AT_SPI_DEBUG
 #include <stdlib.h>
-#endif
-
-#include <gdk/gdk.h>
-#include <libbonobo.h>
+#include <config.h>
+#include <string.h>
 #include <glib/gmain.h>
+
+#include <spi-common/spi-dbus.h>
+#include <droute/droute.h>
+
 #include "registry.h"
+#include "deviceeventcontroller.h"
+
+#if !defined ATSPI_INTROSPECTION_PATH
+    #error "No introspection XML directory defined"
+#endif
+
+static gchar *dbus_name = NULL;
+
+static GOptionEntry optentries[] =
+{
+  {"dbus-name", 0, 0, G_OPTION_ARG_STRING, &dbus_name, "Well-known name to register with D-Bus", NULL},
+  {NULL}
+};
 
 int
 main (int argc, char **argv)
 {
-  int          ret;
-  char        *obj_id, *display_name;
-  char        *cp, *dp;
   SpiRegistry *registry;
-  GSList      *reg_env = NULL;
+  SpiDEController *dec;
+  DRouteContext *droute;
+  gchar *introspection_directory;
 
-  if (!bonobo_init (&argc, argv))
-    {
-      g_error ("Could not initialize oaf / Bonobo");
-    }
+  GMainLoop *mainloop;
+  DBusConnection *bus;
 
-  obj_id = "OAFIID:Accessibility_Registry:1.0";
+  GOptionContext *opt;
 
-  registry = spi_registry_new ();
+  GError *err = NULL;
+  DBusError error;
+  int ret;
 
-  display_name = g_getenv ("AT_SPI_DISPLAY");
-  if (!display_name)
+  g_type_init();
+
+  /* We depend on GDK as well as XLib for device event processing */
+  gdk_init(&argc, &argv);
+
+  /*Parse command options*/
+  opt = g_option_context_new(NULL);
+  g_option_context_add_main_entries(opt, optentries, NULL);
+
+  if (!g_option_context_parse(opt, &argc, &argv, &err))
+      g_error("Option parsing failed: %s\n", err->message);
+
+  if (dbus_name == NULL)
+      dbus_name = SPI_DBUS_NAME_REGISTRY;
+
+  dbus_error_init (&error);
+  bus = dbus_bus_get(DBUS_BUS_SESSION, &error);
+  if (!bus)
   {
-      display_name = g_strdup (gdk_display_get_name (gdk_display_get_default ()));
-      cp = strrchr (display_name, '.');
-      dp = strrchr (display_name, ':');
-      if (cp && dp && ((guint) cp > (guint) dp)) *cp = '\0';
+    g_warning("Couldn't connect to dbus: %s\n", error.message);
   }
 
-  reg_env = bonobo_activation_registration_env_set ( reg_env, "AT_SPI_DISPLAY", 
-                                                    display_name);
-  ret = bonobo_activation_register_active_server (
-         obj_id,
-         bonobo_object_corba_objref (bonobo_object (registry)),
-         reg_env);
-  bonobo_activation_registration_env_free (reg_env);
+  mainloop = g_main_loop_new (NULL, FALSE);
+  dbus_connection_setup_with_g_main(bus, g_main_context_default());
 
-  if (ret != Bonobo_ACTIVATION_REG_SUCCESS)
+  ret = dbus_bus_request_name(bus, dbus_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error);
+  if (ret == DBUS_REQUEST_NAME_REPLY_EXISTS)
     {
-#ifdef AT_SPI_DEBUG
-      fprintf (stderr, "SpiRegistry Message: SpiRegistry daemon was already running.\n");
-#endif
+      g_error("Could not obtain D-Bus name - %s\n", dbus_name);
     }
   else
     {
-#ifdef AT_SPI_DEBUG
-      fprintf (stderr, "SpiRegistry Message: SpiRegistry daemon is running.\n");
-#endif
-      bonobo_main ();
+      g_print ("SpiRegistry daemon is running with well-known name - %s\n", dbus_name);
     }
 
+  /* Get D-Bus introspection directory */
+  introspection_directory = (char *) g_getenv("ATSPI_INTROSPECTION_PATH");
+  if (introspection_directory == NULL)
+      introspection_directory = ATSPI_INTROSPECTION_PATH;
+
+  /* Set up D-Route for use by the dec */
+  droute = droute_new (bus, introspection_directory);
+
+  registry = spi_registry_new (bus, droute);
+  dec = spi_registry_dec_new (registry, bus, droute);
+
+  g_main_loop_run (mainloop);
   return 0;
 }
-