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..82fec9789a 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. */ @@ -3061,11 +3061,28 @@ read_prefs_file(const char *pf_path, FILE *pf, GString *cur_var; gboolean got_val = FALSE; 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) { + GString *firstl = (GString *)pf; + + if (strncmp(firstl->str, " Configuration file for ", 24) == 0) { + gchar *eol; + gsize len; + + firstl->str += 24; + eol = strchr((char *) firstl->str, '\n'); + len = eol - firstl->str - 1; + prefs.saved_at_version = g_strndup((const gchar *)firstl->str, len); + } + } + rewind(pf); + while ((got_c = getc(pf)) != EOF) { if (got_c == '\n') { state = START; @@ -3095,8 +3112,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 +3122,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 +3154,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 +3194,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 +3689,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 +3709,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..e3a540568c 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, @@ -1391,6 +1391,55 @@ static void prefs_copy(void) { prefs_modules_foreach(module_prefs_copy, NULL); } +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 + (gulong)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) { @@ -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.