X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=registryd%2Fregistry.c;h=596e725b9c85f9c65510188fe5b2d040887c6719;hb=47792f3a747c8cbbaeb2505ce5d63ac8c8d2ca94;hp=9455e1fa7843af37dd69c2034e90d2d4448f6ea9;hpb=e879a45ddc5f82a93b2be5dcc00b8d6640d37b42;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/registryd/registry.c b/registryd/registry.c index 9455e1f..596e725 100644 --- a/registryd/registry.c +++ b/registryd/registry.c @@ -32,14 +32,14 @@ # include #endif -#include "../libspi/spi-private.h" +#include + #include "registry.h" #include "dbus/dbus-glib-lowlevel.h" /* Our parent GObject type */ #define PARENT_TYPE G_OBJECT_TYPE - int _dbg = 0; typedef enum { @@ -75,7 +75,7 @@ static void emit(SpiRegistry *registry, const char *name, int first_type, ...) va_list arg; va_start(arg, first_type); - spi_dbus_emit_valist(registry->droute.bus, SPI_DBUS_PATH_REGISTRY, SPI_DBUS_INTERFACE_REGISTRY, name, first_type, arg); + spi_dbus_emit_valist(registry->droute.bus, SPI_DBUS_PATH_DESKTOP, SPI_DBUS_INTERFACE_REGISTRY, name, first_type, arg); va_end(arg); } @@ -84,9 +84,9 @@ desktop_add_application (SpiDesktop *desktop, guint index, gpointer data) { SpiRegistry *registry = SPI_REGISTRY (data); - const char *name = g_list_nth_data(desktop->applications, index); + const SpiDesktopApplication *app = g_list_nth_data(desktop->applications, index); - emit(registry, "ApplicationAdd", DBUS_TYPE_UINT32, &index, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID); + emit(registry, "applicationAdd", DBUS_TYPE_UINT32, &index, DBUS_TYPE_STRING, &app->bus_name, DBUS_TYPE_INVALID); } @@ -96,9 +96,10 @@ desktop_remove_application (SpiDesktop *desktop, guint index, gpointer data) { SpiRegistry *registry = SPI_REGISTRY (data); - const char *name = g_list_nth_data(desktop->applications, index); + SpiDesktopApplication *app = g_list_nth_data(desktop->applications, index); - emit(registry, "ApplicationRemove", DBUS_TYPE_UINT32, &index, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID); + spi_dbus_remove_disconnect_match (registry->droute.bus, app->bus_name); + emit(registry, "applicationRemove", DBUS_TYPE_UINT32, &index, DBUS_TYPE_STRING, &app->bus_name, DBUS_TYPE_INVALID); } @@ -130,6 +131,8 @@ impl_accessibility_registry_register_application (DBusConnection *bus, DBusMessa #endif spi_desktop_add_application (registry->desktop, application); + spi_dbus_add_disconnect_match (registry->droute.bus, application); + /* * TODO: change the implementation below to a WM-aware one; * e.g. don't add all apps to the SpiDesktop @@ -234,7 +237,7 @@ impl_accessibility_registry_get_desktop_list (DBusConnection *bus, DBusMessage * if (!reply) return NULL; dbus_message_iter_init_append(reply, &iter); if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "o", &iter_array)) goto oom; - dbus_message_iter_append_basic(&iter_array, DBUS_TYPE_STRING, &path); + dbus_message_iter_append_basic(&iter_array, DBUS_TYPE_OBJECT_PATH, &path); if (!dbus_message_iter_close_container (&iter, &iter_array)) goto oom; return reply; oom: @@ -275,6 +278,28 @@ static DBusObjectPathVTable droute_vtable = NULL, NULL, NULL, NULL }; +DBusHandlerResult +disconnect_watch (DBusConnection *bus, DBusMessage *message, void *user_data) +{ + SpiRegistry *registry = SPI_REGISTRY (user_data); + const char *name, *old, *new; + + if (!dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) + { + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_STRING, &old, DBUS_TYPE_STRING, &new, DBUS_TYPE_INVALID)) + { + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + if (*old != '\0' && *new == '\0') + { + spi_desktop_remove_application (registry->desktop, old); + spi_remove_device_listeners (registry->de_controller, old); + } + return DBUS_HANDLER_RESULT_HANDLED; +} + static void spi_registry_init (SpiRegistry *registry) { @@ -298,6 +323,7 @@ spi_registry_init (SpiRegistry *registry) g_warning("Couldn't connect to dbus: %s\n", error.message); return; } + registry->droute.user_data = registry; spi_registry_initialize_registry_interface (®istry->droute); spi_registry_initialize_desktop_interface (®istry->droute); spi_registry_initialize_dec_interface (®istry->droute); @@ -322,6 +348,8 @@ spi_registry_init (SpiRegistry *registry) registry); registry->de_controller = spi_device_event_controller_new (registry); + + dbus_connection_add_filter (registry->droute.bus, disconnect_watch, registry, NULL); } SpiRegistry *