summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--color_filters.c4
-rw-r--r--epan/prefs.c71
-rw-r--r--epan/prefs.h3
-rw-r--r--ui/gtk/color_dlg.c48
-rw-r--r--ui/gtk/prefs_dlg.c59
-rw-r--r--ui/gtk/simple_dialog.c3
-rw-r--r--ui/simple_dialog.h1
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)