diff --git a/epan/prefs-int.h b/epan/prefs-int.h index e10cf3d61d..2a6dee279e 100644 --- a/epan/prefs-int.h +++ b/epan/prefs-int.h @@ -174,6 +174,21 @@ struct preference { */ typedef prefs_set_pref_e (*pref_set_pair_cb) (gchar *key, const gchar *value, void *private_data, gboolean return_range_errors); +/** Set the value of a string-like preference. */ +WS_DLL_PUBLIC +void +prefs_set_string_like_value(pref_t *pref, const gchar *value, gboolean *changed); + +/** Set the value of a range preference. Return FALSE on error, TRUE otherwise. */ +WS_DLL_PUBLIC +gboolean +prefs_set_range_value(pref_t *pref, const gchar *value, gboolean *changed); + +/** Set the value of an enum preference. */ +WS_DLL_PUBLIC +void +prefs_set_enum_value(pref_t *pref, const gchar *value, gboolean *changed); + /** read the preferences file (or similar) and call the callback * function to set each key/value pair found */ diff --git a/epan/prefs.c b/epan/prefs.c index ec288b1864..c6e7b1e9a4 100644 --- a/epan/prefs.c +++ b/epan/prefs.c @@ -1022,6 +1022,23 @@ register_string_like_preference(module_t *module, const char *name, return preference; } +/* + * For use by UI code that sets preferences. + */ +void +prefs_set_string_like_value(pref_t *pref, const gchar *value, gboolean *changed) +{ + if (*pref->varp.string) { + if (strcmp(*pref->varp.string, value) != 0) { + *changed = TRUE; + g_free((void *)*pref->varp.string); + *pref->varp.string = g_strdup(value); + } + } else if (value) { + *pref->varp.string = g_strdup(value); + } +} + /* * Register a preference with a character-string value. */ @@ -1107,6 +1124,36 @@ prefs_register_range_preference(module_t *module, const char *name, preference->stashed_val.range = NULL; } +static gboolean +prefs_set_range_value_work(pref_t *pref, const gchar *value, + gboolean return_range_errors, gboolean *changed) +{ + range_t *newrange; + + if (range_convert_str_work(&newrange, value, pref->info.max_value, + return_range_errors) != CVT_NO_ERROR) { + return FALSE; /* number was bad */ + } + + if (!ranges_are_equal(*pref->varp.range, newrange)) { + *changed = TRUE; + g_free(*pref->varp.range); + *pref->varp.range = newrange; + } else { + g_free(newrange); + } + return TRUE; +} + +/* + * For use by UI code that sets preferences. + */ +gboolean +prefs_set_range_value(pref_t *pref, const gchar *value, gboolean *changed) +{ + return prefs_set_range_value_work(pref, value, TRUE, changed); +} + /* * Register a static text 'preference'. It can be used to add explanatory * text inline with other preferences in the GUI. @@ -1456,15 +1503,7 @@ column_hidden_set_cb(pref_t* pref, const gchar* value, gboolean* changed) fmt_data *cfmt; pref_t *format_pref; - if (*pref->varp.string) { - if (strcmp(*pref->varp.string, value) != 0) { - *changed = TRUE; - g_free((void *)*pref->varp.string); - *pref->varp.string = g_strdup(value); - } - } else if (value) { - *pref->varp.string = g_strdup(value); - } + prefs_set_string_like_value(pref, value, changed); /* * Set the "visible" flag for the existing columns; we need to @@ -1995,11 +2034,7 @@ colorized_frame_reset_cb(pref_t* pref) static prefs_set_pref_e colorized_frame_set_cb(pref_t* pref, const gchar* value, gboolean* changed) { - if (strcmp(*pref->varp.string, value) != 0) { - *changed = TRUE; - g_free((void *)*pref->varp.string); - *pref->varp.string = g_strdup(value); - } + prefs_set_string_like_value(pref, value, changed); return PREFS_SET_OK; } @@ -4394,29 +4429,14 @@ set_pref(gchar *pref_name, const gchar *value, void *private_data _U_, case PREF_STRING: case PREF_FILENAME: case PREF_DIRNAME: - if (strcmp(*pref->varp.string, value) != 0) { - module->prefs_changed = TRUE; - g_free((void *)*pref->varp.string); - *pref->varp.string = g_strdup(value); - } + prefs_set_string_like_value(pref, value, &module->prefs_changed); break; case PREF_RANGE: { - range_t *newrange; - - if (range_convert_str_work(&newrange, value, pref->info.max_value, - return_range_errors) != CVT_NO_ERROR) { + if (!prefs_set_range_value_work(pref, value, return_range_errors, + &module->prefs_changed)) return PREFS_SET_SYNTAX_ERR; /* number was bad */ - } - - if (!ranges_are_equal(*pref->varp.range, newrange)) { - module->prefs_changed = TRUE; - g_free(*pref->varp.range); - *pref->varp.range = newrange; - } else { - g_free (newrange); - } break; } diff --git a/ui/gtk/main_menubar.c b/ui/gtk/main_menubar.c index d8bccc9aff..f2b87383c2 100644 --- a/ui/gtk/main_menubar.c +++ b/ui/gtk/main_menubar.c @@ -4784,7 +4784,6 @@ menu_prefs_change_ok (GtkWidget *w, gpointer parent_w) module_t *module = (module_t *)g_object_get_data (G_OBJECT(w), "module"); pref_t *pref = (pref_t *)g_object_get_data (G_OBJECT(w), "pref"); const gchar *new_value = gtk_entry_get_text(GTK_ENTRY(entry)); - range_t *newrange; gchar *p; guint uval; @@ -4803,26 +4802,15 @@ menu_prefs_change_ok (GtkWidget *w, gpointer parent_w) } break; case PREF_STRING: - if (strcmp (*pref->varp.string, new_value) != 0) { - module->prefs_changed = TRUE; - g_free((void*)*pref->varp.string); - *pref->varp.string = g_strdup(new_value); - } + prefs_set_string_like_value(pref, new_value, &module->prefs_changed); break; case PREF_RANGE: - if (range_convert_str(&newrange, new_value, pref->info.max_value) != CVT_NO_ERROR) { + if (!prefs_set_range_value(pref, new_value, &module->prefs_changed)) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The value \"%s\" isn't a valid range.", new_value); return; } - if (!ranges_are_equal(*pref->varp.range, newrange)) { - module->prefs_changed = TRUE; - g_free(*pref->varp.range); - *pref->varp.range = newrange; - } else { - g_free (newrange); - } break; default: g_assert_not_reached(); diff --git a/ui/gtk/prefs_dlg.c b/ui/gtk/prefs_dlg.c index 42f9fcae2f..ba5b94c7b0 100644 --- a/ui/gtk/prefs_dlg.c +++ b/ui/gtk/prefs_dlg.c @@ -1085,36 +1085,19 @@ pref_fetch(pref_t *pref, gpointer user_data) case PREF_FILENAME: case PREF_DIRNAME: str_val = gtk_entry_get_text(GTK_ENTRY(pref->control)); - if (strcmp(*pref->varp.string, str_val) != 0) { - *pref_changed_p = TRUE; - g_free((void *)*pref->varp.string); - *pref->varp.string = g_strdup(str_val); - } + prefs_set_string_like_value(pref, str_val, pref_changed_p); break; case PREF_RANGE: - { - range_t *newrange; - convert_ret_t ret; - str_val = gtk_entry_get_text(GTK_ENTRY(pref->control)); - ret = range_convert_str(&newrange, str_val, pref->info.max_value); - if (ret != CVT_NO_ERROR) + if (!prefs_set_range_value(pref, str_val, pref_changed_p)) #if 0 return PREFS_SET_SYNTAX_ERR; /* range was bad */ #else return 0; /* XXX - should fail */ #endif - if (!ranges_are_equal(*pref->varp.range, newrange)) { - *pref_changed_p = TRUE; - g_free(*pref->varp.range); - *pref->varp.range = newrange; - } else - g_free(newrange); - break; - } case PREF_STATIC_TEXT: case PREF_UAT: