Added a new boolean parameter to allow specifying when a call to
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / bridge.c
index e29314c..cb14c8a 100644 (file)
 
 #include "common/spi-dbus.h"
 
-/*
- * Provides the path for the introspection directory.
- */
-#if !defined ATSPI_INTROSPECTION_PATH
-#error "No introspection XML directory defined"
-#endif
-
 /*---------------------------------------------------------------------------*/
 
 SpiBridge *spi_global_app_data = NULL;
@@ -163,9 +156,34 @@ spi_atk_bridge_get_bus (void)
   return bus;
 }
 
+static void
+set_reply (DBusPendingCall *pending, void *user_data)
+{
+    void **replyptr = (void **)user_data;
+
+    *replyptr = dbus_pending_call_steal_reply (pending);
+}
+
+static DBusMessage *
+send_and_allow_reentry (DBusConnection *bus, DBusMessage *message, DBusError *error)
+{
+    DBusPendingCall *pending;
+    DBusMessage *reply = NULL;
+
+    if (!dbus_connection_send_with_reply (bus, message, &pending, -1))
+    {
+        return NULL;
+    }
+    dbus_pending_call_set_notify (pending, set_reply, (void *)&reply, NULL);
+    while (!reply)
+    {
+      if (!dbus_connection_read_write_dispatch (bus, -1)) return NULL;
+    }
+    return reply;
+}
 /*---------------------------------------------------------------------------*/
 
-static void
+static gboolean
 register_application (SpiBridge * app)
 {
   DBusMessage *message, *reply;
@@ -181,8 +199,8 @@ register_application (SpiBridge * app)
 
   dbus_message_iter_init_append (message, &iter);
   spi_object_append_reference (&iter, app->root);
-
-  reply = dbus_connection_send_with_reply_and_block (app->bus, message, -1, &error);
+  
+  reply = send_and_allow_reentry (app->bus, message, &error);
 
   if (message)
     dbus_message_unref (message);
@@ -192,15 +210,16 @@ register_application (SpiBridge * app)
       DBusMessageIter iter, iter_struct;
       gchar *app_name, *obj_path;
 
+      if (strcmp (dbus_message_get_signature (reply), "(so)") != 0)
+        {
+          g_warning ("AT-SPI: Could not obtain desktop path or name\n");
+          return FALSE;
+        }
+
       dbus_message_iter_init (reply, &iter);
       dbus_message_iter_recurse (&iter, &iter_struct);
-      if (!(dbus_message_iter_get_arg_type (&iter_struct) == DBUS_TYPE_STRING))
-            g_error ("AT-SPI: Could not obtain desktop path or name\n");
       dbus_message_iter_get_basic (&iter_struct, &app_name);
-      if (!dbus_message_iter_next (&iter_struct))
-            g_error ("AT-SPI: Could not obtain desktop name");
-      if (!(dbus_message_iter_get_arg_type (&iter_struct) == DBUS_TYPE_OBJECT_PATH))
-            g_error ("AT-SPI: Could not obtain desktop path");
+      dbus_message_iter_next (&iter_struct);
       dbus_message_iter_get_basic (&iter_struct, &obj_path);
 
       app->desktop_name = g_strdup (app_name);
@@ -208,9 +227,10 @@ register_application (SpiBridge * app)
     }
   else
     {
-      g_error ("AT-SPI: Could not embed inside desktop: %s\n", error.message);
+      g_warning ("AT-SPI: Could not embed inside desktop: %s\n", error.message);
+      return FALSE;
     }
-
+  return TRUE;
 }
 
 /*---------------------------------------------------------------------------*/
@@ -266,7 +286,6 @@ exit_func (void)
 
 /*---------------------------------------------------------------------------*/
 
-#ifdef SPI_ATK_PLUG_SOCKET
 static AtkPlugClass *plug_class;
 static AtkSocketClass *socket_class;
 
@@ -303,7 +322,7 @@ socket_embed_hook (AtkSocket * socket, gchar * plug_id)
     {
       DBusMessage *message;
       *(plug_path++) = '\0';
-      message = dbus_message_new_method_call (plug_name, plug_path, "org.freedesktop.atspi.Accessible", "Embedded");
+      message = dbus_message_new_method_call (plug_name, plug_path, SPI_DBUS_INTERFACE_SOCKET, "Embedded");
       dbus_message_append_args (message, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID);
       dbus_connection_send (spi_global_app_data->bus, message, NULL);
     }
@@ -323,7 +342,6 @@ install_plug_hooks ()
   plug_class->get_object_id = get_plug_id;
   socket_class->embed = socket_embed_hook;
 }
-#endif
 
 gchar *atspi_dbus_name = NULL;
 static gboolean atspi_no_register = FALSE;
@@ -407,6 +425,9 @@ adaptor_init (gint * argc, gchar ** argv[])
   dbus_connection_setup_with_g_main (spi_global_app_data->bus,
                                      g_main_context_default ());
 
+  /* Hook our plug-and socket functions */
+  install_plug_hooks ();
+
   /* 
    * Create the leasing, register and cache objects.
    * The order is important here, the cache depends on the
@@ -416,20 +437,21 @@ adaptor_init (gint * argc, gchar ** argv[])
   spi_global_leasing  = g_object_new (SPI_LEASING_TYPE, NULL);
   spi_global_cache    = g_object_new (SPI_CACHE_TYPE, NULL);
 
-  /* Get D-Bus introspection directory */
-  introspection_directory = (char *) g_getenv ("ATSPI_INTROSPECTION_PATH");
-  if (introspection_directory == NULL)
-    introspection_directory = ATSPI_INTROSPECTION_PATH;
-
   /* Register droute for routing AT-SPI messages */
   spi_global_app_data->droute =
-    droute_new (spi_global_app_data->bus, introspection_directory);
+    droute_new (spi_global_app_data->bus);
 
   treepath = droute_add_one (spi_global_app_data->droute,
-                             "/org/at_spi/cache", spi_global_cache);
+                             "/org/a11y/atspi/cache", spi_global_cache);
+
+  if (!treepath)
+    {
+      g_warning ("atk-bridge: Error in droute_add_one().  Already running?");
+      return 0;
+    }
 
   accpath = droute_add_many (spi_global_app_data->droute,
-                             "/org/freedesktop/atspi/accessible",
+                             "/org/a11y/atspi/accessible",
                              NULL,
                              (DRouteGetDatumFunction)
                              spi_global_register_path_to_object);
@@ -448,6 +470,7 @@ adaptor_init (gint * argc, gchar ** argv[])
   spi_initialize_hypertext (accpath);
   spi_initialize_image (accpath);
   spi_initialize_selection (accpath);
+  spi_initialize_socket (accpath);
   spi_initialize_table (accpath);
   spi_initialize_text (accpath);
   spi_initialize_value (accpath);
@@ -455,13 +478,8 @@ adaptor_init (gint * argc, gchar ** argv[])
   /* Register methods to send D-Bus signals on certain ATK events */
   spi_atk_register_event_listeners ();
 
-#ifdef SPI_ATK_PLUG_SOCKET
-  /* Hook our plug-and socket functions */
-  install_plug_hooks ();
-#endif
-
   /* Register this app by sending a signal out to AT-SPI registry daemon */
-  if (!atspi_no_register)
+  if (!atspi_no_register && (!root || !ATK_IS_PLUG (root)))
     register_application (spi_global_app_data);
 
   g_atexit (exit_func);