about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/command/commands.c20
-rw-r--r--src/xmpp/form.c31
-rw-r--r--src/xmpp/xmpp.h1
3 files changed, 41 insertions, 11 deletions
diff --git a/src/command/commands.c b/src/command/commands.c
index fc3e5298..5dd5eb11 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -1979,21 +1979,33 @@ cmd_room(gchar **args, struct cmd_help_t help)
             } else {
                 form_field_type_t field_type = form_get_field_type(current->form, tag);
                 gboolean valid = FALSE;
+                gboolean added = FALSE;
                 switch (field_type) {
                 case FIELD_LIST_MULTI:
                     valid = form_field_contains_option(current->form, tag, value);
-                    if (valid == TRUE) {
-                        form_add_value(current->form, tag, value);
-                        ui_current_print_line("Added %s to %s", value, tag);
+                    if (valid) {
+                        added = form_add_unique_value(current->form, tag, value);
+                        if (added) {
+                            ui_current_print_line("Added %s to %s", value, tag);
+                        } else {
+                            ui_current_print_line("Value %s already selected for %s", value, tag);
+                        }
                     } else {
                         ui_current_print_line("Value %s not a valid option for field: %s", value, tag);
                     }
                     break;
                 case FIELD_TEXT_MULTI:
-                case FIELD_JID_MULTI:
                     form_add_value(current->form, tag, value);
                     ui_current_print_line("Added %s to %s", value, tag);
                     break;
+                case FIELD_JID_MULTI:
+                    added = form_add_unique_value(current->form, tag, value);
+                    if (added) {
+                        ui_current_print_line("Added %s to %s", value, tag);
+                    } else {
+                        ui_current_print_line("JID %s already exists in %s", value, tag);
+                    }
+                    break;
                 default:
                     ui_current_print_line("Add command not valid for field: %s", tag);
                     break;
diff --git a/src/xmpp/form.c b/src/xmpp/form.c
index f67fe9ae..1e82c74f 100644
--- a/src/xmpp/form.c
+++ b/src/xmpp/form.c
@@ -430,6 +430,7 @@ _form_set_value(DataForm *form, const char * const tag, char *value)
             if (g_strcmp0(field->var, var) == 0) {
                 if (g_slist_length(field->values) == 0) {
                     field->values = g_slist_append(field->values, strdup(value));
+                    return;
                 } else if (g_slist_length(field->values) == 1) {
                     free(field->values->data);
                     field->values->data = strdup(value);
@@ -450,24 +451,39 @@ _form_add_value(DataForm *form, const char * const tag, char *value)
         while (curr != NULL) {
             FormField *field = curr->data;
             if (g_strcmp0(field->var, var) == 0) {
-                gboolean already_set = FALSE;
+                field->values = g_slist_append(field->values, strdup(value));
+                return;
+            }
+            curr = g_slist_next(curr);
+        }
+    }
+}
+
+static gboolean
+_form_add_unique_value(DataForm *form, const char * const tag, char *value)
+{
+    char *var = g_hash_table_lookup(form->tag_to_var, tag);
+    if (var != NULL) {
+        GSList *curr = form->fields;
+        while (curr != NULL) {
+            FormField *field = curr->data;
+            if (g_strcmp0(field->var, var) == 0) {
                 GSList *curr_value = field->values;
                 while (curr_value != NULL) {
                     if (g_strcmp0(curr_value->data, value) == 0) {
-                        already_set = TRUE;
-                        break;
+                        return FALSE;
                     }
                     curr_value = g_slist_next(curr_value);
                 }
 
-                if (!already_set) {
-                    field->values = g_slist_append(field->values, strdup(value));
-                }
-                return;
+                field->values = g_slist_append(field->values, strdup(value));
+                return TRUE;
             }
             curr = g_slist_next(curr);
         }
     }
+
+    return FALSE;
 }
 
 static void
@@ -508,6 +524,7 @@ form_init_module(void)
     form_get_form_type_field = _form_get_form_type_field;
     form_get_field_type = _form_get_field_type;
     form_set_value = _form_set_value;
+    form_add_unique_value = _form_add_unique_value;
     form_add_value = _form_add_value;
     form_remove_value = _form_remove_value;
     form_field_contains_option = _form_field_contains_option;
diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h
index d11bb202..05094d20 100644
--- a/src/xmpp/xmpp.h
+++ b/src/xmpp/xmpp.h
@@ -209,6 +209,7 @@ void (*roster_send_remove)(const char * const barejid);
 void (*form_destroy)(DataForm *form);
 char * (*form_get_form_type_field)(DataForm *form);
 void (*form_set_value)(DataForm *form, const char * const tag, char *value);
+gboolean (*form_add_unique_value)(DataForm *form, const char * const tag, char *value);
 void (*form_add_value)(DataForm *form, const char * const tag, char *value);
 void (*form_remove_value)(DataForm *form, const char * const tag, char *value);
 gboolean (*form_tag_exists)(DataForm *form, const char * const tag);