diff --git a/Makefile.am b/Makefile.am index 36f3e2a4..3c7a28bc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -25,6 +25,7 @@ core_sources = \ src/ui/buffer.c src/ui/buffer.h \ src/ui/chatwin.c \ src/ui/mucwin.c \ + src/ui/mucconfwin.c \ src/ui/xmlwin.c \ src/command/command.h src/command/command.c \ src/command/commands.h src/command/commands.c \ diff --git a/src/ui/core.c b/src/ui/core.c index 6b154f64..17ff30e2 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -1117,195 +1117,6 @@ _ui_draw_term_title(void) } } -static void -_ui_handle_form_field(ProfWin *window, char *tag, FormField *field) -{ - win_vprint(window, '-', 0, NULL, NO_EOL, THEME_AWAY, "", "[%s] ", tag); - win_vprint(window, '-', 0, NULL, NO_EOL | NO_DATE, 0, "", "%s", field->label); - if (field->required) { - win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, 0, "", " (required): "); - } else { - win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, 0, "", ": "); - } - - GSList *values = field->values; - GSList *curr_value = values; - - switch (field->type_t) { - case FIELD_HIDDEN: - break; - case FIELD_TEXT_SINGLE: - if (curr_value) { - char *value = curr_value->data; - if (value) { - if (g_strcmp0(field->var, "muc#roomconfig_roomsecret") == 0) { - win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, THEME_ONLINE, "", "[hidden]"); - } else { - win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, THEME_ONLINE, "", value); - } - } - } - win_newline(window); - break; - case FIELD_TEXT_PRIVATE: - if (curr_value) { - char *value = curr_value->data; - if (value) { - win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, THEME_ONLINE, "", "[hidden]"); - } - } - win_newline(window); - break; - case FIELD_TEXT_MULTI: - win_newline(window); - int index = 1; - while (curr_value) { - char *value = curr_value->data; - GString *val_tag = g_string_new(""); - g_string_printf(val_tag, "val%d", index++); - win_vprint(window, '-', 0, NULL, 0, THEME_ONLINE, "", " [%s] %s", val_tag->str, value); - g_string_free(val_tag, TRUE); - curr_value = g_slist_next(curr_value); - } - break; - case FIELD_BOOLEAN: - if (curr_value == NULL) { - win_print(window, '-', 0, NULL, NO_DATE, THEME_OFFLINE, "", "FALSE"); - } else { - char *value = curr_value->data; - if (value == NULL) { - win_print(window, '-', 0, NULL, NO_DATE, THEME_OFFLINE, "", "FALSE"); - } else { - if (g_strcmp0(value, "0") == 0) { - win_print(window, '-', 0, NULL, NO_DATE, THEME_OFFLINE, "", "FALSE"); - } else { - win_print(window, '-', 0, NULL, NO_DATE, THEME_ONLINE, "", "TRUE"); - } - } - } - break; - case FIELD_LIST_SINGLE: - if (curr_value) { - win_newline(window); - char *value = curr_value->data; - GSList *options = field->options; - GSList *curr_option = options; - while (curr_option) { - FormOption *option = curr_option->data; - if (g_strcmp0(option->value, value) == 0) { - win_vprint(window, '-', 0, NULL, 0, THEME_ONLINE, "", " [%s] %s", option->value, option->label); - } else { - win_vprint(window, '-', 0, NULL, 0, THEME_OFFLINE, "", " [%s] %s", option->value, option->label); - } - curr_option = g_slist_next(curr_option); - } - } - break; - case FIELD_LIST_MULTI: - if (curr_value) { - win_newline(window); - GSList *options = field->options; - GSList *curr_option = options; - while (curr_option) { - FormOption *option = curr_option->data; - if (g_slist_find_custom(curr_value, option->value, (GCompareFunc)g_strcmp0)) { - win_vprint(window, '-', 0, NULL, 0, THEME_ONLINE, "", " [%s] %s", option->value, option->label); - } else { - win_vprint(window, '-', 0, NULL, 0, THEME_OFFLINE, "", " [%s] %s", option->value, option->label); - } - curr_option = g_slist_next(curr_option); - } - } - break; - case FIELD_JID_SINGLE: - if (curr_value) { - char *value = curr_value->data; - if (value) { - win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, THEME_ONLINE, "", value); - } - } - win_newline(window); - break; - case FIELD_JID_MULTI: - win_newline(window); - while (curr_value) { - char *value = curr_value->data; - win_vprint(window, '-', 0, NULL, 0, THEME_ONLINE, "", " %s", value); - curr_value = g_slist_next(curr_value); - } - break; - case FIELD_FIXED: - if (curr_value) { - char *value = curr_value->data; - if (value) { - win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, 0, "", value); - } - } - win_newline(window); - break; - default: - break; - } -} - -void -ui_show_form(ProfMucConfWin *confwin) -{ - ProfWin *window = (ProfWin*) confwin; - if (confwin->form->title) { - win_print(window, '-', 0, NULL, NO_EOL, 0, "", "Form title: "); - win_print(window, '-', 0, NULL, NO_DATE, 0, "", confwin->form->title); - } else { - win_vprint(window, '-', 0, NULL, 0, 0, "", "Configuration for room %s.", confwin->roomjid); - } - win_print(window, '-', 0, NULL, 0, 0, "", ""); - - ui_show_form_help(confwin); - - GSList *fields = confwin->form->fields; - GSList *curr_field = fields; - while (curr_field) { - FormField *field = curr_field->data; - - if ((g_strcmp0(field->type, "fixed") == 0) && field->values) { - if (field->values) { - char *value = field->values->data; - win_print(window, '-', 0, NULL, 0, 0, "", value); - } - } else if (g_strcmp0(field->type, "hidden") != 0 && field->var) { - char *tag = g_hash_table_lookup(confwin->form->var_to_tag, field->var); - _ui_handle_form_field(window, tag, field); - } - - curr_field = g_slist_next(curr_field); - } -} - -void -ui_show_form_field(ProfWin *window, DataForm *form, char *tag) -{ - FormField *field = form_get_field_by_tag(form, tag); - _ui_handle_form_field(window, tag, field); - win_println(window, 0, ""); -} - -void -ui_handle_room_configuration(const char *const roomjid, DataForm *form) -{ - ProfWin *window = wins_new_muc_config(roomjid, form); - ProfMucConfWin *confwin = (ProfMucConfWin*)window; - assert(confwin->memcheck == PROFCONFWIN_MEMCHECK); - - ui_focus_win(window); - ui_show_form(confwin); - - win_print(window, '-', 0, NULL, 0, 0, "", ""); - win_print(window, '-', 0, NULL, 0, 0, "", "Use '/form submit' to save changes."); - win_print(window, '-', 0, NULL, 0, 0, "", "Use '/form cancel' to cancel changes."); - win_print(window, '-', 0, NULL, 0, 0, "", "See '/form help' for more information."); - win_print(window, '-', 0, NULL, 0, 0, "", ""); -} - void ui_handle_room_configuration_form_error(const char *const roomjid, const char *const message) { @@ -1398,98 +1209,6 @@ ui_handle_room_config_submit_result_error(const char *const roomjid, const char } } -void -ui_show_form_field_help(ProfMucConfWin *confwin, char *tag) -{ - ProfWin *window = (ProfWin*) confwin; - FormField *field = form_get_field_by_tag(confwin->form, tag); - if (field) { - win_print(window, '-', 0, NULL, NO_EOL, 0, "", field->label); - if (field->required) { - win_print(window, '-', 0, NULL, NO_DATE, 0, "", " (Required):"); - } else { - win_print(window, '-', 0, NULL, NO_DATE, 0, "", ":"); - } - if (field->description) { - win_vprint(window, '-', 0, NULL, 0, 0, "", " Description : %s", field->description); - } - win_vprint(window, '-', 0, NULL, 0, 0, "", " Type : %s", field->type); - - int num_values = 0; - GSList *curr_option = NULL; - FormOption *option = NULL; - - switch (field->type_t) { - case FIELD_TEXT_SINGLE: - case FIELD_TEXT_PRIVATE: - win_vprint(window, '-', 0, NULL, 0, 0, "", " Set : /%s ", tag); - win_print(window, '-', 0, NULL, 0, 0, "", " Where : is any text"); - break; - case FIELD_TEXT_MULTI: - num_values = form_get_value_count(confwin->form, tag); - win_vprint(window, '-', 0, NULL, 0, 0, "", " Add : /%s add ", tag); - win_print(window, '-', 0, NULL, 0, 0, "", " Where : is any text"); - if (num_values > 0) { - win_vprint(window, '-', 0, NULL, 0, 0, "", " Remove : /%s remove ", tag); - win_vprint(window, '-', 0, NULL, 0, 0, "", " Where : between 'val1' and 'val%d'", num_values); - } - break; - case FIELD_BOOLEAN: - win_vprint(window, '-', 0, NULL, 0, 0, "", " Set : /%s ", tag); - win_print(window, '-', 0, NULL, 0, 0, "", " Where : is either 'on' or 'off'"); - break; - case FIELD_LIST_SINGLE: - win_vprint(window, '-', 0, NULL, 0, 0, "", " Set : /%s ", tag); - win_print(window, '-', 0, NULL, 0, 0, "", " Where : is one of"); - curr_option = field->options; - while (curr_option) { - option = curr_option->data; - win_vprint(window, '-', 0, NULL, 0, 0, "", " %s", option->value); - curr_option = g_slist_next(curr_option); - } - break; - case FIELD_LIST_MULTI: - win_vprint(window, '-', 0, NULL, 0, 0, "", " Add : /%s add ", tag); - win_vprint(window, '-', 0, NULL, 0, 0, "", " Remove : /%s remove ", tag); - win_print(window, '-', 0, NULL, 0, 0, "", " Where : is one of"); - curr_option = field->options; - while (curr_option) { - option = curr_option->data; - win_vprint(window, '-', 0, NULL, 0, 0, "", " %s", option->value); - curr_option = g_slist_next(curr_option); - } - break; - case FIELD_JID_SINGLE: - win_vprint(window, '-', 0, NULL, 0, 0, "", " Set : /%s ", tag); - win_print(window, '-', 0, NULL, 0, 0, "", " Where : is a valid Jabber ID"); - break; - case FIELD_JID_MULTI: - win_vprint(window, '-', 0, NULL, 0, 0, "", " Add : /%s add ", tag); - win_vprint(window, '-', 0, NULL, 0, 0, "", " Remove : /%s remove ", tag); - win_print(window, '-', 0, NULL, 0, 0, "", " Where : is a valid Jabber ID"); - break; - case FIELD_FIXED: - case FIELD_UNKNOWN: - case FIELD_HIDDEN: - default: - break; - } - } else { - win_vprint(window, '-', 0, NULL, 0, 0, "", "No such field %s", tag); - } -} - -void -ui_show_form_help(ProfMucConfWin *confwin) -{ - if (confwin->form->instructions) { - ProfWin *window = (ProfWin*) confwin; - win_print(window, '-', 0, NULL, 0, 0, "", "Supplied instructions:"); - win_print(window, '-', 0, NULL, 0, 0, "", confwin->form->instructions); - win_print(window, '-', 0, NULL, 0, 0, "", ""); - } -} - void ui_show_lines(ProfWin *window, const gchar** lines) { diff --git a/src/ui/mucconfwin.c b/src/ui/mucconfwin.c new file mode 100644 index 00000000..a583cf4f --- /dev/null +++ b/src/ui/mucconfwin.c @@ -0,0 +1,323 @@ +/* + * mucconfwin.c + * + * Copyright (C) 2012 - 2015 James Booth + * + * This file is part of Profanity. + * + * Profanity is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Profanity is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Profanity. If not, see . + * + * In addition, as a special exception, the copyright holders give permission to + * link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. + * + * You must obey the GNU General Public License in all respects for all of the + * code used other than OpenSSL. If you modify file(s) with this exception, you + * may extend this exception to your version of the file(s), but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. If you delete this exception statement from all + * source files in the program, then also delete it here. + * + */ + +#include + +#include "ui/ui.h" +#include "ui/window.h" +#include "ui/win_types.h" +#include "window_list.h" + +static void _ui_handle_form_field(ProfWin *window, char *tag, FormField *field); + +void +ui_show_form(ProfMucConfWin *confwin) +{ + ProfWin *window = (ProfWin*) confwin; + if (confwin->form->title) { + win_print(window, '-', 0, NULL, NO_EOL, 0, "", "Form title: "); + win_print(window, '-', 0, NULL, NO_DATE, 0, "", confwin->form->title); + } else { + win_vprint(window, '-', 0, NULL, 0, 0, "", "Configuration for room %s.", confwin->roomjid); + } + win_print(window, '-', 0, NULL, 0, 0, "", ""); + + ui_show_form_help(confwin); + + GSList *fields = confwin->form->fields; + GSList *curr_field = fields; + while (curr_field) { + FormField *field = curr_field->data; + + if ((g_strcmp0(field->type, "fixed") == 0) && field->values) { + if (field->values) { + char *value = field->values->data; + win_print(window, '-', 0, NULL, 0, 0, "", value); + } + } else if (g_strcmp0(field->type, "hidden") != 0 && field->var) { + char *tag = g_hash_table_lookup(confwin->form->var_to_tag, field->var); + _ui_handle_form_field(window, tag, field); + } + + curr_field = g_slist_next(curr_field); + } +} + +void +ui_show_form_field(ProfWin *window, DataForm *form, char *tag) +{ + FormField *field = form_get_field_by_tag(form, tag); + _ui_handle_form_field(window, tag, field); + win_println(window, 0, ""); +} + +void +ui_handle_room_configuration(const char *const roomjid, DataForm *form) +{ + ProfWin *window = wins_new_muc_config(roomjid, form); + ProfMucConfWin *confwin = (ProfMucConfWin*)window; + assert(confwin->memcheck == PROFCONFWIN_MEMCHECK); + + ui_focus_win(window); + ui_show_form(confwin); + + win_print(window, '-', 0, NULL, 0, 0, "", ""); + win_print(window, '-', 0, NULL, 0, 0, "", "Use '/form submit' to save changes."); + win_print(window, '-', 0, NULL, 0, 0, "", "Use '/form cancel' to cancel changes."); + win_print(window, '-', 0, NULL, 0, 0, "", "See '/form help' for more information."); + win_print(window, '-', 0, NULL, 0, 0, "", ""); +} + +void +ui_show_form_field_help(ProfMucConfWin *confwin, char *tag) +{ + ProfWin *window = (ProfWin*) confwin; + FormField *field = form_get_field_by_tag(confwin->form, tag); + if (field) { + win_print(window, '-', 0, NULL, NO_EOL, 0, "", field->label); + if (field->required) { + win_print(window, '-', 0, NULL, NO_DATE, 0, "", " (Required):"); + } else { + win_print(window, '-', 0, NULL, NO_DATE, 0, "", ":"); + } + if (field->description) { + win_vprint(window, '-', 0, NULL, 0, 0, "", " Description : %s", field->description); + } + win_vprint(window, '-', 0, NULL, 0, 0, "", " Type : %s", field->type); + + int num_values = 0; + GSList *curr_option = NULL; + FormOption *option = NULL; + + switch (field->type_t) { + case FIELD_TEXT_SINGLE: + case FIELD_TEXT_PRIVATE: + win_vprint(window, '-', 0, NULL, 0, 0, "", " Set : /%s ", tag); + win_print(window, '-', 0, NULL, 0, 0, "", " Where : is any text"); + break; + case FIELD_TEXT_MULTI: + num_values = form_get_value_count(confwin->form, tag); + win_vprint(window, '-', 0, NULL, 0, 0, "", " Add : /%s add ", tag); + win_print(window, '-', 0, NULL, 0, 0, "", " Where : is any text"); + if (num_values > 0) { + win_vprint(window, '-', 0, NULL, 0, 0, "", " Remove : /%s remove ", tag); + win_vprint(window, '-', 0, NULL, 0, 0, "", " Where : between 'val1' and 'val%d'", num_values); + } + break; + case FIELD_BOOLEAN: + win_vprint(window, '-', 0, NULL, 0, 0, "", " Set : /%s ", tag); + win_print(window, '-', 0, NULL, 0, 0, "", " Where : is either 'on' or 'off'"); + break; + case FIELD_LIST_SINGLE: + win_vprint(window, '-', 0, NULL, 0, 0, "", " Set : /%s ", tag); + win_print(window, '-', 0, NULL, 0, 0, "", " Where : is one of"); + curr_option = field->options; + while (curr_option) { + option = curr_option->data; + win_vprint(window, '-', 0, NULL, 0, 0, "", " %s", option->value); + curr_option = g_slist_next(curr_option); + } + break; + case FIELD_LIST_MULTI: + win_vprint(window, '-', 0, NULL, 0, 0, "", " Add : /%s add ", tag); + win_vprint(window, '-', 0, NULL, 0, 0, "", " Remove : /%s remove ", tag); + win_print(window, '-', 0, NULL, 0, 0, "", " Where : is one of"); + curr_option = field->options; + while (curr_option) { + option = curr_option->data; + win_vprint(window, '-', 0, NULL, 0, 0, "", " %s", option->value); + curr_option = g_slist_next(curr_option); + } + break; + case FIELD_JID_SINGLE: + win_vprint(window, '-', 0, NULL, 0, 0, "", " Set : /%s ", tag); + win_print(window, '-', 0, NULL, 0, 0, "", " Where : is a valid Jabber ID"); + break; + case FIELD_JID_MULTI: + win_vprint(window, '-', 0, NULL, 0, 0, "", " Add : /%s add ", tag); + win_vprint(window, '-', 0, NULL, 0, 0, "", " Remove : /%s remove ", tag); + win_print(window, '-', 0, NULL, 0, 0, "", " Where : is a valid Jabber ID"); + break; + case FIELD_FIXED: + case FIELD_UNKNOWN: + case FIELD_HIDDEN: + default: + break; + } + } else { + win_vprint(window, '-', 0, NULL, 0, 0, "", "No such field %s", tag); + } +} + +void +ui_show_form_help(ProfMucConfWin *confwin) +{ + if (confwin->form->instructions) { + ProfWin *window = (ProfWin*) confwin; + win_print(window, '-', 0, NULL, 0, 0, "", "Supplied instructions:"); + win_print(window, '-', 0, NULL, 0, 0, "", confwin->form->instructions); + win_print(window, '-', 0, NULL, 0, 0, "", ""); + } +} + +static void +_ui_handle_form_field(ProfWin *window, char *tag, FormField *field) +{ + win_vprint(window, '-', 0, NULL, NO_EOL, THEME_AWAY, "", "[%s] ", tag); + win_vprint(window, '-', 0, NULL, NO_EOL | NO_DATE, 0, "", "%s", field->label); + if (field->required) { + win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, 0, "", " (required): "); + } else { + win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, 0, "", ": "); + } + + GSList *values = field->values; + GSList *curr_value = values; + + switch (field->type_t) { + case FIELD_HIDDEN: + break; + case FIELD_TEXT_SINGLE: + if (curr_value) { + char *value = curr_value->data; + if (value) { + if (g_strcmp0(field->var, "muc#roomconfig_roomsecret") == 0) { + win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, THEME_ONLINE, "", "[hidden]"); + } else { + win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, THEME_ONLINE, "", value); + } + } + } + win_newline(window); + break; + case FIELD_TEXT_PRIVATE: + if (curr_value) { + char *value = curr_value->data; + if (value) { + win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, THEME_ONLINE, "", "[hidden]"); + } + } + win_newline(window); + break; + case FIELD_TEXT_MULTI: + win_newline(window); + int index = 1; + while (curr_value) { + char *value = curr_value->data; + GString *val_tag = g_string_new(""); + g_string_printf(val_tag, "val%d", index++); + win_vprint(window, '-', 0, NULL, 0, THEME_ONLINE, "", " [%s] %s", val_tag->str, value); + g_string_free(val_tag, TRUE); + curr_value = g_slist_next(curr_value); + } + break; + case FIELD_BOOLEAN: + if (curr_value == NULL) { + win_print(window, '-', 0, NULL, NO_DATE, THEME_OFFLINE, "", "FALSE"); + } else { + char *value = curr_value->data; + if (value == NULL) { + win_print(window, '-', 0, NULL, NO_DATE, THEME_OFFLINE, "", "FALSE"); + } else { + if (g_strcmp0(value, "0") == 0) { + win_print(window, '-', 0, NULL, NO_DATE, THEME_OFFLINE, "", "FALSE"); + } else { + win_print(window, '-', 0, NULL, NO_DATE, THEME_ONLINE, "", "TRUE"); + } + } + } + break; + case FIELD_LIST_SINGLE: + if (curr_value) { + win_newline(window); + char *value = curr_value->data; + GSList *options = field->options; + GSList *curr_option = options; + while (curr_option) { + FormOption *option = curr_option->data; + if (g_strcmp0(option->value, value) == 0) { + win_vprint(window, '-', 0, NULL, 0, THEME_ONLINE, "", " [%s] %s", option->value, option->label); + } else { + win_vprint(window, '-', 0, NULL, 0, THEME_OFFLINE, "", " [%s] %s", option->value, option->label); + } + curr_option = g_slist_next(curr_option); + } + } + break; + case FIELD_LIST_MULTI: + if (curr_value) { + win_newline(window); + GSList *options = field->options; + GSList *curr_option = options; + while (curr_option) { + FormOption *option = curr_option->data; + if (g_slist_find_custom(curr_value, option->value, (GCompareFunc)g_strcmp0)) { + win_vprint(window, '-', 0, NULL, 0, THEME_ONLINE, "", " [%s] %s", option->value, option->label); + } else { + win_vprint(window, '-', 0, NULL, 0, THEME_OFFLINE, "", " [%s] %s", option->value, option->label); + } + curr_option = g_slist_next(curr_option); + } + } + break; + case FIELD_JID_SINGLE: + if (curr_value) { + char *value = curr_value->data; + if (value) { + win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, THEME_ONLINE, "", value); + } + } + win_newline(window); + break; + case FIELD_JID_MULTI: + win_newline(window); + while (curr_value) { + char *value = curr_value->data; + win_vprint(window, '-', 0, NULL, 0, THEME_ONLINE, "", " %s", value); + curr_value = g_slist_next(curr_value); + } + break; + case FIELD_FIXED: + if (curr_value) { + char *value = curr_value->data; + if (value) { + win_print(window, '-', 0, NULL, NO_DATE | NO_EOL, 0, "", value); + } + } + win_newline(window); + break; + default: + break; + } +}