about summary refs log tree commit diff stats
path: root/src/xmpp/form.c
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2014-09-10 23:05:35 +0100
committerJames Booth <boothj5@gmail.com>2014-09-10 23:05:35 +0100
commiteba3a7cb303af47624ea890e2c3164010684e60f (patch)
treebae0fd04c2deee50ee3c12ad3ad67782e579bb76 /src/xmpp/form.c
parent5aa75b1f8bbd71c8d617f78c34123a08eeee9bce (diff)
downloadprofani-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.c80
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)
 {