Подробности

[В начало]

Проблема в реализации № 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

[В начало]