diff options
author | James Booth <boothj5@gmail.com> | 2014-09-10 23:05:35 +0100 |
---|---|---|
committer | James Booth <boothj5@gmail.com> | 2014-09-10 23:05:35 +0100 |
commit | eba3a7cb303af47624ea890e2c3164010684e60f (patch) | |
tree | bae0fd04c2deee50ee3c12ad3ad67782e579bb76 /src/xmpp/form.c | |
parent | 5aa75b1f8bbd71c8d617f78c34123a08eeee9bce (diff) | |
download | profani-tty-eba3a7cb303af47624ea890e2c3164010684e60f.tar.gz |
Implemented /room config submit for saving room configuration
Diffstat (limited to 'src/xmpp/form.c')
-rw-r--r-- | src/xmpp/form.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/xmpp/form.c b/src/xmpp/form.c index 4b79d8e6..b870aaa4 100644 --- a/src/xmpp/form.c +++ b/src/xmpp/form.c @@ -236,6 +236,86 @@ form_create(xmpp_stanza_t * const form_stanza) return form; } +xmpp_stanza_t * +form_create_submission(DataForm *form) +{ + xmpp_ctx_t *ctx = connection_get_ctx(); + + xmpp_stanza_t *x = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(x, STANZA_NAME_X); + xmpp_stanza_set_ns(x, STANZA_NS_DATA); + xmpp_stanza_set_type(x, "submit"); + + GSList *curr_field = form->fields; + while (curr_field != NULL) { + FormField *field = curr_field->data; + + xmpp_stanza_t *field_stanza = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(field_stanza, "field"); + xmpp_stanza_set_attribute(field_stanza, "var", field->var); + + xmpp_stanza_t *value_stanza = NULL; + GSList *curr_value = NULL; + + switch (field->type_t) { + + case FIELD_HIDDEN: + case FIELD_TEXT_SINGLE: + case FIELD_TEXT_PRIVATE: + case FIELD_BOOLEAN: + case FIELD_LIST_SINGLE: + case FIELD_JID_SINGLE: + case FIELD_FIXED: + value_stanza = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(value_stanza, "value"); + if (field->values != NULL) { + if (field->values->data != NULL) { + xmpp_stanza_t *text_stanza = xmpp_stanza_new(ctx); + xmpp_stanza_set_text(text_stanza, field->values->data); + xmpp_stanza_add_child(value_stanza, text_stanza); + xmpp_stanza_release(text_stanza); + } + } + xmpp_stanza_add_child(field_stanza, value_stanza); + xmpp_stanza_release(value_stanza); + + break; + + case FIELD_TEXT_MULTI: + case FIELD_LIST_MUTLI: + case FIELD_JID_MULTI: + curr_value = field->values; + while (curr_value != NULL) { + char *value = curr_value->data; + + value_stanza = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(value_stanza, "value"); + if (value != NULL) { + xmpp_stanza_t *text_stanza = xmpp_stanza_new(ctx); + xmpp_stanza_set_text(text_stanza, value); + xmpp_stanza_add_child(value_stanza, text_stanza); + xmpp_stanza_release(text_stanza); + } + + xmpp_stanza_add_child(field_stanza, value_stanza); + xmpp_stanza_release(value_stanza); + + curr_value = g_slist_next(curr_value); + } + break; + default: + break; + } + + xmpp_stanza_add_child(x, field_stanza); + xmpp_stanza_release(field_stanza); + + curr_field = g_slist_next(curr_field); + } + + return x; +} + static void _free_option(FormOption *option) { |