X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git;a=blobdiff_plain;f=libspi%2Fhyperlink.c;h=8491163233e871d5bef033c650711397eb508c63;hp=6d6bf5de5486bfd2a03b07d588562aeed5d25c14;hb=ae7080990bc816a73d86ba9957eee4d876f40a06;hpb=1549eff5b0fda58d3684a4a01953a2c9892f59f5 diff --git a/libspi/hyperlink.c b/libspi/hyperlink.c index 6d6bf5d..8491163 100644 --- a/libspi/hyperlink.c +++ b/libspi/hyperlink.c @@ -2,6 +2,7 @@ * AT-SPI - Assistive Technology Service Provider Interface * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) * + * Copyright 2008 Novell, Inc. * Copyright 2001, 2002 Sun Microsystems Inc., * Copyright 2001, 2002 Ximian, Inc. * @@ -21,207 +22,172 @@ * Boston, MA 02111-1307, USA. */ -/* hyperlink.c : implements the Hyperlink interface */ - -#include -#include -#include -#include -#include - -/* Static function declarations */ - -static void -spi_hyperlink_class_init (SpiHyperlinkClass *klass); -static void -spi_hyperlink_init (SpiHyperlink *hyperlink); -static CORBA_string -impl_getURI (PortableServer_Servant _servant, - const CORBA_long i, CORBA_Environment * ev); -static CORBA_short -impl__get_n_anchors (PortableServer_Servant _servant, - CORBA_Environment * ev); -static CORBA_long -impl__get_startIndex (PortableServer_Servant _servant, - CORBA_Environment * ev); -static CORBA_long -impl__get_endIndex (PortableServer_Servant _servant, - CORBA_Environment * ev); -static Accessibility_Accessible -impl_getObject (PortableServer_Servant _servant, - const CORBA_long i, - CORBA_Environment * ev); -static CORBA_boolean -impl_isValid (PortableServer_Servant _servant, - CORBA_Environment * ev); - - -BONOBO_TYPE_FUNC_FULL (SpiHyperlink, - Accessibility_Hyperlink, - SPI_TYPE_BASE, - spi_hyperlink) - - -static void -spi_hyperlink_class_init (SpiHyperlinkClass *klass) -{ - POA_Accessibility_Hyperlink__epv *epv = &klass->epv; - - /* Initialize epv table */ +#include "accessible.h" - epv->_get_nAnchors = impl__get_n_anchors; - epv->getURI = impl_getURI; - epv->_get_startIndex = impl__get_startIndex; - epv->_get_endIndex = impl__get_endIndex; - epv->getObject = impl_getObject; - epv->isValid = impl_isValid; +static AtkHyperlink * +get_hyperlink (DBusMessage * message) +{ + AtkObject *obj = spi_dbus_get_object (dbus_message_get_path (message)); + if (!obj) + return NULL; + return ATK_HYPERLINK (obj); } - -static void -spi_hyperlink_init (SpiHyperlink *hyperlink) +static AtkHyperlink * +get_hyperlink_from_path (const char *path, void *user_data) { + AtkObject *obj = spi_dbus_get_object (path); + if (!obj) + return NULL; + return ATK_HYPERLINK (obj); } - -SpiHyperlink * -spi_hyperlink_new (AtkHyperlink *object) +static dbus_bool_t +impl_get_nAnchors (const char *path, DBusMessageIter * iter, void *user_data) { - SpiHyperlink *new_hyperlink = g_object_new ( - SPI_HYPERLINK_TYPE, NULL); - - spi_base_construct (SPI_BASE (new_hyperlink), G_OBJECT(object)); - - /* - * some hyperlinks are actionable... this is an ATK convention - * that seems convenient though possibly poorly documented or unintended. - */ - if (ATK_IS_ACTION (object)) - { - /* - * NOTE: we don't cast 'object' to ATK_OBJECT in the call to - * spi_action_interface_new(), because of the above convention, - * even though it means we may be violating the func prototype. - * See discussion in bugzilla bug #120659. - * !!! - * IMPORTANT! The 'AtkObject' typecast, instead of the cast macro, - * is used below, because 'object' may NOT really be an AtkObject; - * it will be cast back to a G_OBJECT inside spi_action_interface_new - * before use, so this is OK though very ropey coding style. - */ - - /* Don't aggregate action twice... if this is from AtkHyperlinkImpl */ - if (!bonobo_object_query_interface (bonobo_object (new_hyperlink), "IDL:Accessibility/Action:1.0", - NULL)) - - bonobo_object_add_interface (bonobo_object (new_hyperlink), - BONOBO_OBJECT (spi_action_interface_new ((AtkObject *) object))); - } - return new_hyperlink; + AtkHyperlink *link = get_hyperlink_from_path (path, user_data); + if (!link) + return FALSE; + return droute_return_v_int32 (iter, atk_hyperlink_get_n_anchors (link)); } -static AtkHyperlink * -get_hyperlink_from_servant (PortableServer_Servant servant) +static char * +impl_get_nAnchors_str (void *datum) { - SpiBase *object = SPI_BASE (bonobo_object_from_servant (servant)); - - g_return_val_if_fail (object != NULL, NULL); - if (ATK_IS_HYPERLINK(object->gobj)) - { - return ATK_HYPERLINK (object->gobj); - } - else if (ATK_IS_HYPERLINK_IMPL(object->gobj)) - { - return atk_hyperlink_impl_get_hyperlink (ATK_HYPERLINK_IMPL (object->gobj)); - } - else - return NULL; + g_assert (ATK_IS_HYPERLINK (datum)); + return g_strdup_printf ("%d", + atk_hyperlink_get_n_anchors ((AtkHyperlink *) + datum)); } - -static CORBA_short -impl__get_n_anchors (PortableServer_Servant servant, - CORBA_Environment *ev) +static dbus_bool_t +impl_get_startIndex (const char *path, DBusMessageIter * iter, + void *user_data) { - AtkHyperlink *link = get_hyperlink_from_servant (servant); - - g_return_val_if_fail (link != NULL, 0); - - return atk_hyperlink_get_n_anchors (link); + AtkHyperlink *link = get_hyperlink_from_path (path, user_data); + if (!link) + return FALSE; + return droute_return_v_int32 (iter, atk_hyperlink_get_start_index (link)); } - -static CORBA_long -impl__get_startIndex (PortableServer_Servant servant, - CORBA_Environment *ev) +static char * +impl_get_startIndex_str (void *datum) { - AtkHyperlink *link = get_hyperlink_from_servant (servant); - - g_return_val_if_fail (link != NULL, -1); - - return atk_hyperlink_get_start_index (link); + g_assert (ATK_IS_HYPERLINK (datum)); + return g_strdup_printf ("%d", + atk_hyperlink_get_start_index ((AtkHyperlink *) + datum)); } - -static CORBA_long -impl__get_endIndex (PortableServer_Servant servant, - CORBA_Environment *ev) +static dbus_bool_t +impl_get_endIndex (const char *path, DBusMessageIter * iter, void *user_data) { - AtkHyperlink *link = get_hyperlink_from_servant (servant); - - g_return_val_if_fail (link != NULL, -1); - - return atk_hyperlink_get_end_index (link); + AtkHyperlink *link = get_hyperlink_from_path (path, user_data); + if (!link) + return FALSE; + return droute_return_v_int32 (iter, atk_hyperlink_get_end_index (link)); } - -static CORBA_string -impl_getURI (PortableServer_Servant servant, - const CORBA_long i, CORBA_Environment *ev) +static char * +impl_get_endIndex_str (void *datum) { - gchar *uri; - CORBA_char *rv; - AtkHyperlink *link = get_hyperlink_from_servant (servant); - - g_return_val_if_fail (link != NULL, CORBA_string_dup ("")); + g_assert (ATK_IS_HYPERLINK (datum)); + return g_strdup_printf ("%d", + atk_hyperlink_get_end_index ((AtkHyperlink *) + datum)); +} - uri = atk_hyperlink_get_uri (link, i); - if (uri) +static DBusMessage * +impl_getObject (DBusConnection * bus, DBusMessage * message, void *user_data) +{ + AtkHyperlink *link = get_hyperlink (message); + DBusError error; + dbus_int32_t i; + AtkObject *atk_object; + + if (!link) + return spi_dbus_general_error (message); + dbus_error_init (&error); + if (!dbus_message_get_args + (message, &error, DBUS_TYPE_INT32, &i, DBUS_TYPE_INVALID)) { - rv = CORBA_string_dup (uri); - g_free (uri); + return SPI_DBUS_RETURN_ERROR (message, &error); } - else - rv = CORBA_string_dup (""); - - return rv; -} - + atk_object = atk_hyperlink_get_object (link, i); + return spi_dbus_return_object (message, atk_object, FALSE); +} -static Accessibility_Accessible -impl_getObject (PortableServer_Servant servant, - const CORBA_long i, - CORBA_Environment *ev) +static DBusMessage * +impl_getURI (DBusConnection * bus, DBusMessage * message, void *user_data) { - AtkObject *atk_object; - AtkHyperlink *link = get_hyperlink_from_servant (servant); - - g_return_val_if_fail (link != NULL, CORBA_OBJECT_NIL); - - atk_object = atk_hyperlink_get_object (link, i); + AtkHyperlink *link = get_hyperlink (message); + dbus_int32_t i; + DBusError error; + gchar *rv; + DBusMessage *reply; + + if (!link) + return spi_dbus_general_error (message); + dbus_error_init (&error); + if (!dbus_message_get_args + (message, &error, DBUS_TYPE_INT32, &i, DBUS_TYPE_INT32, &i, + DBUS_TYPE_INVALID)) + { + return SPI_DBUS_RETURN_ERROR (message, &error); + } - return spi_accessible_new_return (atk_object, FALSE, ev); + rv = atk_hyperlink_get_uri (link, i); + if (!rv) + rv = g_strdup (""); + reply = dbus_message_new_method_return (message); + if (reply) + { + dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv, + DBUS_TYPE_INVALID); + } + g_free (rv); + return reply; } - -static CORBA_boolean -impl_isValid (PortableServer_Servant servant, - CORBA_Environment *ev) +static DBusMessage * +impl_isValid (DBusConnection * bus, DBusMessage * message, void *user_data) { - AtkHyperlink *link = get_hyperlink_from_servant (servant); + AtkHyperlink *link = get_hyperlink (message); + dbus_bool_t rv; + DBusMessage *reply; - g_return_val_if_fail (link != NULL, TRUE); + if (!link) + return spi_dbus_general_error (message); - return atk_hyperlink_is_valid (link); + rv = atk_hyperlink_is_valid (link); + reply = dbus_message_new_method_return (message); + if (reply) + { + dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv, + DBUS_TYPE_INVALID); + } + return reply; } +static DRouteMethod methods[] = { + {DROUTE_METHOD, impl_getObject, "getObject", "i,i,i:o,,o"}, + {DROUTE_METHOD, impl_getURI, "getURI", "i,i,i:s,,o"}, + {DROUTE_METHOD, impl_isValid, "isValid", "b,,o"}, + {0, NULL, NULL, NULL} +}; + +static DRouteProperty properties[] = { + {impl_get_nAnchors, impl_get_nAnchors_str, NULL, NULL, "nAnchors"}, + {impl_get_startIndex, impl_get_startIndex_str, NULL, NULL, "startIndex"}, + {impl_get_endIndex, impl_get_endIndex_str, NULL, NULL, "endIndex"}, + {NULL, NULL, NULL, NULL, NULL} +}; + +void +spi_initialize_hyperlink (DRouteData * data) +{ + droute_add_interface (data, "org.freedesktop.accessibility.Hyperlink", + methods, properties, + (DRouteGetDatumFunction) get_hyperlink_from_path, + NULL); +};