summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2015-12-17 19:18:33 -0800
committerGuy Harris <guy@alum.mit.edu>2015-12-18 03:19:03 +0000
commitd222dd398904dda499cb6fe2d5f300643076c2b1 (patch)
tree2ed0f5f624edd872ec333a4858ceed8da3d67dee
parent4bec4b0167961bf557f82fb20ba3e95e4dfd3f86 (diff)
downloadwireshark-d222dd398904dda499cb6fe2d5f300643076c2b1.tar.gz
Provide routines to set string-like and range preferences from a string.
That gets rid of some duplicate code. Change-Id: I4b65c6c73929d18602f6b0425e4f3dbbabbf0127 Reviewed-on: https://code.wireshark.org/review/12713 Reviewed-by: Guy Harris <guy@alum.mit.edu>
-rw-r--r--epan/prefs-int.h15
-rw-r--r--epan/prefs.c84
-rw-r--r--ui/gtk/main_menubar.c16
-rw-r--r--ui/gtk/prefs_dlg.c21
4 files changed, 71 insertions, 65 deletions
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
@@ -1023,6 +1023,23 @@ register_string_like_preference(module_t *module, const char *name,
}
/*
+ * 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.
*/
void
@@ -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: