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>
This commit is contained in:
Guy Harris 2015-12-17 19:18:33 -08:00
parent 4bec4b0167
commit d222dd3989
4 changed files with 71 additions and 65 deletions

View File

@ -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
*/

View File

@ -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;
}

View File

@ -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();

View File

@ -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: