コード例 #1
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void remove_text_multi_value_removes_when_one(void **state)
{
    form_init_module();

    DataForm *form = _new_form();
    g_hash_table_insert(form->tag_to_var, strdup("tag1"), strdup("var1"));

    FormField *field1 = _new_field();
    field1->var = strdup("var1");
    field1->type_t = FIELD_LIST_MULTI;
    field1->values = g_slist_append(field1->values, strdup("value4"));
    form->fields = g_slist_append(form->fields, field1);

    gboolean res = form_remove_text_multi_value(form, "tag1", 1);

    int length = -1;
    GSList *curr_field = form->fields;
    while (curr_field != NULL) {
        FormField *field = curr_field->data;
        if (g_strcmp0(field->var, "var1") == 0) {
            length = g_slist_length(field->values);
        }
        curr_field = g_slist_next(curr_field);
    }

    assert_true(res);
    assert_int_equal(length, 0);

    form_destroy(form);
}
コード例 #2
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void get_form_type_field_returns_value_when_present(void **state)
{
    form_init_module();

    DataForm *form = _new_form();

    FormField *field1 = _new_field();
    field1->var = strdup("var1");
    field1->values = g_slist_append(field1->values, strdup("value1"));
    form->fields = g_slist_append(form->fields, field1);

    FormField *field2 = _new_field();
    field2->var = strdup("FORM_TYPE");
    field2->values = g_slist_append(field2->values, strdup("value2"));
    form->fields = g_slist_append(form->fields, field2);

    FormField *field3 = _new_field();
    field3->var = strdup("var3");
    field3->values = g_slist_append(field3->values, strdup("value3"));
    form->fields = g_slist_append(form->fields, field3);

    char *result = form_get_form_type_field(form);

    assert_string_equal(result, "value2");

    form_destroy(form);
}
コード例 #3
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void get_field_type_returns_correct_type(void **state)
{
    form_init_module();

    DataForm *form = _new_form();
    g_hash_table_insert(form->tag_to_var, strdup("tag1"), strdup("var1"));
    g_hash_table_insert(form->tag_to_var, strdup("tag2"), strdup("var2"));

    FormField *field1 = _new_field();
    field1->var = strdup("var1");
    field1->type_t = FIELD_TEXT_SINGLE;
    field1->values = g_slist_append(field1->values, strdup("value1"));
    form->fields = g_slist_append(form->fields, field1);

    FormField *field2 = _new_field();
    field2->var = strdup("var2");
    field2->type_t = FIELD_TEXT_MULTI;
    field2->values = g_slist_append(field2->values, strdup("value2"));
    form->fields = g_slist_append(form->fields, field2);

    form_field_type_t result = form_get_field_type(form, "tag2");

    assert_int_equal(result, FIELD_TEXT_MULTI);

    form_destroy(form);
}
コード例 #4
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void add_value_adds_when_none(void **state)
{
    form_init_module();

    DataForm *form = _new_form();
    g_hash_table_insert(form->tag_to_var, strdup("tag1"), strdup("var1"));

    FormField *field1 = _new_field();
    field1->var = strdup("var1");
    field1->type_t = FIELD_LIST_MULTI;
    form->fields = g_slist_append(form->fields, field1);

    form_add_value(form, "tag1", "somevalue");

    int length = 0;
    char *value = NULL;
    GSList *curr_field = form->fields;
    while (curr_field != NULL) {
        FormField *field = curr_field->data;
        if (g_strcmp0(field->var, "var1") == 0) {
            length = g_slist_length(field->values);
            value = field->values->data;
            break;
        }
        curr_field = g_slist_next(curr_field);
    }

    assert_int_equal(length, 1);
    assert_string_equal(value, "somevalue");

    form_destroy(form);
}
コード例 #5
0
ファイル: window.c プロジェクト: AlexTalker/profanity
void
win_free(ProfWin* window)
{
    buffer_free(window->buffer);
    delwin(window->win);

    switch (window->type) {
    case WIN_CONSOLE:
        if (window->wins.cons.subwin) {
            delwin(window->wins.cons.subwin);
        }
        break;
    case WIN_MUC:
        if (window->wins.muc.subwin) {
            delwin(window->wins.muc.subwin);
        }
        break;
    default:
        break;
    }

    if (window->type == WIN_CHAT) {
        free(window->wins.chat.resource);
    }

    free(window->from);

    if (window->type == WIN_MUC_CONFIG) {
        form_destroy(window->wins.conf.form);
    }

    free(window);
}
コード例 #6
0
ファイル: window.c プロジェクト: sizeofvoid/profanity
void
win_free(ProfWin* window)
{
    if (window->layout->type == LAYOUT_SPLIT) {
        ProfLayoutSplit *layout = (ProfLayoutSplit*)window->layout;
        if (layout->subwin) {
            delwin(layout->subwin);
        }
        buffer_free(layout->base.buffer);
        delwin(layout->base.win);
    } else {
        buffer_free(window->layout->buffer);
        delwin(window->layout->win);
    }
    free(window->layout);

    switch (window->type) {
    case WIN_CHAT:
    {
        ProfChatWin *chatwin = (ProfChatWin*)window;
        free(chatwin->barejid);
        free(chatwin->resource_override);
        chat_state_free(chatwin->state);
        break;
    }
    case WIN_MUC:
    {
        ProfMucWin *mucwin = (ProfMucWin*)window;
        free(mucwin->roomjid);
        break;
    }
    case WIN_MUC_CONFIG:
    {
        ProfMucConfWin *mucconf = (ProfMucConfWin*)window;
        free(mucconf->roomjid);
        form_destroy(mucconf->form);
        break;
    }
    case WIN_PRIVATE:
    {
        ProfPrivateWin *privatewin = (ProfPrivateWin*)window;
        free(privatewin->fulljid);
        break;
    }
    case WIN_PLUGIN:
    {
        ProfPluginWin *pluginwin = (ProfPluginWin*)window;
        free(pluginwin->tag);
        free(pluginwin->plugin_name);
        break;
    }
    default:
        break;
    }

    free(window);
}
コード例 #7
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void get_form_type_field_returns_null_no_fields(void **state)
{
    form_init_module();

    DataForm *form = _new_form();

    char *result = form_get_form_type_field(form);

    assert_null(result);

    form_destroy(form);
}
コード例 #8
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void get_field_type_returns_unknown_when_no_fields(void **state)
{
    form_init_module();

    DataForm *form = _new_form();

    form_field_type_t result = form_get_field_type(form, "tag");

    assert_int_equal(result, FIELD_UNKNOWN);

    form_destroy(form);
}
コード例 #9
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void add_unique_value_adds_when_doesnt_exist(void **state)
{
    form_init_module();

    DataForm *form = _new_form();
    g_hash_table_insert(form->tag_to_var, strdup("tag1"), strdup("var1"));
    g_hash_table_insert(form->tag_to_var, strdup("tag2"), strdup("var2"));

    FormField *field1 = _new_field();
    field1->var = strdup("var1");
    field1->type_t = FIELD_JID_MULTI;
    field1->values = g_slist_append(field1->values, strdup("*****@*****.**"));
    field1->values = g_slist_append(field1->values, strdup("*****@*****.**"));
    field1->values = g_slist_append(field1->values, strdup("*****@*****.**"));
    form->fields = g_slist_append(form->fields, field1);

    FormField *field2 = _new_field();
    field2->var = strdup("var2");
    field2->type_t = FIELD_LIST_SINGLE;
    field2->values = g_slist_append(field2->values, strdup("value2"));
    form->fields = g_slist_append(form->fields, field2);

    gboolean ret = form_add_unique_value(form, "tag1", "*****@*****.**");

    int length = 0;
    int count = 0;
    GSList *curr_field = form->fields;
    while (curr_field != NULL) {
        FormField *field = curr_field->data;
        if (g_strcmp0(field->var, "var1") == 0) {
            length = g_slist_length(field->values);
            GSList *curr_value = field->values;
            while (curr_value != NULL) {
                if (g_strcmp0(curr_value->data, "*****@*****.**") == 0) {
                    count++;
                }
                curr_value = g_slist_next(curr_value);
            }
            break;
        }
        curr_field = g_slist_next(curr_field);
    }

    assert_true(ret);
    assert_int_equal(length, 4);
    assert_int_equal(count, 1);

    form_destroy(form);
}
コード例 #10
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void get_form_type_field_returns_null_when_not_present(void **state)
{
    form_init_module();

    DataForm *form = _new_form();
    FormField *field = _new_field();
    field->var = strdup("var1");
    field->values = g_slist_append(field->values, strdup("value1"));
    form->fields = g_slist_append(form->fields, field);

    char *result = form_get_form_type_field(form);

    assert_null(result);

    form_destroy(form);
}
コード例 #11
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void remove_text_multi_value_does_nothing_when_doesnt_exist(void **state)
{
    form_init_module();

    DataForm *form = _new_form();
    g_hash_table_insert(form->tag_to_var, strdup("tag1"), strdup("var1"));

    FormField *field1 = _new_field();
    field1->var = strdup("var1");
    field1->type_t = FIELD_LIST_MULTI;
    field1->values = g_slist_append(field1->values, strdup("value1"));
    field1->values = g_slist_append(field1->values, strdup("value2"));
    field1->values = g_slist_append(field1->values, strdup("value3"));
    field1->values = g_slist_append(field1->values, strdup("value4"));
    form->fields = g_slist_append(form->fields, field1);

    gboolean res = form_remove_text_multi_value(form, "tag1", 5);

    int length = -1;
    int value_count = 0;
    GSList *curr_field = form->fields;
    while (curr_field != NULL) {
        FormField *field = curr_field->data;
        if (g_strcmp0(field->var, "var1") == 0) {
            length = g_slist_length(field->values);
            GSList *curr_value = field->values;
            while (curr_value != NULL) {
                if (g_strcmp0(curr_value->data, "value5") == 0) {
                    value_count++;
                }
                curr_value = g_slist_next(curr_value);
            }
        }
        curr_field = g_slist_next(curr_field);
    }

    assert_false(res);
    assert_int_equal(length, 4);
    assert_int_equal(value_count, 0);

    form_destroy(form);
}
コード例 #12
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void add_value_adds_when_exists(void **state)
{
    form_init_module();

    DataForm *form = _new_form();
    g_hash_table_insert(form->tag_to_var, strdup("tag1"), strdup("var1"));

    FormField *field1 = _new_field();
    field1->var = strdup("var1");
    field1->type_t = FIELD_LIST_MULTI;
    field1->values = g_slist_append(field1->values, strdup("some text"));
    field1->values = g_slist_append(field1->values, strdup("some more text"));
    field1->values = g_slist_append(field1->values, strdup("yet some more text"));
    field1->values = g_slist_append(field1->values, strdup("new value"));
    form->fields = g_slist_append(form->fields, field1);

    form_add_value(form, "tag1", "new value");

    int num_values = 0;
    int new_value_count = 0;
    GSList *curr_field = form->fields;
    while (curr_field != NULL) {
        FormField *field = curr_field->data;
        if (g_strcmp0(field->var, "var1") == 0) {
            GSList *curr_value = field->values;
            while (curr_value != NULL) {
                num_values++;
                if (g_strcmp0(curr_value->data, "new value") == 0) {
                    new_value_count++;
                }
                curr_value = g_slist_next(curr_value);
            }
            break;
        }
        curr_field = g_slist_next(curr_field);
    }

    assert_int_equal(num_values, 5);
    assert_int_equal(new_value_count, 2);

    form_destroy(form);
}
コード例 #13
0
ファイル: test_form.c プロジェクト: AlexTalker/profanity
void add_unique_value_does_nothing_when_exists(void **state)
{
    form_init_module();

    DataForm *form = _new_form();
    g_hash_table_insert(form->tag_to_var, strdup("tag1"), strdup("var1"));
    g_hash_table_insert(form->tag_to_var, strdup("tag2"), strdup("var2"));

    FormField *field1 = _new_field();
    field1->var = strdup("var1");
    field1->type_t = FIELD_JID_MULTI;
    field1->values = g_slist_append(field1->values, strdup("*****@*****.**"));
    form->fields = g_slist_append(form->fields, field1);

    FormField *field2 = _new_field();
    field2->var = strdup("var2");
    field2->type_t = FIELD_LIST_SINGLE;
    field2->values = g_slist_append(field2->values, strdup("value2"));
    form->fields = g_slist_append(form->fields, field2);

    gboolean ret = form_add_unique_value(form, "tag1", "*****@*****.**");

    int length = 0;
    char *value = NULL;
    GSList *curr_field = form->fields;
    while (curr_field != NULL) {
        FormField *field = curr_field->data;
        if (g_strcmp0(field->var, "var1") == 0) {
            length = g_slist_length(field->values);
            value = field->values->data;
            break;
        }
        curr_field = g_slist_next(curr_field);
    }

    assert_false(ret);
    assert_int_equal(length, 1);
    assert_string_equal(value, "*****@*****.**");

    form_destroy(form);
}
コード例 #14
0
ファイル: window.c プロジェクト: strugee/profanity
void
win_free(ProfWin* window)
{
    if (window->layout->type == LAYOUT_SPLIT) {
        ProfLayoutSplit *layout = (ProfLayoutSplit*)window->layout;
        if (layout->subwin) {
            delwin(layout->subwin);
        }
        buffer_free(layout->base.buffer);
        delwin(layout->base.win);
    } else {
        buffer_free(window->layout->buffer);
        delwin(window->layout->win);
    }
    free(window->layout);

    if (window->type == WIN_CHAT) {
        ProfChatWin *chatwin = (ProfChatWin*)window;
        free(chatwin->barejid);
        free(chatwin->resource_override);
        chat_state_free(chatwin->state);
    }

    if (window->type == WIN_MUC) {
        ProfMucWin *mucwin = (ProfMucWin*)window;
        free(mucwin->roomjid);
    }

    if (window->type == WIN_MUC_CONFIG) {
        ProfMucConfWin *mucconf = (ProfMucConfWin*)window;
        free(mucconf->roomjid);
        form_destroy(mucconf->form);
    }

    if (window->type == WIN_PRIVATE) {
        ProfPrivateWin *privatewin = (ProfPrivateWin*)window;
        free(privatewin->fulljid);
    }

    free(window);
}
コード例 #15
0
ファイル: capabilities.c プロジェクト: dotoole/profanity
Capabilities *
caps_create(xmpp_stanza_t *query)
{
    char *category = NULL;
    char *type = NULL;
    char *name = NULL;
    char *software = NULL;
    char *software_version = NULL;
    char *os = NULL;
    char *os_version = NULL;
    GSList *features = NULL;

    xmpp_stanza_t *softwareinfo = xmpp_stanza_get_child_by_ns(query, STANZA_NS_DATA);
    if (softwareinfo != NULL) {
        DataForm *form = form_create(softwareinfo);
        FormField *formField = NULL;

        char *form_type = form_get_form_type_field(form);
        if (g_strcmp0(form_type, STANZA_DATAFORM_SOFTWARE) == 0) {
            GSList *field = form->fields;
            while (field != NULL) {
                formField = field->data;
                if (formField->values != NULL) {
                    if (strcmp(formField->var, "software") == 0) {
                        software = strdup(formField->values->data);
                    } else if (strcmp(formField->var, "software_version") == 0) {
                        software_version = strdup(formField->values->data);
                    } else if (strcmp(formField->var, "os") == 0) {
                        os = strdup(formField->values->data);
                    } else if (strcmp(formField->var, "os_version") == 0) {
                        os_version = strdup(formField->values->data);
                    }
                }
                field = g_slist_next(field);
            }
        }

        form_destroy(form);
    }

    xmpp_stanza_t *child = xmpp_stanza_get_children(query);
    GSList *identity_stanzas = NULL;
    while (child != NULL) {
        if (g_strcmp0(xmpp_stanza_get_name(child), "feature") == 0) {
            features = g_slist_append(features, strdup(xmpp_stanza_get_attribute(child, "var")));
        }
        if (g_strcmp0(xmpp_stanza_get_name(child), "identity") == 0) {
            identity_stanzas = g_slist_append(identity_stanzas, child);
        }

        child = xmpp_stanza_get_next(child);
    }

    // find identity by locale
    const gchar* const *langs = g_get_language_names();
    int num_langs = g_strv_length((gchar**)langs);
    xmpp_stanza_t *found = NULL;
    GSList *curr_identity = identity_stanzas;
    while (curr_identity) {
        xmpp_stanza_t *id_stanza = curr_identity->data;
        char *stanza_lang = xmpp_stanza_get_attribute(id_stanza, "xml:lang");
        if (stanza_lang) {
            int i = 0;
            for (i = 0; i < num_langs; i++) {
                if (g_strcmp0(langs[i], stanza_lang) == 0) {
                    found = id_stanza;
                    break;
                }
            }
        }
        if (found) {
            break;
        }
        curr_identity = g_slist_next(curr_identity);
    }

    // not lang match, use default with no lang
    if (!found) {
        curr_identity = identity_stanzas;
        while (curr_identity) {
            xmpp_stanza_t *id_stanza = curr_identity->data;
            char *stanza_lang = xmpp_stanza_get_attribute(id_stanza, "xml:lang");
            if (!stanza_lang) {
                found = id_stanza;
                break;
            }

            curr_identity = g_slist_next(curr_identity);
        }
    }

    // no matching lang, no identity without lang, use first
    if (!found) {
        if (identity_stanzas) {
            found = identity_stanzas->data;
        }
    }

    g_slist_free(identity_stanzas);

    if (found) {
        category = xmpp_stanza_get_attribute(found, "category");
        type = xmpp_stanza_get_attribute(found, "type");
        name = xmpp_stanza_get_attribute(found, "name");
    }

    Capabilities *new_caps = malloc(sizeof(struct capabilities_t));

    if (category != NULL) {
        new_caps->category = strdup(category);
    } else {
        new_caps->category = NULL;
    }
    if (type != NULL) {
        new_caps->type = strdup(type);
    } else {
        new_caps->type = NULL;
    }
    if (name != NULL) {
        new_caps->name = strdup(name);
    } else {
        new_caps->name = NULL;
    }
    if (software != NULL) {
        new_caps->software = software;
    } else {
        new_caps->software = NULL;
    }
    if (software_version != NULL) {
        new_caps->software_version = software_version;
    } else {
        new_caps->software_version = NULL;
    }
    if (os != NULL) {
        new_caps->os = os;
    } else {
        new_caps->os = NULL;
    }
    if (os_version != NULL) {
        new_caps->os_version = os_version;
    } else {
        new_caps->os_version = NULL;
    }
    if (features != NULL) {
        new_caps->features = features;
    } else {
        new_caps->features = NULL;
    }

    return new_caps;
}