+ /* 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
+ * register object.
+ */
+ spi_global_register = g_object_new (SPI_REGISTER_TYPE, NULL);
+ spi_global_leasing = g_object_new (SPI_LEASING_TYPE, NULL);
+ spi_global_cache = g_object_new (SPI_CACHE_TYPE, NULL);
+
+ /* Register droute for routing AT-SPI messages */
+ spi_global_app_data->droute =
+ droute_new ();
+
+ treepath = droute_add_one (spi_global_app_data->droute,
+ "/org/a11y/atspi/cache", spi_global_cache);
+
+ if (!treepath)
+ {
+ g_warning ("atk-bridge: Error in droute_add_one(). Already running?");
+ return -1;
+ }
+
+ accpath = droute_add_many (spi_global_app_data->droute,
+ "/org/a11y/atspi/accessible",
+ NULL,
+ introspect_children_cb,
+ NULL,
+ (DRouteGetDatumFunction)
+ spi_global_register_path_to_object);
+
+
+ /* Register all interfaces with droute and set up application accessible db */
+ spi_initialize_cache (treepath);
+ spi_initialize_accessible (accpath);
+ spi_initialize_application (accpath);
+ spi_initialize_action (accpath);
+ spi_initialize_collection (accpath);
+ spi_initialize_component (accpath);
+ spi_initialize_document (accpath);
+ spi_initialize_editabletext (accpath);
+ spi_initialize_hyperlink (accpath);
+ 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);
+
+ droute_context_register (spi_global_app_data->droute,
+ spi_global_app_data->bus);
+
+ /* Register methods to send D-Bus signals on certain ATK events */
+ spi_atk_register_event_listeners ();
+
+ /* Set up filter and match rules to catch signals */
+ dbus_bus_add_match (spi_global_app_data->bus, "type='signal', interface='org.a11y.atspi.Registry', sender='org.a11y.atspi.Registry'", NULL);
+ dbus_connection_add_filter (spi_global_app_data->bus, signal_filter, NULL,
+ NULL);
+
+ /* 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);
+ else
+ get_registered_event_listeners (spi_global_app_data);
+
+ setup_bus();
+
+ return 0;