X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=libspi%2Fvalue.c;h=b022b59aaac28ea07aef3c9013172223d2cdfc02;hb=8e1a831f81570671c59e043e861b4bf4d2ec9754;hp=c099b2ca5cb4968d5eda5e11e3308bfc16cda54e;hpb=fd46827d0ef868929e7c255334b73adf2e305a85;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/libspi/value.c b/libspi/value.c index c099b2c..b022b59 100644 --- a/libspi/value.c +++ b/libspi/value.c @@ -2,7 +2,9 @@ * AT-SPI - Assistive Technology Service Provider Interface * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) * - * Copyright 2001 Sun Microsystems Inc. + * Copyright 2008 Novell, Inc. + * Copyright 2001, 2002 Sun Microsystems Inc., + * Copyright 2001, 2002 Ximian, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -20,145 +22,241 @@ * Boston, MA 02111-1307, USA. */ -/* value.c : implements the Value interface */ -#include -#include -#include +#include "accessible.h" +#include -/* Static function declarations */ - -static void -spi_value_class_init (SpiValueClass *klass); -static void -spi_value_init (SpiValue *value); -static CORBA_float -impl__get_minimumValue (PortableServer_Servant _servant, - CORBA_Environment * ev); -static CORBA_float -impl__get_maximumValue (PortableServer_Servant _servant, - CORBA_Environment * ev); -static CORBA_float -impl__get_currentValue (PortableServer_Servant _servant, - CORBA_Environment * ev); -static void -impl__set_currentValue (PortableServer_Servant _servant, - const CORBA_float value, - CORBA_Environment * ev); - - -BONOBO_TYPE_FUNC_FULL (SpiValue, - Accessibility_Value, - BONOBO_TYPE_OBJECT, - spi_value); - - -static void -spi_value_class_init (SpiValueClass *klass) +static AtkValue * +get_value_from_path (const char *path, void *user_data) { - POA_Accessibility_Value__epv *epv = &klass->epv; - - /* Initialize epv table */ - - epv->_get_minimumValue = impl__get_minimumValue; - epv->_get_maximumValue = impl__get_maximumValue; - epv->_get_currentValue = impl__get_currentValue; - epv->_set_currentValue = impl__set_currentValue; + AtkObject *obj = spi_dbus_get_object (path); + if (!obj || !ATK_IS_VALUE(obj)) + return NULL; + return ATK_VALUE (obj); } - -static void -spi_value_init (SpiValue *value) +static double +get_double_from_gvalue (GValue * gvalue) { + double retval = 0; + if (G_TYPE_IS_FUNDAMENTAL (G_VALUE_TYPE (gvalue))) + { + switch (gvalue->g_type) + { + case G_TYPE_DOUBLE: + retval = g_value_get_double (gvalue); + break; + case G_TYPE_FLOAT: + retval = g_value_get_float (gvalue); + break; + case G_TYPE_ULONG: + retval = g_value_get_ulong (gvalue); + break; + case G_TYPE_LONG: + retval = g_value_get_long (gvalue); + break; + case G_TYPE_UINT: + retval = g_value_get_uint (gvalue); + break; + case G_TYPE_INT: + retval = g_value_get_int (gvalue); + break; + case G_TYPE_UCHAR: + retval = g_value_get_uchar (gvalue); + break; + case G_TYPE_CHAR: + retval = g_value_get_char (gvalue); + break; + case G_TYPE_BOOLEAN: + retval = g_value_get_boolean (gvalue); + break; + } + } + else + { + g_warning ("SpiValue requested from a non-fundamental type\n"); + } + return retval; } - -SpiValue * -spi_value_interface_new (AtkObject *obj) +static gboolean +get_double_from_variant (DBusMessageIter * iter, double *out) { - SpiValue *new_value = g_object_new (SPI_VALUE_TYPE, NULL); + DBusMessageIter sub; - spi_base_construct (SPI_BASE (new_value), obj); - - return new_value; + dbus_message_iter_recurse (iter, &sub); + switch (dbus_message_iter_get_arg_type (&sub)) + { + case DBUS_TYPE_DOUBLE: + { + dbus_message_iter_get_basic (&sub, out); + return TRUE; + } + case DBUS_TYPE_UINT32: + { + dbus_uint32_t v; + dbus_message_iter_get_basic (&sub, &v); + *out = (double) v; + return TRUE; + } + case DBUS_TYPE_INT32: + { + dbus_int32_t v; + dbus_message_iter_get_basic (&sub, &v); + *out = (double) v; + return TRUE; + } + case DBUS_TYPE_UINT16: + { + dbus_uint16_t v; + dbus_message_iter_get_basic (&sub, &v); + *out = (double) v; + return TRUE; + } + case DBUS_TYPE_INT16: + { + dbus_int16_t v; + dbus_message_iter_get_basic (&sub, &v); + *out = (double) v; + return TRUE; + } + case DBUS_TYPE_BYTE: + { + char v; + dbus_message_iter_get_basic (&sub, &v); + *out = (double) v; + return TRUE; + } + case DBUS_TYPE_BOOLEAN: + { + dbus_bool_t v; + dbus_message_iter_get_basic (&sub, &v); + *out = (double) v; + return TRUE; + } + default: + return FALSE; + } } - -static AtkValue * -get_value_from_servant (PortableServer_Servant servant) +static void +gvalue_set_from_double (GValue * gvalue, double value) { - SpiBase *object = SPI_BASE (bonobo_object_from_servant (servant)); - - if (!object) + if (G_TYPE_IS_FUNDAMENTAL (G_VALUE_TYPE (gvalue))) { - return NULL; + switch (gvalue->g_type) + { + case G_TYPE_DOUBLE: + g_value_set_double (gvalue, value); + break; + case G_TYPE_FLOAT: + g_value_set_float (gvalue, value); + break; + case G_TYPE_ULONG: + g_value_set_ulong (gvalue, value); + break; + case G_TYPE_LONG: + g_value_set_long (gvalue, value); + break; + case G_TYPE_UINT: + g_value_set_uint (gvalue, value); + break; + case G_TYPE_INT: + g_value_set_int (gvalue, value); + break; + case G_TYPE_UCHAR: + g_value_set_uchar (gvalue, value); + break; + case G_TYPE_CHAR: + g_value_set_char (gvalue, value); + break; + case G_TYPE_BOOLEAN: + g_value_set_boolean (gvalue, ((fabs (value) > 0.5) ? 1 : 0)); + break; + } + } + else + { + g_warning ("SpiValue change requested for a non-fundamental type\n"); } - - return ATK_VALUE (object->atko); } - -static CORBA_float -impl__get_minimumValue (PortableServer_Servant servant, - CORBA_Environment *ev) +static dbus_bool_t +impl_get_minimumValue (const char *path, DBusMessageIter * iter, + void *user_data) { - GValue gvalue = {0, }; - AtkValue *value = get_value_from_servant (servant); - - g_return_val_if_fail (value != NULL, 0.0); - - g_value_init (&gvalue, G_TYPE_FLOAT); + AtkValue *value = get_value_from_path (path, user_data); + GValue gvalue = { 0, }; + if (!value) + return FALSE; atk_value_get_minimum_value (value, &gvalue); - - return (CORBA_float) g_value_get_float (&gvalue); + return droute_return_v_double (iter, get_double_from_gvalue (&gvalue)); } - -static CORBA_float -impl__get_maximumValue (PortableServer_Servant servant, - CORBA_Environment *ev) +static dbus_bool_t +impl_get_maximumValue (const char *path, DBusMessageIter * iter, + void *user_data) { - GValue gvalue = {0, }; - AtkValue *value = get_value_from_servant (servant); - - g_return_val_if_fail (value != NULL, 0.0); - - g_value_init (&gvalue, G_TYPE_FLOAT); + AtkValue *value = get_value_from_path (path, user_data); + GValue gvalue = { 0, }; + if (!value) + return FALSE; atk_value_get_maximum_value (value, &gvalue); - - return (CORBA_float) g_value_get_float (&gvalue); + return droute_return_v_double (iter, get_double_from_gvalue (&gvalue)); } - -static CORBA_float -impl__get_currentValue (PortableServer_Servant servant, - CORBA_Environment *ev) +static dbus_bool_t +impl_get_minimumIncrement (const char *path, DBusMessageIter * iter, + void *user_data) { - GValue gvalue = {0, }; - AtkValue *value = get_value_from_servant (servant); - - g_return_val_if_fail (value != NULL, 0.0); + AtkValue *value = get_value_from_path (path, user_data); + GValue gvalue = { 0, }; + if (!value) + return FALSE; + atk_value_get_minimum_value (value, &gvalue); + return droute_return_v_double (iter, get_double_from_gvalue (&gvalue)); +} - g_value_init (&gvalue, G_TYPE_FLOAT); +static dbus_bool_t +impl_get_currentValue (const char *path, DBusMessageIter * iter, + void *user_data) +{ + AtkValue *value = get_value_from_path (path, user_data); + GValue gvalue = { 0, }; + if (!value) + return FALSE; atk_value_get_current_value (value, &gvalue); - - return (CORBA_float) g_value_get_float (&gvalue); + return droute_return_v_double (iter, get_double_from_gvalue (&gvalue)); } - -static void -impl__set_currentValue (PortableServer_Servant servant, - const CORBA_float value, - CORBA_Environment *ev) +static dbus_bool_t +impl_set_currentValue (const char *path, DBusMessageIter * iter, + void *user_data) { - GValue gvalue = {0, }; - AtkValue *avalue = get_value_from_servant (servant); - - g_return_if_fail (avalue != NULL); - - g_value_init (&gvalue, G_TYPE_FLOAT); - g_value_set_float (&gvalue, (gfloat) value); - - atk_value_set_current_value (avalue, &gvalue); + AtkValue *value = get_value_from_path (path, user_data); + GValue gvalue = { 0, }; + double dbl; + + if (!value) + return FALSE; + if (!get_double_from_variant (iter, &dbl)) + return FALSE; + atk_value_get_current_value (value, &gvalue); + gvalue_set_from_double (&gvalue, dbl); + return TRUE; } +static DRouteProperty properties[] = { + {impl_get_minimumValue, NULL, "minimumValue"}, + {impl_get_maximumValue, NULL, "maximumValue"}, + {impl_get_minimumIncrement, NULL, "minimumIncrement"}, + {impl_get_currentValue, impl_set_currentValue, "currentValue"}, + {NULL, NULL, NULL} +}; +void +spi_initialize_value (DRouteData * data) +{ + droute_add_interface (data, "org.freedesktop.atspi.Value", NULL, + properties, + (DRouteGetDatumFunction) get_value_from_path, NULL); +};