Added SILC Thread Queue API
[crypto.git] / apps / irssi / src / fe-common / core / fe-settings.c
index 90262ee06be0f087db293021dbae424c39cef448..dccfcba9105d4f95a6dbb1e002271ace75bf0155 100644 (file)
@@ -45,12 +45,16 @@ static void set_print(SETTINGS_REC *rec)
                value = value_int;
                break;
        case SETTING_TYPE_STRING:
+       case SETTING_TYPE_TIME:
+       case SETTING_TYPE_LEVEL:
+       case SETTING_TYPE_SIZE:
                value = settings_get_str(rec->key);
                break;
        default:
                value = "";
        }
-       printtext(NULL, NULL, MSGLEVEL_CLIENTCRAP, "%s = %s", rec->key, value);
+       printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_SET_ITEM,
+                   rec->key, value);
 }
 
 static void set_boolean(const char *key, const char *value)
@@ -65,7 +69,7 @@ static void set_boolean(const char *key, const char *value)
                printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_NOT_TOGGLE);
 }
 
-/* SYNTAX: SET [-clear] [<key> [<value>]] */
+/* SYNTAX: SET [-clear | -default] [<key> [<value>]] */
 static void cmd_set(char *data)
 {
         GHashTable *optlist;
@@ -73,43 +77,72 @@ static void cmd_set(char *data)
        const char *last_section;
        char *key, *value;
        void *free_arg;
-       int found, clear;
+       int found, clear, set_default;
 
        if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST | PARAM_FLAG_OPTIONS,
                            "set", &optlist, &key, &value))
                return;
 
        clear = g_hash_table_lookup(optlist, "clear") != NULL;
+       set_default = g_hash_table_lookup(optlist, "default") != NULL;
+
+       if (*key == '\0')
+               clear = set_default = FALSE;
 
        last_section = ""; found = 0;
        sets = settings_get_sorted();
        for (tmp = sets; tmp != NULL; tmp = tmp->next) {
                SETTINGS_REC *rec = tmp->data;
 
-               if (((clear || *value != '\0') && g_strcasecmp(rec->key, key) != 0) ||
+               if (((clear || set_default || *value != '\0') && g_strcasecmp(rec->key, key) != 0) ||
                    (*value == '\0' && *key != '\0' && stristr(rec->key, key) == NULL))
                        continue;
 
                if (strcmp(last_section, rec->section) != 0) {
                        /* print section */
-                       printtext(NULL, NULL, MSGLEVEL_CLIENTCRAP, "%_[ %s ]", rec->section);
+                       printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP,
+                                   TXT_SET_TITLE, rec->section);
                        last_section = rec->section;
                }
 
-               if (clear || *value != '\0') {
+               if (clear || set_default || *value != '\0') {
                        /* change the setting */
                        switch (rec->type) {
                        case SETTING_TYPE_BOOLEAN:
                                 if (clear)
                                        settings_set_bool(key, FALSE);
-                                else
+                               else if (set_default)
+                                       settings_set_bool(key, rec->default_value.v_bool);
+                               else
                                        set_boolean(key, value);
                                break;
                        case SETTING_TYPE_INT:
-                               settings_set_int(key, clear ? 0 : atoi(value));
+                               settings_set_int(key, clear ? 0 :
+                                                set_default ? rec->default_value.v_int :
+                                                atoi(value));
                                break;
                        case SETTING_TYPE_STRING:
-                               settings_set_str(key, clear ? "" : value);
+                               settings_set_str(key, clear ? "" :
+                                                set_default ? rec->default_value.v_string :
+                                                value);
+                               break;
+                       case SETTING_TYPE_TIME:
+                               if (!settings_set_time(key, clear ? "0" :
+                                                      set_default ? rec->default_value.v_string : value))
+                                       printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+                                                   TXT_INVALID_TIME);
+                               break;
+                       case SETTING_TYPE_LEVEL:
+                               if (!settings_set_level(key, clear ? "" :
+                                                       set_default ? rec->default_value.v_string : value))
+                                       printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+                                                   TXT_INVALID_LEVEL);
+                               break;
+                       case SETTING_TYPE_SIZE:
+                               if (!settings_set_size(key, clear ? "0" :
+                                                      set_default ? rec->default_value.v_string : value))
+                                       printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+                                                   TXT_INVALID_SIZE);
                                break;
                        }
                        signal_emit("setup changed", 0);
@@ -123,8 +156,10 @@ static void cmd_set(char *data)
        }
        g_slist_free(sets);
 
-        if (!found)
-               printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "Unknown setting %s", key);
+        if (!found) {
+               printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+                           TXT_SET_UNKNOWN, key);
+        }
 
         cmd_params_free(free_arg);
 }
@@ -143,12 +178,13 @@ static void cmd_toggle(const char *data)
 
        type = settings_get_type(key);
         if (type == -1)
-               printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "Unknown setting %_%s", key);
+               printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, TXT_SET_UNKNOWN, key);
        else if (type != SETTING_TYPE_BOOLEAN)
-               printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "Setting %_%s%_ isn't boolean, use /SET", key);
+               printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, TXT_SET_NOT_BOOLEAN, key);
        else {
                set_boolean(key, *value != '\0' ? value : "TOGGLE");
                 set_print(settings_get_record(key));
+               signal_emit("setup changed", 0);
        }
 
         cmd_params_free(free_arg);
