Подробности
[В начало]
Проблема в реализации № S0788
Краткое описание
atk_object_add_relationship не добавляет уже существующую связь, но возвращает TRUE
Подробное описание
Из описания функции
gboolean atk_object_add_relationship(AtkObject *object, AtkRelationType relationship, AtkObject *target):
Adds a relationship of the specified type with the specified target.
...
Returns : TRUE if the relationship is added.
Из документации не совсем понятно, в каких случаях связь может быть не добавлена в набор связей объекта. Однако если связь не добавлена по каким-либо причинам, функция должна вернуть FALSE.
В реализации, когда добавляемая связь уже содержится в наборе связей объекта, эта связь не добавляется, но функция возвращает TRUE, что является ошибкой. Приведенный ниже пример демонстрирует эту ситуацию.
Раздел стандарта
ATK 1.9.0 Reference Manual, AtkObject
Пример
#include <atk/atk.h>
#include <stdio.h>
//Return total number of object's relationships.
gint get_n_relationships(AtkObject* obj)
{
gint n_relationships = 0;
AtkRelationSet* relation_set = atk_object_ref_relation_set(obj);
gint nrelations = atk_relation_set_get_n_relations(relation_set);
for(gint i = 0; i < nrelations; i++)
{
AtkRelation* relation =
atk_relation_set_get_relation(relation_set, i);
GPtrArray* relationships = atk_relation_get_target(relation);
n_relationships += relationships->len;
}
g_object_unref(relation_set);
return n_relationships;
}
int main()
{
g_type_init();
AtkObject *obj = g_object_new(ATK_TYPE_OBJECT,NULL);
AtkObject *obj1 = g_object_new(ATK_TYPE_OBJECT,NULL);
AtkRelationType type = ATK_RELATION_CONTROLLED_BY;
atk_object_add_relationship(obj, type, obj1);
printf("Number of relationships after first call: %d.
",
get_n_relationships(obj));
gboolean result = atk_object_add_relationship(obj, type, obj1);
printf("Second call of atk_object_add_relationship returns %s.
",
result ? "TRUE" : "FALSE");
printf("Number of relationships after second call: %d.
",
get_n_relationships(obj));
g_object_unref(obj);
g_object_unref(obj1);
return 0;
}
Компонент
gtk-atk 1.25 or later
Принято
Gnome Bugzilla 578602
Статус
Исправлено в gtk-atk 2.5.4
[В начало]