X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=libspi%2Fvalue.c;h=b022b59aaac28ea07aef3c9013172223d2cdfc02;hb=cd5ac1cc95dd1dce2f8dc6aa617c9dd0d71a4291;hp=fcd0a20d045edf25df7b310a9f32d7011c79685a;hpb=0f5127d4190c958799a217626fdd1a6906d33122;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/libspi/value.c b/libspi/value.c index fcd0a20..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,224 +22,241 @@ * Boston, MA 02111-1307, USA. */ -/* value.c : implements the Value interface */ -#include -#include -#include +#include "accessible.h" +#include -#define PARENT_TYPE SPI_TYPE_BASE - -/* Static function declarations */ - -static Accessibility_SValue -gvalue_to_svalue (GValue *gvalue); -static void -spi_value_class_init (SpiValueClass *klass); -static void -spi_value_init (SpiValue *value); -static Accessibility_SValue -impl__get_minimumValue (PortableServer_Servant _servant, - CORBA_Environment * ev); -static Accessibility_SValue -impl__get_maximumValue (PortableServer_Servant _servant, - CORBA_Environment * ev); -static Accessibility_SValue -impl__get_currentValue (PortableServer_Servant _servant, - CORBA_Environment * ev); -static void -impl__set_currentValue (PortableServer_Servant _servant, - const Accessibility_SValue * value, - CORBA_Environment * ev); - - -BONOBO_TYPE_FUNC_FULL (SpiValue, - Accessibility_Value, - PARENT_TYPE, - spi_value); - - -static void -spi_value_class_init (SpiValueClass *klass) -{ - 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; -} - - -static void -spi_value_init (SpiValue *value) +static AtkValue * +get_value_from_path (const char *path, void *user_data) { + AtkObject *obj = spi_dbus_get_object (path); + if (!obj || !ATK_IS_VALUE(obj)) + return NULL; + return ATK_VALUE (obj); } - -SpiValue * -spi_value_interface_new (AtkObject *obj) +static double +get_double_from_gvalue (GValue * gvalue) { - SpiValue *new_value = g_object_new (SPI_VALUE_TYPE, NULL); - - spi_base_construct (SPI_BASE (new_value), obj); - - return new_value; + 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; } - -static AtkValue * -get_value_from_servant (PortableServer_Servant servant) +static gboolean +get_double_from_variant (DBusMessageIter * iter, double *out) { - SpiBase *object = SPI_BASE (bonobo_object_from_servant (servant)); + DBusMessageIter sub; - if (!object) + dbus_message_iter_recurse (iter, &sub); + switch (dbus_message_iter_get_arg_type (&sub)) { - return NULL; + 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; } - - return ATK_VALUE (object->atko); -} - -static Accessibility_SValue -gvalue_to_svalue (GValue *gvalue) -{ - Accessibility_SValue sval; - if (G_VALUE_HOLDS_DOUBLE (gvalue)) - { - sval._d = Accessibility_DOUBLEVAL; - sval._u.val_double = g_value_get_double (gvalue); - } - else if (G_VALUE_HOLDS_FLOAT (gvalue)) - { - sval._d = Accessibility_FLOATVAL; - sval._u.val_float = g_value_get_float (gvalue); - } - else if (G_VALUE_HOLDS_ULONG (gvalue)) - { - sval._d = Accessibility_ULONGVAL; - sval._u.val_ulong = g_value_get_ulong (gvalue); - } - else if (G_VALUE_HOLDS_LONG (gvalue)) - { - sval._d = Accessibility_LONGVAL; - sval._u.val_long = g_value_get_long (gvalue); - } - else if (G_VALUE_HOLDS_UINT (gvalue)) - { - sval._d = Accessibility_USHORTVAL; - sval._u.val_ushort = CLAMP (g_value_get_uint (gvalue), 0, G_MAXUSHORT); - } - else if (G_VALUE_HOLDS_INT (gvalue)) - { - sval._d = Accessibility_SHORTVAL; - sval._u.val_short = CLAMP (g_value_get_int (gvalue), G_MINSHORT, G_MAXSHORT); - } - else - { - sval._d = Accessibility_SHORTVAL; - sval._u.val_short = 0; - } - return sval; } static void -gvalue_set_from_svalue (GValue *gvalue, Accessibility_SValue *sval) +gvalue_set_from_double (GValue * gvalue, double value) { - switch (sval->_d) + if (G_TYPE_IS_FUNDAMENTAL (G_VALUE_TYPE (gvalue))) + { + 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 { - case Accessibility_DOUBLEVAL: - g_value_init (gvalue, G_TYPE_DOUBLE); - g_value_set_double (gvalue, sval->_u.val_double); - break; - case Accessibility_FLOATVAL: - g_value_init (gvalue, G_TYPE_FLOAT); - g_value_set_float (gvalue, sval->_u.val_float); - break; - case Accessibility_ULONGVAL: - g_value_init (gvalue, G_TYPE_ULONG); - g_value_set_ulong (gvalue, sval->_u.val_ulong); - break; - case Accessibility_LONGVAL: - g_value_init (gvalue, G_TYPE_LONG); - g_value_set_long (gvalue, sval->_u.val_long); - break; - case Accessibility_USHORTVAL: - g_value_init (gvalue, G_TYPE_UINT); - g_value_set_uint (gvalue, sval->_u.val_ushort); - break; - case Accessibility_SHORTVAL: - g_value_init (gvalue, G_TYPE_INT); - g_value_set_int (gvalue, sval->_u.val_short); - break; - default: - g_value_init (gvalue, G_TYPE_INT); - g_value_set_int (gvalue, 0); + g_warning ("SpiValue change requested for a non-fundamental type\n"); } } -static Accessibility_SValue -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, gvalue_to_svalue (&gvalue)); - - g_value_init (&gvalue, G_TYPE_DOUBLE); + AtkValue *value = get_value_from_path (path, user_data); + GValue gvalue = { 0, }; + if (!value) + return FALSE; atk_value_get_minimum_value (value, &gvalue); - - return gvalue_to_svalue (&gvalue); + return droute_return_v_double (iter, get_double_from_gvalue (&gvalue)); } - -static Accessibility_SValue -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, gvalue_to_svalue (&gvalue)); - - g_value_init (&gvalue, G_TYPE_DOUBLE); + AtkValue *value = get_value_from_path (path, user_data); + GValue gvalue = { 0, }; + if (!value) + return FALSE; atk_value_get_maximum_value (value, &gvalue); - - return gvalue_to_svalue (&gvalue); + return droute_return_v_double (iter, get_double_from_gvalue (&gvalue)); } - -static Accessibility_SValue -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, gvalue_to_svalue (&gvalue)); + 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_DOUBLE); +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 gvalue_to_svalue (&gvalue); + return droute_return_v_double (iter, get_double_from_gvalue (&gvalue)); } - -static void -impl__set_currentValue (PortableServer_Servant servant, - const Accessibility_SValue *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); - - gvalue_set_from_svalue (&gvalue, 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); +};