@@ -168,12 +204,12 @@ static void show_aliases(const char *alias)
        printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_ALIASLIST_HEADER);
 
        node = iconfig_node_traverse("aliases", FALSE);
-       tmp = node == NULL ? NULL : node->value;
+       tmp = node == NULL ? NULL : config_node_first(node->value);
 
        /* first get the list of aliases sorted */
        list = NULL;
        aliaslen = strlen(alias);
-       for (; tmp != NULL; tmp = tmp->next) {
+       for (; tmp != NULL; tmp = config_node_next(tmp)) {
                CONFIG_NODE *node = tmp->data;
 
                if (node->type != NODE_TYPE_KEY)
@@ -204,6 +240,8 @@ static void alias_remove(const char *alias)
        else {
                printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_ALIAS_REMOVED, alias);
                iconfig_set_str("aliases", alias, NULL);
+
+               signal_emit("alias removed", 1, alias);
        }
 }
 
@@ -225,6 +263,7 @@ static void cmd_alias(const char *data)
        else {
                printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_ALIAS_ADDED, alias);
                iconfig_set_str("aliases", alias, value);
+               signal_emit("alias added", 2, alias, value);
        }
         cmd_params_free(free_arg);
 }
@@ -232,29 +271,35 @@ static void cmd_alias(const char *data)
 /* SYNTAX: UNALIAS <alias> */
 static void cmd_unalias(const char *data)
 {
+       char *alias;
+       void *free_arg;
+
        g_return_if_fail(data != NULL);
-       if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS);
 
-       alias_remove(data);
+       if (!cmd_get_params(data, &free_arg, 1, &alias))
+               return;
+       if (*alias == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
+
+       alias_remove(alias);
+        cmd_params_free(free_arg);
 }
 
 /* SYNTAX: RELOAD [<file>] */
 static void cmd_reload(const char *data)
 {
-       char *fname;
+       const char *fname;
+
+       fname = *data == '\0' ? get_irssi_config() : data;
 
-       fname = *data != '\0' ? g_strdup(data) :
-               g_strdup_printf("%s/.irssi/config", g_get_home_dir());
        if (settings_reread(fname)) {
                printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
                            TXT_CONFIG_RELOADED, fname);
        }
-       g_free(fname);
 }
 
 static void settings_save_fe(const char *fname)
 {
-       if (settings_save(fname)) {
+       if (settings_save(fname, FALSE /* not autosaved */)) {
                printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
                            TXT_CONFIG_SAVED, fname);
        }
@@ -262,7 +307,7 @@ static void settings_save_fe(const char *fname)
 
 static void settings_save_confirm(const char *line, char *fname)
 {
-       if (line[0] == 'Y')
+       if (i_toupper(line[0]) == 'Y')
                settings_save_fe(fname);
        g_free(fname);
 }
@@ -270,29 +315,37 @@ static void settings_save_confirm(const char *line, char *fname)
 /* SYNTAX: SAVE [<file>] */
 static void cmd_save(const char *data)
 {
-       char *format;
-
-       if (*data == '\0')
-               data = mainconfig->fname;
+        GHashTable *optlist;
+       char *format, *fname;
+        void *free_arg;
 
-       if (!irssi_config_is_changed(data)) {
-               settings_save_fe(data);
+       if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS,
+                           "save", &optlist, &fname))
                return;
-       }
 
-       printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
-                   TXT_CONFIG_MODIFIED, data);
+       if (*fname == '\0')
+               fname = mainconfig->fname;
+
+       if (!irssi_config_is_changed(fname))
+               settings_save_fe(fname);
+       else {
+                /* config file modified outside irssi */
+               printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
+                           TXT_CONFIG_MODIFIED, fname);
+
+               format = format_get_text(MODULE_NAME, NULL, NULL, NULL,
+                                        TXT_OVERWRITE_CONFIG);
+               keyboard_entry_redirect((SIGNAL_FUNC) settings_save_confirm,
+                                       format, 0, g_strdup(fname));
+               g_free(format);
+       }
 
-       format = format_get_text(MODULE_NAME, NULL, NULL, NULL,
-                                TXT_OVERWRITE_CONFIG);
-       keyboard_entry_redirect((SIGNAL_FUNC) settings_save_confirm,
-                               format, 0, g_strdup(data));
-        g_free(format);
+       cmd_params_free(free_arg);
 }
 
 static void settings_clean_confirm(const char *line)
 {
-       if (line[0] == 'Y')
+       if (i_toupper(line[0]) == 'Y')
                 settings_clean_invalid();
 }
 
@@ -312,7 +365,7 @@ void fe_settings_init(void)
        command_bind("unalias", NULL, (SIGNAL_FUNC) cmd_unalias);
        command_bind("reload", NULL, (SIGNAL_FUNC) cmd_reload);
        command_bind("save", NULL, (SIGNAL_FUNC) cmd_save);
-       command_set_options("set", "clear");
+       command_set_options("set", "clear default");
 
         signal_add("settings errors", (SIGNAL_FUNC) sig_settings_errors);
 }