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