Install plug/socket hooks before initializing the cache
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / bridge.c
index 489f1b1..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);
@@ -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
@@ -458,9 +486,6 @@ 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 && (!root || !ATK_IS_PLUG (root)))
     register_application (spi_global_app_data);