diff options
Diffstat (limited to 'src/plugins/logger/logger-config.c')
-rw-r--r-- | src/plugins/logger/logger-config.c | 323 |
1 files changed, 318 insertions, 5 deletions
diff --git a/src/plugins/logger/logger-config.c b/src/plugins/logger/logger-config.c index 3569337c4..3183be4a5 100644 --- a/src/plugins/logger/logger-config.c +++ b/src/plugins/logger/logger-config.c @@ -28,6 +28,10 @@ struct t_config_file *logger_config_file = NULL; +struct t_config_section *logger_config_section_level = NULL; +struct t_config_section *logger_config_section_mask = NULL; + +int logger_config_loading = 0; /* logger config, look section */ @@ -38,11 +42,272 @@ struct t_config_option *logger_config_look_backlog; struct t_config_option *logger_config_file_auto_log; struct t_config_option *logger_config_file_name_lower_case; struct t_config_option *logger_config_file_path; +struct t_config_option *logger_config_file_mask; struct t_config_option *logger_config_file_info_lines; struct t_config_option *logger_config_file_time_format; /* + * logger_config_change_file_option_restart_log: called when a file option is + * changed and that logging must + * be restarted for all buffers + */ + +void +logger_config_change_file_option_restart_log (void *data, + struct t_config_option *option) +{ + /* make C compiler happy */ + (void) data; + (void) option; + + if (!logger_config_loading) + { + logger_stop_all (); + logger_start_buffer_all (); + } +} + +/* + * logger_config_level_change: called when a level option is changed + */ + +void +logger_config_level_change (void *data, + struct t_config_option *option) +{ + /* make C compiler happy */ + (void) data; + (void) option; + + if (!logger_config_loading) + logger_start_buffer_all (); +} + +/* + * logger_config_level_delete_option: delete option in "level" section + */ + +int +logger_config_level_delete_option (void *data, + struct t_config_file *config_file, + struct t_config_section *section, + struct t_config_option *option) +{ + /* make C compiler happy */ + (void) data; + (void) config_file; + (void) section; + + weechat_config_option_free (option); + + logger_start_buffer_all (); + + return WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED; +} + +/* + * logger_config_level_create_option: create option in "level" section + */ + +int +logger_config_level_create_option (void *data, + struct t_config_file *config_file, + struct t_config_section *section, + const char *option_name, + const char *value) +{ + struct t_config_option *ptr_option; + int rc; + + /* make C compiler happy */ + (void) data; + + rc = WEECHAT_CONFIG_OPTION_SET_ERROR; + + if (option_name) + { + ptr_option = weechat_config_search_option (config_file, section, + option_name); + if (ptr_option) + { + if (value && value[0]) + rc = weechat_config_option_set (ptr_option, value, 1); + else + { + weechat_config_option_free (ptr_option); + rc = WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; + } + } + else + { + if (value && value[0]) + { + ptr_option = weechat_config_new_option ( + config_file, section, + option_name, "integer", + _("logging level for this buffer (0 = logging disabled, " + "1 = a few messages (most important) .. 9 = all messages)"), + NULL, 0, 9, "9", value, NULL, NULL, + &logger_config_level_change, NULL, + NULL, NULL); + rc = (ptr_option) ? + WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE : WEECHAT_CONFIG_OPTION_SET_ERROR; + } + else + rc = WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; + } + } + + if (!logger_config_loading) + logger_start_buffer_all (); + + return rc; +} + +/* + * logger_config_get_level: get a level option + */ + +struct t_config_option * +logger_config_get_level (const char *name) +{ + return weechat_config_search_option (logger_config_file, + logger_config_section_level, + name); +} + +/* + * logger_config_set_level: set a level option + */ + +int +logger_config_set_level (const char *name, const char *value) +{ + return logger_config_level_create_option (NULL, + logger_config_file, + logger_config_section_level, + name, + value); +} + +/* + * logger_config_mask_change: called when a mask option is changed + */ + +void +logger_config_mask_change (void *data, + struct t_config_option *option) +{ + /* make C compiler happy */ + (void) data; + (void) option; + + if (!logger_config_loading) + { + logger_stop_all (); + logger_start_buffer_all (); + } +} + +/* + * logger_config_mask_delete_option: delete option in "mask" section + */ + +int +logger_config_mask_delete_option (void *data, + struct t_config_file *config_file, + struct t_config_section *section, + struct t_config_option *option) +{ + /* make C compiler happy */ + (void) data; + (void) config_file; + (void) section; + + weechat_config_option_free (option); + + logger_stop_all (); + logger_start_buffer_all (); + + return WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED; +} + +/* + * logger_config_mask_create_option: create option in "mask" section + */ + +int +logger_config_mask_create_option (void *data, + struct t_config_file *config_file, + struct t_config_section *section, + const char *option_name, + const char *value) +{ + struct t_config_option *ptr_option; + int rc; + + /* make C compiler happy */ + (void) data; + + rc = WEECHAT_CONFIG_OPTION_SET_ERROR; + + if (option_name) + { + ptr_option = weechat_config_search_option (config_file, section, + option_name); + if (ptr_option) + { + if (value && value[0]) + rc = weechat_config_option_set (ptr_option, value, 1); + else + { + weechat_config_option_free (ptr_option); + rc = WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; + } + } + else + { + if (value && value[0]) + { + ptr_option = weechat_config_new_option ( + config_file, section, + option_name, "string", + _("file mask for log file; local buffer variables are " + "permitted"), + NULL, 0, 0, "", value, NULL, NULL, + &logger_config_mask_change, NULL, + NULL, NULL); + rc = (ptr_option) ? + WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE : WEECHAT_CONFIG_OPTION_SET_ERROR; + } + else + rc = WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; + } + } + + if (!logger_config_loading) + { + logger_stop_all (); + logger_start_buffer_all (); + } + + return rc; +} + +/* + * logger_config_get_mask: get a mask option + */ + +struct t_config_option * +logger_config_get_mask (const char *name) +{ + return weechat_config_search_option (logger_config_file, + logger_config_section_mask, + name); +} + +/* * logger_config_init: init logger configuration file * return: 1 if ok, 0 if error */ @@ -61,7 +326,8 @@ logger_config_init () ptr_section = weechat_config_new_section (logger_config_file, "look", 0, 0, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, + NULL, NULL); if (!ptr_section) { weechat_config_free (logger_config_file); @@ -79,7 +345,8 @@ logger_config_init () ptr_section = weechat_config_new_section (logger_config_file, "file", 0, 0, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, + NULL, NULL); if (!ptr_section) { weechat_config_free (logger_config_file); @@ -96,13 +363,23 @@ logger_config_init () logger_config_file, ptr_section, "name_lower_case", "boolean", N_("use only lower case for log filenames"), - NULL, 0, 0, "on", NULL, NULL, NULL, NULL, NULL, NULL, NULL); + NULL, 0, 0, "on", NULL, NULL, NULL, + &logger_config_change_file_option_restart_log, NULL, NULL, NULL); logger_config_file_path = weechat_config_new_option ( logger_config_file, ptr_section, "path", "string", N_("path for WeeChat log files ('%h' will be replaced by WeeChat " "home, ~/.weechat by default)"), - NULL, 0, 0, "%h/logs/", NULL, NULL, NULL, NULL, NULL, NULL, NULL); + NULL, 0, 0, "%h/logs/", NULL, NULL, NULL, + &logger_config_change_file_option_restart_log, NULL, NULL, NULL); + logger_config_file_mask = weechat_config_new_option ( + logger_config_file, ptr_section, + "mask", "string", + N_("default file name mask for log files (format is 'directory/to/file' " + "or 'file', without first '/' because 'path' option is used to " + "build complete path to file); local buffer variables are permitted"), + NULL, 0, 0, "$plugin.$name.weechatlog", NULL, NULL, NULL, + &logger_config_change_file_option_restart_log, NULL, NULL, NULL); logger_config_file_info_lines = weechat_config_new_option ( logger_config_file, ptr_section, "info_lines", "boolean", @@ -116,6 +393,36 @@ logger_config_init () "specifiers)"), NULL, 0, 0, "%Y-%m-%d %H:%M:%S", NULL, NULL, NULL, NULL, NULL, NULL, NULL); + /* level */ + ptr_section = weechat_config_new_section (logger_config_file, "level", + 1, 1, + NULL, NULL, NULL, NULL, + NULL, NULL, + &logger_config_level_create_option, NULL, + &logger_config_level_delete_option, NULL); + if (!ptr_section) + { + weechat_config_free (logger_config_file); + return 0; + } + + logger_config_section_level = ptr_section; + + /* mask */ + ptr_section = weechat_config_new_section (logger_config_file, "mask", + 1, 1, + NULL, NULL, NULL, NULL, + NULL, NULL, + &logger_config_mask_create_option, NULL, + &logger_config_mask_delete_option, NULL); + if (!ptr_section) + { + weechat_config_free (logger_config_file); + return 0; + } + + logger_config_section_mask = ptr_section; + return 1; } @@ -126,7 +433,13 @@ logger_config_init () int logger_config_read () { - return weechat_config_read (logger_config_file); + int rc; + + logger_config_loading = 1; + rc = weechat_config_read (logger_config_file); + logger_config_loading = 0; + + return rc; } /* |