forked from osmocom/wireshark
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:
parent
4bec4b0167
commit
d222dd3989
|
@ -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
|
||||
*/
|
||||
|
|
84
epan/prefs.c
84
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue