}
dbus_message_iter_init (reply, &iter);
dbus_message_iter_recurse (&iter, &iter_variant);
+ g_object_unref(obj->accessible_parent);
obj->accessible_parent = _atspi_dbus_return_accessible_from_iter (&iter_variant);
dbus_message_unref (reply);
_atspi_accessible_add_cache (obj, ATSPI_CACHE_PARENT);
{
message = _atspi_dbus_call_partial (obj, atspi_interface_accessible,
"GetAttributes", error, "");
+ g_hash_table_unref(obj->attributes);
obj->attributes = _atspi_dbus_return_hash_from_message (message);
_atspi_accessible_add_cache (obj, ATSPI_CACHE_ATTRIBUTES);
}
g_free (e->name);
if (e->detail) g_free (e->detail);
callback_unref (callback);
+
+ for (int i=0; i < e->properties->len; i++)
+ g_free(g_array_index(e->properties, char*, i));
+
+ g_array_free(e->properties, TRUE);
+
g_free (e);
}
accessible = _atspi_dbus_return_accessible_from_iter (&iter_variant);
if (!strcmp (category, "ScreenReader"))
{
+ g_object_unref(e.source);
e.source = accessible;
if (e.source == NULL)
{
g_free (name);
g_free (detail);
g_object_unref (e.source);
+ g_object_unref (e.sender);
g_value_unset (&e.any_data);
return DBUS_HANDLER_RESULT_HANDLED;
}
static AtspiAccessible *desktop;
+static void cleanup_deferred_message (void);
+
static void
cleanup ()
{
bus = NULL;
}
+ cleanup_deferred_message();
+
if (!desktop)
return;
dbus_message_iter_get_basic (&iter_struct, &index);
if (index >= 0 && accessible->accessible_parent)
{
- if (index >= accessible->accessible_parent->children->len)
+ if (index >= accessible->accessible_parent->children->len) {
+ /* There is no room for this object */
g_ptr_array_set_size (accessible->accessible_parent->children, index + 1);
+ } else {
+ /* This place is already taken - let's free this place with dignity */
+ g_object_unref (g_ptr_array_index (accessible->accessible_parent->children, index));
+ }
g_ptr_array_index (accessible->accessible_parent->children, index) = g_object_ref (accessible);
}
static GQueue *deferred_messages = NULL;
+static void
+destroy_deferred_message_item(gpointer ptr)
+{
+ /* TODO this is still memory leak on c->data */
+ BusDataClosure *c = ptr;
+ dbus_message_unref (c->message);
+ dbus_connection_unref (c->bus);
+ g_free(c);
+}
+
+static void
+cleanup_deferred_message(void)
+{
+ g_queue_free_full(deferred_messages, destroy_deferred_message_item);
+ deferred_messages = NULL;
+}
+
static gboolean
process_deferred_messages (void)
{
}
if (!strcmp (type, "(so)"))
{
+ g_object_unref(*(AtspiAccessible**)data);
*((AtspiAccessible **)data) = _atspi_dbus_return_accessible_from_iter (&iter_variant);
}
else
{
+ if (type [0] == 's')
+ {
+ g_free(*(char**)data);
+ *(char**) data = NULL;
+ }
+
dbus_message_iter_get_basic (&iter_variant, data);
+
if (type [0] == 's')
*(char **)data = g_strdup (*(char **)data);
}
accessible->interfaces = 0;
if (strcmp (iter_sig, "as") != 0)
{
- g_warning ("_atspi_dbus_set_interfaces: Passed iterator with invalid signature %s", dbus_message_iter_get_signature (iter));
+ g_warning ("_atspi_dbus_set_interfaces: Passed iterator with invalid signature %s", iter_sig);
dbus_free (iter_sig);
return;
}
address = g_strdup (tmp_address);
dbus_message_unref (reply);
}
-
+
out:
dbus_connection_unref (session_bus);
return address;