Подробности
[В начало]
Проблема в реализации № 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
[В начало]