diff options
-rw-r--r-- | color_filters.c | 4 | ||||
-rw-r--r-- | epan/prefs.c | 71 | ||||
-rw-r--r-- | epan/prefs.h | 3 | ||||
-rw-r--r-- | ui/gtk/color_dlg.c | 48 | ||||
-rw-r--r-- | ui/gtk/prefs_dlg.c | 59 | ||||
-rw-r--r-- | ui/gtk/simple_dialog.c | 3 | ||||
-rw-r--r-- | ui/simple_dialog.h | 1 |
7 files changed, 153 insertions, 36 deletions
diff --git a/color_filters.c b/color_filters.c index b960be5b38..ae894363d3 100644 --- a/color_filters.c +++ b/color_filters.c @@ -570,8 +570,10 @@ read_filters_file(FILE *f, gpointer user_data) dfilter_t *temp_dfilter; if (!dfilter_compile(filter_exp, &temp_dfilter)) { - g_warning("Could not compile color filter \"%s\" from saved filters: %s", + g_warning("Could not compile \"%s\" in colorfilters file.\n%s", name, dfilter_error_msg); + prefs.unknown_colorfilters = TRUE; + skip_end_of_line = TRUE; continue; } diff --git a/epan/prefs.c b/epan/prefs.c index 0127a0f71e..1efec50a3a 100644 --- a/epan/prefs.c +++ b/epan/prefs.c @@ -2900,7 +2900,7 @@ void prefs_reset(void) { prefs_initialized = FALSE; - + g_free(prefs.saved_at_version); /* * Unload all UAT preferences. */ @@ -3060,12 +3060,24 @@ read_prefs_file(const char *pf_path, FILE *pf, GString *cur_val; GString *cur_var; gboolean got_val = FALSE; + gboolean first_line = TRUE; gint fline = 1, pline = 1; - gchar hint[] = "(applying your preferences once should remove this warning)"; - + gchar hint[] = "(save preferences to remove this warning)"; + cur_val = g_string_new(""); cur_var = g_string_new(""); + /* Try to read in the profile name in the first line of the preferences file. */ + got_c = getc(pf); + if(got_c + && pf->_base + && strncmp((const char *)pf->_base, "# Configuration file for ", 25) == 0) { + gchar *eol = strchr(pf->_base, '\n'); + int len = eol - (pf->_base + 25) - 1; + prefs.saved_at_version = g_strndup((const gchar *)pf->_base + 25, len); + } + rewind(pf); + while ((got_c = getc(pf)) != EOF) { if (got_c == '\n') { state = START; @@ -3095,8 +3107,8 @@ read_prefs_file(const char *pf_path, FILE *pf, break; case PREFS_SET_SYNTAX_ERR: - g_warning ("%s line %d: Syntax error in preference \"%s\" %s", - pf_path, pline, cur_var->str, hint); + g_warning ("Syntax error in preference \"%s\" at line %d of\n%s %s", + cur_var->str, pline, pf_path, hint); break; case PREFS_SET_NO_SUCH_PREF: @@ -3105,19 +3117,26 @@ read_prefs_file(const char *pf_path, FILE *pf, * on non-Win32 platforms. */ if (strcmp(cur_var->str, "print.command") != 0) - g_warning ("%s line %d: No such preference \"%s\" %s", - pf_path, pline, cur_var->str, hint); + g_warning ("No such preference \"%s\" at line %d of\n%s %s", + cur_var->str, pline, pf_path, hint); + prefs.unknown_prefs = TRUE; break; case PREFS_SET_OBSOLETE: - /* We silently ignore attempts to set these; it's - probably not the user's fault that it's in there - - they may have saved preferences with a release that - supported them. */ + if (strcmp(cur_var->str, "print.command") != 0) + /* If an attempt is made to save the preferences, a popup warning will be + displayed stating that obsolete prefs have been detected and the user will + be given the opportunity to save these prefs under a different profile name. + The prefs in question need to be listed in the console window so that the + user can make an informed choice. + */ + g_warning ("Obsolete preference \"%s\" at line %d of\n%s %s", + cur_var->str, pline, pf_path, hint); + prefs.unknown_prefs = TRUE; break; } } else { - g_warning ("%s line %d: Incomplete preference %s", pf_path, pline, hint); + g_warning ("Incomplete preference at line %d: of\n%s %s", pline, pf_path, hint); } } state = IN_VAR; @@ -3130,7 +3149,7 @@ read_prefs_file(const char *pf_path, FILE *pf, } else if (got_c == '#') { state = IN_SKIP; } else { - g_warning ("%s line %d: Malformed line %s", pf_path, fline, hint); + g_warning ("Malformed preference at line %d of\n%s %s", fline, pf_path, hint); } break; case IN_VAR: @@ -3170,22 +3189,23 @@ read_prefs_file(const char *pf_path, FILE *pf, break; case PREFS_SET_SYNTAX_ERR: - g_warning ("%s line %d: Syntax error in preference %s %s", pf_path, pline, cur_var->str, hint); + g_warning ("Syntax error in preference %s at line %d of\n%s %s", + cur_var->str, pline, pf_path, hint); break; case PREFS_SET_NO_SUCH_PREF: - g_warning ("%s line %d: No such preference \"%s\" %s", pf_path, - pline, cur_var->str, hint); + g_warning ("No such preference \"%s\" at line %d of\n%s %s", + cur_var->str, pline, pf_path, hint); + prefs.unknown_prefs = TRUE; break; case PREFS_SET_OBSOLETE: - /* We silently ignore attempts to set these; it's probably not - the user's fault that it's in there - they may have saved - preferences with a release that supported it. */ + prefs.unknown_prefs = TRUE; break; } } else { - g_warning ("%s line %d: Incomplete preference %s", pf_path, pline, hint); + g_warning ("Incomplete preference at line %d of\n%s %s", + pline, pf_path, hint); } } @@ -3664,9 +3684,16 @@ set_pref(gchar *pref_name, const gchar *value, void *private_data _U_, else if (strcmp(pref_name, "sonmp") == 0) module = prefs_find_module("ndp"); else if (strcmp(pref_name, "etheric") == 0 || - strcmp(pref_name, "isup_thin") == 0) + strcmp(pref_name, "isup_thin") == 0) { /* This protocol was removed 7. July 2009 */ return PREFS_SET_OBSOLETE; + } + if (module) { + g_warning ("Preference \"%s.%s\" has been converted to \"%s.%s.%s\"\n" + "Save your preferences to make this change permanent.", + pref_name, dotp+1, module->parent->name, pref_name, dotp+1); + prefs.unknown_prefs = TRUE; + } } *dotp = '.'; /* put the preference string back */ dotp++; /* skip past separator to preference name */ @@ -3677,6 +3704,8 @@ set_pref(gchar *pref_name, const gchar *value, void *private_data _U_, pref = prefs_find_preference(module, dotp); if (pref == NULL) { + prefs.unknown_prefs = TRUE; + /* "gui" prefix was added to column preferences for better organization * within the preferences file */ diff --git a/epan/prefs.h b/epan/prefs.h index e9dd89de99..6d749b8b1a 100644 --- a/epan/prefs.h +++ b/epan/prefs.h @@ -201,6 +201,9 @@ typedef struct _e_prefs { gboolean gui_update_enabled; software_update_channel_e gui_update_channel; gint gui_update_interval; + gchar *saved_at_version; + gboolean unknown_prefs; /* unknown or obsolete pref(s) */ + gboolean unknown_colorfilters; /* unknown or obsolete color filter(s) */ } e_prefs; WS_DLL_PUBLIC e_prefs prefs; diff --git a/ui/gtk/color_dlg.c b/ui/gtk/color_dlg.c index b222870cee..84bed9bd84 100644 --- a/ui/gtk/color_dlg.c +++ b/ui/gtk/color_dlg.c @@ -1019,6 +1019,42 @@ color_clear_cb(GtkWidget *widget, gpointer data _U_) { } +static void +overwrite_existing_colorfilters_cb(gpointer dialog _U_, gint btn, gpointer data _U_) +{ + switch (btn) { + case(ESD_BTN_SAVE): + /* overwrite the file*/ + if (!color_filters_write(color_filter_edit_list)) + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, + "Could not open colorfilter file: %s", g_strerror(errno)); + else + prefs.unknown_colorfilters = FALSE; + break; + case(ESD_BTN_DONT_SAVE): + break; + default: + g_assert_not_reached(); + } +} + +static void +colorfilters_main_save() +{ + if (prefs.unknown_colorfilters) { + gpointer dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE, + "Obsolete or unrecognized color filters have been detected. " + "If this profile will be used with an older or nonstandard Wireshark version " + "or one that includes a proprietary dissector plugin, click 'Continue " + "without Saving' and save this profile under a different name.\n\n"); + + simple_dialog_set_cb(dialog, overwrite_existing_colorfilters_cb, NULL); + } else { + if (!color_filters_write(color_filter_edit_list)) + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not open filter file: %s", g_strerror(errno)); + } +} + /* User pressed "Ok" button: Exit dialog and apply new list of color filters to the capture. */ @@ -1038,11 +1074,8 @@ static void color_apply_cb(GtkButton *button _U_, gpointer user_data _U_) { /* if we don't have a Save button, just save the settings now */ - if (!prefs.gui_use_pref_save) { - if (!color_filters_write(color_filter_edit_list)) - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, - "Could not open filter file: %s", g_strerror(errno)); - } + if (!prefs.gui_use_pref_save) + colorfilters_main_save(); /* Apply the coloring rules, both the temporary ones in * color_filter_tmp_list as the permanent ones in color_filter_edit_list @@ -1058,10 +1091,7 @@ color_apply_cb(GtkButton *button _U_, gpointer user_data _U_) static void color_save_cb(GtkButton *button _U_, gpointer user_data _U_) { - - if (!color_filters_write(color_filter_edit_list)) - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, - "Could not open filter file: %s", g_strerror(errno)); + colorfilters_main_save(); } /* User pressed "Cancel" button (or "ESC" or the 'X'): diff --git a/ui/gtk/prefs_dlg.c b/ui/gtk/prefs_dlg.c index 9bc073f72a..0e7e309a2c 100644 --- a/ui/gtk/prefs_dlg.c +++ b/ui/gtk/prefs_dlg.c @@ -1252,8 +1252,8 @@ prefs_main_fetch_all(GtkWidget *dlg, gboolean *must_redissect) /* XXX - check the non-registered preferences too */ switch (prefs_modules_foreach(module_prefs_check, (gpointer)&badpref)) { - case PREFS_SET_SYNTAX_ERR: - switch (badpref->type) { + case PREFS_SET_SYNTAX_ERR: + switch (badpref->type) { case PREF_UINT: simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, @@ -1392,6 +1392,55 @@ static void prefs_copy(void) { } static void +overwrite_existing_prefs_cb(gpointer dialog _U_, gint btn, gpointer parent_w) +{ + switch (btn) { + case(ESD_BTN_SAVE): + prefs_main_write(); + prefs.unknown_prefs = FALSE; + break; + case(ESD_BTN_DONT_SAVE): + break; + default: + g_assert_not_reached(); + } +} +static void +prefs_main_save(gpointer parent_w) +{ + if (prefs.unknown_prefs) { + gpointer dialog; + gchar *msg; + gchar *msg1 = "These preferences were last saved at version "; + gchar *msg2 = "Obsolete or unrecognized preferences have been detected. " + "If you plan to use this profile with "; + gchar *msg3 = "that version of Wireshark, "; + gchar *msg4 = "an older or nonstandard Wireshark version, "; + gchar *msg5 = "click 'Continue without Saving' and save this profile under a another name.\n"; + + if (prefs.saved_at_version) { + gulong tot_msg_len = 246 + strlen(prefs.saved_at_version) + 1; + + msg = (gchar *)g_malloc(tot_msg_len); + g_snprintf(msg, tot_msg_len, "%s\"%s\". %s%s%s", + msg1, prefs.saved_at_version, msg2, msg3, msg5); + dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE, msg); + } else { + msg = (gchar *)g_malloc(214); + + g_snprintf(msg, 214, "%s%s%s", msg2, msg4, msg5); + dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE, msg); + } + + simple_dialog_set_cb(dialog, overwrite_existing_prefs_cb, parent_w); + g_free(msg); + + } else { + prefs_main_write(); + } +} + +static void prefs_main_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) { gboolean must_redissect = FALSE; @@ -1401,7 +1450,7 @@ prefs_main_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) /* if we don't have a Save button, just save the settings now */ if (!prefs.gui_use_pref_save) { - prefs_main_write(); + prefs_main_save(parent_w); } #ifdef HAVE_AIRPCAP @@ -1442,7 +1491,7 @@ prefs_main_apply_cb(GtkWidget *apply_bt _U_, gpointer parent_w) /* if we don't have a Save button, just save the settings now */ if (!prefs.gui_use_pref_save) { - prefs_main_write(); + prefs_main_save(parent_w); prefs_copy(); /* save prefs for reverting if Cancel */ } @@ -1470,7 +1519,7 @@ prefs_main_save_cb(GtkWidget *save_bt _U_, gpointer parent_w) if (!prefs_main_fetch_all((GtkWidget *)parent_w, &must_redissect)) return; /* Errors in some preference setting - already reported */ - prefs_main_write(); + prefs_main_save(parent_w); prefs_copy(); /* save prefs for reverting if Cancel */ /* Now apply those preferences. diff --git a/ui/gtk/simple_dialog.c b/ui/gtk/simple_dialog.c index 76e8ec0659..66d1795b89 100644 --- a/ui/gtk/simple_dialog.c +++ b/ui/gtk/simple_dialog.c @@ -188,6 +188,9 @@ display_simple_dialog(gint type, gint btn_mask, char *message) case(ESD_BTNS_YES_NO_CANCEL): bbox = dlg_button_row_new(GTK_STOCK_YES, GTK_STOCK_NO, GTK_STOCK_CANCEL, NULL); break; + case(ESD_BTNS_SAVE_DONTSAVE): + bbox = dlg_button_row_new(GTK_STOCK_SAVE, WIRESHARK_STOCK_DONT_SAVE, NULL); + break; case(ESD_BTNS_SAVE_DONTSAVE_CANCEL): bbox = dlg_button_row_new(GTK_STOCK_SAVE, WIRESHARK_STOCK_DONT_SAVE, GTK_STOCK_CANCEL, NULL); break; diff --git a/ui/simple_dialog.h b/ui/simple_dialog.h index 377b49a716..77692339f6 100644 --- a/ui/simple_dialog.h +++ b/ui/simple_dialog.h @@ -73,6 +73,7 @@ typedef enum { /** Standard button combination "Yes" + "No" + "Cancel". */ #define ESD_BTNS_YES_NO_CANCEL (ESD_BTN_YES|ESD_BTN_NO|ESD_BTN_CANCEL) /** Standard button combination "No" + "Cancel" + "Save". */ +#define ESD_BTNS_SAVE_DONTSAVE (ESD_BTN_SAVE|ESD_BTN_DONT_SAVE) #define ESD_BTNS_SAVE_DONTSAVE_CANCEL (ESD_BTN_DONT_SAVE|ESD_BTN_CANCEL|ESD_BTN_SAVE) /** Standard button combination "Quit without saving" + "Cancel" + "Save". */ #define ESD_BTNS_SAVE_QUIT_DONTSAVE_CANCEL (ESD_BTN_QUIT_DONT_SAVE|ESD_BTN_CANCEL|ESD_BTN_SAVE) |