X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=libspi%2Fdbus.c;h=7152b66ae38d182cdc231730571198467fdc7659;hb=ed0f060efc9bd54f8798efeddc0babf2141cbc49;hp=3559e26065afd53247730e195fdeeb70032b7efb;hpb=0aa30525822402ed58647aa24b910921d43f4dbb;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/libspi/dbus.c b/libspi/dbus.c index 3559e26..7152b66 100644 --- a/libspi/dbus.c +++ b/libspi/dbus.c @@ -23,15 +23,16 @@ #include "accessible.h" #include #include -#include "dbus.h" +#include static GHashTable *path2ptr; static guint objindex; static void -deregister_object (gpointer obj) +deregister_object (gpointer data, GObject *obj) { - g_hash_table_remove (path2ptr, obj); + spi_dbus_notify_remove(ATK_OBJECT(obj), NULL); + g_hash_table_remove (path2ptr, &obj); } static guint @@ -59,8 +60,9 @@ register_object (AtkObject * obj) *new_int = objindex; g_hash_table_insert (path2ptr, new_int, obj); } - g_object_set_data_full (G_OBJECT (obj), "dbus-id", (gpointer) objindex, - deregister_object); + g_object_set_data (G_OBJECT (obj), "dbus-id", (gpointer) objindex); + g_object_weak_ref(G_OBJECT(obj), deregister_object, NULL); + spi_dbus_notify_change(obj, TRUE, NULL); return objindex; } @@ -83,9 +85,10 @@ spi_dbus_get_object (const char *path) return NULL; } -char * +gchar * spi_dbus_get_path (AtkObject * obj) { + if (!obj) return NULL; guint index = (guint) g_object_get_data (G_OBJECT (obj), "dbus-id"); if (!index) index = register_object (obj); @@ -181,6 +184,20 @@ spi_dbus_initialize (DRouteData * data) spi_initialize_table (data); spi_initialize_text (data); spi_initialize_value (data); + spi_initialize_introspectable(data, (DRouteGetDatumFunction) spi_dbus_get_object); +} + +void spi_dbus_emit_valist(DBusConnection *bus, const char *path, const char *interface, const char *name, int first_arg_type, va_list args) +{ + DBusMessage *sig; + + sig = dbus_message_new_signal(path, interface, name); + if (first_arg_type != DBUS_TYPE_INVALID) + { + dbus_message_append_args_valist(sig, first_arg_type, args); + } + dbus_connection_send(bus, sig, NULL); + dbus_message_unref(sig); } static GString * @@ -227,3 +244,68 @@ spi_get_tree (AtkObject * obj, GString * str, DRouteData * data) str = g_string_append (str, "\n"); return str; } + +dbus_bool_t spi_dbus_message_iter_get_struct(DBusMessageIter *iter, ...) +{ + va_list args; + DBusMessageIter iter_struct; + int type; + void *ptr; + + dbus_message_iter_recurse(iter, &iter_struct); + va_start(args, iter); + for (;;) + { + type = va_arg(args, int); + if (type == DBUS_TYPE_INVALID) break; + if (type != dbus_message_iter_get_arg_type(&iter_struct)) + { + va_end(args); + return FALSE; + } + ptr = va_arg(args, void *); + dbus_message_iter_get_basic(&iter_struct, ptr); + dbus_message_iter_next(&iter_struct); + } + dbus_message_iter_next(iter); + va_end(args); + return TRUE; +} + +dbus_bool_t spi_dbus_message_iter_append_struct(DBusMessageIter *iter, ...) +{ + va_list args; + DBusMessageIter iter_struct; + int type; + void *ptr; + + if (!dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT, NULL, &iter_struct)) return FALSE; + va_start(args, iter); + for (;;) + { + type = va_arg(args, int); + if (type == DBUS_TYPE_INVALID) break; + ptr = va_arg(args, void *); + dbus_message_iter_append_basic(&iter_struct, type, ptr); + } + if (!dbus_message_iter_close_container(iter, &iter_struct)) return FALSE; + va_end(args); + return TRUE; +} + +dbus_bool_t spi_dbus_marshall_deviceEvent(DBusMessage *message, const Accessibility_DeviceEvent *e) +{ + DBusMessageIter iter; + + if (!message) return FALSE; + dbus_message_iter_init_append(message, &iter); + return spi_dbus_message_iter_append_struct(&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT16, &e->hw_code, DBUS_TYPE_INT16, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID); +} + +dbus_bool_t spi_dbus_demarshall_deviceEvent(DBusMessage *message, Accessibility_DeviceEvent *e) +{ + DBusMessageIter iter; + + dbus_message_iter_init(message, &iter); + return spi_dbus_message_iter_get_struct(&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT16, &e->hw_code, DBUS_TYPE_INT16, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID); +}