Install plug/socket hooks before initializing the cache
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / bridge.c
index a2ab66c..cbced24 100644 (file)
@@ -156,6 +156,31 @@ 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 gboolean
@@ -174,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);
@@ -305,7 +330,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.a11y.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);
     }
@@ -408,6 +433,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
@@ -450,6 +478,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);
@@ -457,11 +486,8 @@ adaptor_init (gint * argc, gchar ** argv[])
   /* Register methods to send D-Bus signals on certain ATK events */
   spi_atk_register_event_listeners ();
 
-  /* Hook our plug-and socket functions */
-  install_plug_hooks ();
-
   /* 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);