X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=atk-adaptor%2Fbridge.c;h=cb14c8a6c98696db42d8c0e393f51d90c69e73de;hb=73469041fcbb7b5e81d4ca3877f6614795a69e50;hp=e29314c310f115a52be9b59a44951e463c421c41;hpb=38b14df983445e90257e6c5bfae8baf18f31da51;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/atk-adaptor/bridge.c b/atk-adaptor/bridge.c index e29314c..cb14c8a 100644 --- a/atk-adaptor/bridge.c +++ b/atk-adaptor/bridge.c @@ -47,13 +47,6 @@ #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);