*/
#include <stdlib.h> /* for malloc */
-#include <libspi/stateset.h>
+#include "spi-stateset.h"
#include <cspi/spi-private.h>
static const char *role_names [] =
"fooler",
"paragraph",
"ruler",
- "application"
+ "application",
+ "autocomplete",
+ "editbar",
+ "embedded",
+ "entry",
+ "chart",
+ "caption",
+ "document_frame",
+ "heading",
+ "page",
+ "section",
+ "form",
+ "redundant object",
+ "link",
+ "input method window"
};
#define MAX_ROLES (sizeof (role_names) / sizeof (char *))
role_table [Accessibility_ROLE_AUTOCOMPLETE] = SPI_ROLE_AUTOCOMPLETE;
role_table [Accessibility_ROLE_EDITBAR] = SPI_ROLE_EDITBAR;
role_table [Accessibility_ROLE_EMBEDDED] = SPI_ROLE_EMBEDDED;
+ role_table [Accessibility_ROLE_ENTRY] = SPI_ROLE_ENTRY;
+ role_table [Accessibility_ROLE_CHART] = SPI_ROLE_CHART;
+ role_table [Accessibility_ROLE_CAPTION] = SPI_ROLE_CAPTION;
+ role_table [Accessibility_ROLE_DOCUMENT_FRAME] = SPI_ROLE_DOCUMENT_FRAME;
+ role_table [Accessibility_ROLE_HEADING] = SPI_ROLE_HEADING;
+ role_table [Accessibility_ROLE_PAGE] = SPI_ROLE_PAGE;
+ role_table [Accessibility_ROLE_SECTION] = SPI_ROLE_SECTION;
+ role_table [Accessibility_ROLE_FORM] = SPI_ROLE_FORM;
+ role_table [Accessibility_ROLE_REDUNDANT_OBJECT] = SPI_ROLE_REDUNDANT_OBJECT;
+ role_table [Accessibility_ROLE_LINK] = SPI_ROLE_LINK;
+ role_table [Accessibility_ROLE_INPUT_METHOD_WINDOW] = SPI_ROLE_INPUT_METHOD_WINDOW;
return TRUE;
}
return cspi_role;
}
-static AccessibleAttributeSet *
-cspi_attribute_set_from_sequence (const Accessibility_AttributeSet *seq)
+AccessibleAttributeSet *
+_cspi_attribute_set_from_sequence (const GArray *seq)
{
AccessibleAttributeSet *set = g_new0 (AccessibleAttributeSet, 1);
int i;
- set->len = seq->_length;
- set->attributes = g_newa (char *, set->len);
+ set->len = seq->len;
+ set->attributes = g_new0 (char *, set->len);
for (i = 0; i < set->len; ++i)
{
- set->attributes[i] = g_strdup (seq->_buffer [i]);
+ set->attributes[i] = g_array_index (seq, char *, i);
}
+
+ g_array_free (seq, TRUE);
return set;
}
{
if (role < MAX_ROLES && role_names [(int) role])
{
- return CORBA_string_dup (role_names [(int) role]);
+ return g_strdup (role_names [(int) role]);
}
else
{
- return CORBA_string_dup ("");
+ return g_strdup ("");
}
}
char *
Accessible_getName (Accessible *obj)
{
- char *retval;
-
cspi_return_val_if_fail (obj != NULL, NULL);
-
- retval = Accessibility_Accessible__get_name (CSPI_OBJREF (obj), cspi_ev ());
-
- cspi_return_val_if_ev ("getName", NULL);
-
- return retval;
+ return g_strdup (obj->name);
}
/**
char *
Accessible_getDescription (Accessible *obj)
{
- char *retval;
-
cspi_return_val_if_fail (obj != NULL, NULL);
- retval = Accessibility_Accessible__get_description (CSPI_OBJREF (obj),
- cspi_ev ());
-
- cspi_return_val_if_ev ("getDescription", NULL);
-
- return retval;
+ return g_strdup (obj->description);
}
/**
Accessible *
Accessible_getParent (Accessible *obj)
{
- Accessible *retval;
-
cspi_return_val_if_fail (obj != NULL, NULL);
- retval = cspi_object_add (
- Accessibility_Accessible__get_parent (CSPI_OBJREF (obj),
- cspi_ev ()));
-
- cspi_return_val_if_ev ("getParent", NULL);
-
- return retval;
+ return cspi_object_add (obj->parent);
}
/**
long
Accessible_getChildCount (Accessible *obj)
{
- long retval;
-
cspi_return_val_if_fail (obj != NULL, -1);
- retval = Accessibility_Accessible__get_childCount (CSPI_OBJREF (obj),
- cspi_ev ());
-
- cspi_return_val_if_ev ("getChildCount", -1);
-
- return retval;
+ return g_list_length (obj->children);
}
/**
Accessible_getChildAtIndex (Accessible *obj,
long int childIndex)
{
- Accessible *retval;
+ Accessible *child;
cspi_return_val_if_fail (obj != NULL, NULL);
- retval = cspi_object_add (
- Accessibility_Accessible_getChildAtIndex (CSPI_OBJREF (obj),
- childIndex, cspi_ev ()));
-
- cspi_return_val_if_ev ("getChildAtIndex", NULL);
- return retval;
+ child = g_list_nth_data (obj->children, childIndex);
+ return cspi_object_add(child);
}
/**
long
Accessible_getIndexInParent (Accessible *obj)
{
- long retval;
+ GList *l;
+ gint i;
cspi_return_val_if_fail (obj != NULL, -1);
-
- retval = Accessibility_Accessible_getIndexInParent (CSPI_OBJREF (obj), cspi_ev ());
-
- cspi_return_val_if_ev ("getIndexInparent", -1);
- return retval;
+ if (!obj->parent) return -1;
+ l = obj->parent->children;
+ while (l)
+ {
+ if (l->data == obj) return i;
+ l = g_list_next (l);
+ i++;
+ }
+ return -1;
}
+typedef struct
+{
+ dbus_uint32_t type;
+ GArray *targets;
+} Accessibility_Relation;
+
/**
* Accessible_getRelationSet:
* @obj: a pointer to the #Accessible object on which to operate.
int i;
int n_relations;
AccessibleRelation **relations;
- Accessibility_RelationSet *relation_set;
+ GArray *relation_set;
+ DBusError error;
cspi_return_val_if_fail (obj != NULL, NULL);
g_assert (!cspi_exception ());
- relation_set =
- Accessibility_Accessible_getRelationSet (CSPI_OBJREF (obj), cspi_ev ());
+ dbus_error_init (&error);
+ cspi_dbus_call (obj, spi_interface_accessible, "getAttributes", &error, "=>a(uao)", &relation_set);
cspi_return_val_if_ev ("getRelationSet", NULL);
- n_relations = relation_set->_length;
+ n_relations = relation_set->len;
relations = malloc (sizeof (AccessibleRelation *) * (n_relations + 1));
for (i = 0; i < n_relations; ++i)
{
- relations[i] = cspi_object_add (CORBA_Object_duplicate (
- relation_set->_buffer[i], cspi_ev ()));
+ Accessibility_Relation *r = g_array_index (relation_set, Accessibility_Relation *, i);
+ relations[i] = g_new (AccessibleRelation, 1);
+ if (!relations[i]) continue;
+ relations[i]->ref_count = 1;
+ relations[i]->type = r->type;
+ relations[i]->targets = r->targets;
}
relations[i] = NULL;
- CORBA_free (relation_set);
+ g_array_free (relation_set, TRUE);
return relations;
}
AccessibleRole
Accessible_getRole (Accessible *obj)
{
- Accessibility_Role retval;
-
cspi_return_val_if_fail (obj != NULL, SPI_ROLE_INVALID);
- retval =
- Accessibility_Accessible_getRole (CSPI_OBJREF (obj), cspi_ev ());
-
- cspi_return_val_if_ev ("getRole", SPI_ROLE_INVALID);
-
- return cspi_role_from_spi_role (retval);
+ return obj->role;
}
/**
{
char *retval;
- cspi_return_val_if_fail (obj != NULL, CORBA_string_dup ("invalid"));
+ cspi_return_val_if_fail (obj != NULL, g_strdup ("invalid"));
- retval =
- Accessibility_Accessible_getRoleName (CSPI_OBJREF (obj), cspi_ev ());
+ cspi_dbus_call (obj, spi_interface_accessible, "getRoleName", NULL, "=>s", &retval);
- cspi_return_val_if_ev ("getRoleName", CORBA_string_dup ("invalid"));
+ cspi_return_val_if_ev ("getRoleName", g_strdup ("invalid"));
return retval;
}
{
char *retval;
- cspi_return_val_if_fail (obj != NULL, CORBA_string_dup ("invalid"));
+ cspi_return_val_if_fail (obj != NULL, g_strdup ("invalid"));
- retval =
- Accessibility_Accessible_getLocalizedRoleName (CSPI_OBJREF (obj), cspi_ev ());
+ cspi_dbus_call (obj, spi_interface_accessible, "getLocalizedRoleName", NULL, "=>s", &retval);
- cspi_return_val_if_ev ("getLocalizedRoleName", CORBA_string_dup ("invalid"));
+ cspi_return_val_if_ev ("getLocalizedRoleName", g_strdup ("invalid"));
return retval;
}
AccessibleStateSet *
Accessible_getStateSet (Accessible *obj)
{
+ GArray *state_bitflags;
AccessibleStateSet *retval;
- Accessibility_StateSet corba_stateset;
- Accessibility_StateSeq *corba_seq;
cspi_return_val_if_fail (obj != NULL, NULL);
- corba_stateset = Accessibility_Accessible_getState (
- CSPI_OBJREF (obj), cspi_ev ());
+ cspi_dbus_call (obj, spi_interface_accessible, "getStateSet", NULL, "=>au", &state_bitflags);
cspi_return_val_if_ev ("getState", NULL);
- cspi_return_val_if_fail (corba_stateset != CORBA_OBJECT_NIL, NULL);
- cspi_return_val_if_fail (cspi_ping (corba_stateset), NULL);
- corba_seq = Accessibility_StateSet_getStates (corba_stateset, cspi_ev ());
- cspi_return_val_if_ev ("getState", NULL);
-
- retval = spi_state_set_cache_new (corba_seq);
+ retval = spi_state_set_cache_new (state_bitflags);
- CORBA_free (corba_seq);
- cspi_release_unref (corba_stateset);
+ g_array_free (state_bitflags, TRUE);
return retval;
}
Accessible_getAttributes (Accessible *obj)
{
AccessibleAttributeSet *retval;
- Accessibility_AttributeSet *corba_seq;
+ GArray *dbus_seq;
cspi_return_val_if_fail (obj != NULL, NULL);
- corba_seq = Accessibility_Accessible_getAttributes (
- CSPI_OBJREF (obj), cspi_ev ());
+ cspi_dbus_call (obj, spi_interface_accessible, "getAttributes", NULL, "=>as", &dbus_seq);
+
cspi_return_val_if_ev ("getAttributes", NULL);
- retval = cspi_attribute_set_from_sequence (corba_seq);
- CORBA_free (corba_seq);
+ retval = _cspi_attribute_set_from_sequence (dbus_seq);
- return NULL;
+ return retval;
}
/**
AccessibleApplication *
Accessible_getHostApplication (Accessible *obj)
{
- AccessibleApplication *retval;
-
- cspi_return_val_if_fail (obj != NULL, NULL);
-
- retval = Accessible_getApplication (cspi_object_add (
- Accessibility_Accessible_getApplication (CSPI_OBJREF (obj),
- cspi_ev ())));
- cspi_return_val_if_ev ("getApplication", NULL);
-
- return retval;
+ while (obj->parent) obj = obj->parent;
+ return obj;
}
/* Interface query methods */
Accessible_isAction (Accessible *obj)
{
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/Action:1.0");
+ spi_interface_action);
}
/**
Accessible_isApplication (Accessible *obj)
{
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/Application:1.0");
+ spi_interface_application);
+}
+
+/**
+ * Accessible_isCollection: * @obj: a pointer to the #Accessible instance to query.
+ *
+ * Query whether the specified #Accessible implements #AccessibleCollection.
+ * Returns: #TRUE if @obj implements the #AccessibleCollection interface,
+ * #FALSE otherwise.
+ **/
+
+SPIBoolean
+Accessible_isCollection (Accessible *obj)
+{
+#if 0
+ g_warning ("Collections not implemented");
+ return cspi_accessible_is_a (obj,
+ spi_interface_collection);
+#else
+ return FALSE;
+#endif
}
/**
Accessible_isComponent (Accessible *obj)
{
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/Component:1.0");
+ spi_interface_component);
+}
+
+/**
+ * Accessible_isDocument:
+ * @obj: a pointer to the #Accessible instance to query.
+ *
+ * Query whether the specified #Accessible implements #AccessibleDocument.
+ *
+ * Returns: #TRUE if @obj implements the #AccessibleDocument interface,
+ * #FALSE otherwise.
+ **/
+SPIBoolean
+Accessible_isDocument (Accessible *obj)
+{
+ return cspi_accessible_is_a (obj,
+ spi_interface_document);
}
/**
Accessible_isEditableText (Accessible *obj)
{
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/EditableText:1.0");
+ spi_interface_editable_text);
+}
+
+/**
+ * Accessible_isMatchRule:
+ * @obj: a pointer to the #Accessible instance to query.
+ *
+ * Query whether the specified #Accessible implements #AccessibleMatchRule.
+ *
+ * Returns: #TRUE if @obj implements the #AccessibleMatchRule interface,
+ * #FALSE otherwise.
+ **/
+SPIBoolean
+Accessible_isMatchRule (Accessible *obj)
+{
+#if 0
+ return cspi_accessible_is_a (obj,
+ spi_interface_match_rule);
+#else
+ g_warning ("Match rules not implemented");
+ return FALSE;
+#endif
}
/**
Accessible_isHypertext (Accessible *obj)
{
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/Hypertext:1.0");
+ spi_interface_hypertext);
}
/**
Accessible_isImage (Accessible *obj)
{
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/Image:1.0");
+ spi_interface_image);
}
/**
Accessible_isSelection (Accessible *obj)
{
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/Selection:1.0");
+ spi_interface_selection);
}
/**
Accessible_isTable (Accessible *obj)
{
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/Table:1.0");
+ spi_interface_table);
}
/**
SPIBoolean
Accessible_isStreamableContent (Accessible *obj)
{
+#if 0
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/StreamableContent:1.0");
+ spi_interface_streamable_content);
+#else
+ g_warning ("Streamable content not implemented");
+ return FALSE;
+#endif
}
/**
Accessible_isText (Accessible *obj)
{
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/Text:1.0");
+ spi_interface_text);
}
/**
Accessible_isValue (Accessible *obj)
{
return cspi_accessible_is_a (obj,
- "IDL:Accessibility/Value:1.0");
+ spi_interface_value);
}
/**
Accessible_getApplication (Accessible *obj)
{
return (AccessibleApplication *) Accessible_queryInterface (
- obj, "IDL:Accessibility/Application:1.0");
+ obj, spi_interface_application);
}
/**
Accessible_getAction (Accessible *obj)
{
return (AccessibleAction *) Accessible_queryInterface (
- obj, "IDL:Accessibility/Action:1.0");
+ obj, spi_interface_action);
+}
+
+
+/**
+ * Accessible_getCollection:
+ * @obj: a pointer to the #Accessible instance to query.
+ *
+ * Get the #AccessibleCollection interface for an #Accessible.
+ *
+ * Returns: a pointer to an #AccessibleCollection interface instance, or
+ * NULL if @obj does not implement #AccessibleCollection.
+ **/
+AccessibleCollection *
+Accessible_getCollection (Accessible *obj)
+{
+#if 0
+ return (AccessibleCollection *) Accessible_queryInterface (
+ obj, spi_interface_collection);
+#else
+ g_warning ("Collections not implemented");
+#endif
}
/**
Accessible_getComponent (Accessible *obj)
{
return (AccessibleComponent *) Accessible_queryInterface (
- obj, "IDL:Accessibility/Component:1.0");
+ obj, spi_interface_component);
+}
+
+/**
+ * Accessible_getDocument:
+ * @obj: a pointer to the #Accessible instance to query.
+ *
+ * Get the #AccessibleDocument interface for an #Accessible.
+ *
+ * Returns: a pointer to an #AccessibleDocument interface instance, or
+ * NULL if @obj does not implement #AccessibleDocument.
+ **/
+AccessibleDocument *
+Accessible_getDocument (Accessible *obj)
+{
+ return (AccessibleDocument *) Accessible_queryInterface (
+ obj, spi_interface_document);
}
/**
Accessible_getEditableText (Accessible *obj)
{
return (AccessibleEditableText *) Accessible_queryInterface (
- obj, "IDL:Accessibility/EditableText:1.0");
+ obj, spi_interface_editable_text);
}
-
/**
* Accessible_getHypertext:
* @obj: a pointer to the #Accessible instance to query.
Accessible_getHypertext (Accessible *obj)
{
return (AccessibleHypertext *) Accessible_queryInterface (
- obj, "IDL:Accessibility/Hypertext:1.0");
+ obj, spi_interface_hypertext);
}
Accessible_getImage (Accessible *obj)
{
return (AccessibleImage *) Accessible_queryInterface (
- obj, "IDL:Accessibility/Image:1.0");
+ obj, spi_interface_image);
}
-
+/**
+ * Accessible_getMatchRule:
+ * @obj: a pointer to the #Accessible instance to query.
+ *
+ * Get the #AccessibleMatchRule interface for an #Accessible.
+ *
+ * Returns: a pointer to an #AccessibleMatchRule interface instance, or
+ * NULL if @obj does not implement #AccessibleMatchRule.
+ **/
+AccessibleMatchRule *
+Accessible_getMatchRule (Accessible *obj)
+{
+#if 0
+ return (AccessibleMatchRule *) Accessible_queryInterface (
+ obj, spi_interface_match_rule);
+#else
+ g_warning ("Match rules not supported");
+#endif
+}
/**
* Accessible_getSelection:
Accessible_getSelection (Accessible *obj)
{
return (AccessibleSelection *) Accessible_queryInterface (
- obj, "IDL:Accessibility/Selection:1.0");
+ obj, spi_interface_selection);
}
AccessibleStreamableContent *
Accessible_getStreamableContent (Accessible *obj)
{
+#if 0
return (AccessibleStreamableContent *) Accessible_queryInterface (
- obj, "IDL:Accessibility/StreamableContent:1.0");
+ obj, spi_interface_streamable_content);
+#else
+ g_warning ("Streamable content not supported");
+#endif
}
/**
Accessible_getTable (Accessible *obj)
{
return (AccessibleTable *) Accessible_queryInterface (
- obj, "IDL:Accessibility/Table:1.0");
+ obj, spi_interface_table);
}
/**
Accessible_getText (Accessible *obj)
{
return (AccessibleText *) Accessible_queryInterface (
- obj, "IDL:Accessibility/Text:1.0");
+ obj, spi_interface_text);
}
Accessible_getValue (Accessible *obj)
{
return (AccessibleValue *) Accessible_queryInterface (
- obj, "IDL:Accessibility/Value:1.0");
+ obj, spi_interface_value);
}
Accessible_queryInterface (Accessible *obj,
const char *interface_name)
{
- Bonobo_Unknown iface;
-
- if (!obj)
- {
- return NULL;
- }
-
- iface = Accessibility_Accessible_queryInterface (CSPI_OBJREF (obj),
- interface_name,
- cspi_ev ());
-
-
- cspi_return_val_if_ev ("queryInterface", NULL);
-
- /*
- * FIXME: we need to be fairly sure that references are going
- * to mach up if we are going to expose QueryInterface, ie. we
- * can't allow people to do:
- * b = a.qi ("b"); b.unref, b.unref to release a's reference.
- * this should be no real problem though for this level of API
- * user.
- */
-
- return cspi_object_add (iface);
+ if (cspi_accessible_is_a (obj, interface_name))
+ {
+ /* The original code called cspi_object_add(obj) instead, but gok and
+ * simple-at don't treat interfaces as references, so I'm confused
+ * and not going to replicate this bit of code */
+ return obj;
+ }
+ return NULL;
}
void
AccessibleRelation_ref (AccessibleRelation *obj)
{
- cspi_object_ref (obj);
+ obj->ref_count++;
}
/**
void
AccessibleRelation_unref (AccessibleRelation *obj)
{
- cspi_object_unref (obj);
+ obj->ref_count--;
+ if (obj->ref_count <= 0)
+ {
+ g_array_free (obj->targets, TRUE);
+ g_free (obj);
+ }
}
static SPIBoolean
relation_type_table [Accessibility_RELATION_EMBEDS] = SPI_RELATION_EMBEDS;
relation_type_table [Accessibility_RELATION_EMBEDDED_BY] = SPI_RELATION_EMBEDDED_BY;
relation_type_table [Accessibility_RELATION_POPUP_FOR] = SPI_RELATION_POPUP_FOR;
+ relation_type_table [Accessibility_RELATION_PARENT_WINDOW_OF] = SPI_RELATION_PARENT_WINDOW_OF;
+ relation_type_table [Accessibility_RELATION_DESCRIBED_BY] = SPI_RELATION_DESCRIBED_BY;
+ relation_type_table [Accessibility_RELATION_DESCRIPTION_FOR] = SPI_RELATION_DESCRIPTION_FOR;
return TRUE;
}
AccessibleRelationType
AccessibleRelation_getRelationType (AccessibleRelation *obj)
{
- Accessibility_RelationType retval;
-
cspi_return_val_if_fail (obj, SPI_RELATION_NULL);
- retval =
- Accessibility_Relation_getRelationType (CSPI_OBJREF (obj), cspi_ev());
- cspi_return_val_if_ev ("getRelationType", SPI_RELATION_NULL);
- return cspi_relation_type_from_spi_relation_type (retval);
+ return cspi_relation_type_from_spi_relation_type (obj->type);
}
/**
int
AccessibleRelation_getNTargets (AccessibleRelation *obj)
{
- int retval;
-
cspi_return_val_if_fail (obj, -1);
- retval = Accessibility_Relation_getNTargets (CSPI_OBJREF (obj), cspi_ev());
- cspi_return_val_if_ev ("getNTargets", -1);
- return retval;
+ return obj->targets->len;
}
/**
Accessible *
AccessibleRelation_getTarget (AccessibleRelation *obj, int i)
{
- Accessible *retval;
-
cspi_return_val_if_fail (obj, NULL);
- retval = cspi_object_add (
- Accessibility_Relation_getTarget (CSPI_OBJREF(obj),
- i, cspi_ev()));
- cspi_return_val_if_ev ("getTarget", NULL);
- return retval;
+ if (i < 0 || i >= obj->targets->len) return NULL;
+ return cspi_object_add (
+ g_array_index (obj->targets, Accessible *, i));
}
/**
}
static Accessibility_StateType
-spi_state_to_corba (AccessibleState state)
+spi_state_to_dbus (AccessibleState state)
{
#define MAP_STATE(a) \
case SPI_STATE_##a: \
MAP_STATE (TRUNCATED);
MAP_STATE (REQUIRED);
MAP_STATE (INVALID_ENTRY);
- MAP_STATE (SUPPORTS_AUTOCOMPLETE);
+ MAP_STATE (SUPPORTS_AUTOCOMPLETION);
MAP_STATE (SELECTABLE_TEXT);
MAP_STATE (IS_DEFAULT);
MAP_STATE (VISITED);
AccessibleStateSet_contains (AccessibleStateSet *obj,
AccessibleState state)
{
- return spi_state_set_cache_contains (obj, spi_state_to_corba (state));
+ return spi_state_set_cache_contains (obj, spi_state_to_dbus (state));
}
/**
AccessibleStateSet_add (AccessibleStateSet *obj,
AccessibleState state)
{
- spi_state_set_cache_add (obj, spi_state_to_corba (state));
+ spi_state_set_cache_add (obj, spi_state_to_dbus (state));
}
/**
AccessibleStateSet_remove (AccessibleStateSet *obj,
AccessibleState state)
{
- spi_state_set_cache_remove (obj, spi_state_to_corba (state));
+ spi_state_set_cache_remove (obj, spi_state_to_dbus (state));
}
/**
return spi_state_set_cache_is_empty (obj);
}
-