extcap: Convert settings to preference friendly key names

Preferences are only allowed to contain lowercase ASCII letters,
numbers, underscores or dot characters. Create a utility function
to convert an extcap setting to its equivalent preference key and
use it wherever conversion from setting to preference key is needed.

Bug: 12064
Change-Id: I39bbac7de5f0f905bd41c54257fa997a3b32442d
Reviewed-on: https://code.wireshark.org/review/13687
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Roland Knall <rknall@gmail.com>
This commit is contained in:
Mikael Kanstrup 2016-02-03 12:14:15 +01:00 committed by Roland Knall
parent fa56b68f4f
commit 7a1eca1726
5 changed files with 55 additions and 33 deletions

View File

@ -461,6 +461,34 @@ static void extcap_free_if_configuration(GList *list)
g_list_free(list); g_list_free(list);
} }
gchar * extcap_settings_key(const gchar * ifname, const gchar * setting)
{
gchar * setting_nohyphen;
gchar * ifname_underscore;
gchar * ifname_lower;
gchar * key;
GRegex * regex = g_regex_new ("(?![a-zA-Z1-9_]).", (GRegexCompileFlags) 0, (GRegexMatchFlags) 0, NULL );
if (!regex)
return NULL;
setting_nohyphen =
g_regex_replace_literal(regex, setting, strlen(setting), 0,
"", (GRegexMatchFlags) 0, NULL );
ifname_underscore =
g_regex_replace_literal(regex, ifname, strlen(ifname), 0,
"_", (GRegexMatchFlags) 0, NULL );
ifname_lower = g_utf8_strdown(ifname_underscore, -1);
key = g_strconcat(ifname_lower, ".", setting_nohyphen, NULL);
g_free(setting_nohyphen);
g_free(ifname_underscore);
g_free(ifname_lower);
g_regex_unref(regex);
return key;
}
static gboolean search_cb(const gchar *extcap _U_, const gchar *ifname _U_, gchar *output, void *data, static gboolean search_cb(const gchar *extcap _U_, const gchar *ifname _U_, gchar *output, void *data,
char **err_str _U_) { char **err_str _U_) {
extcap_token_sentence *tokens = NULL; extcap_token_sentence *tokens = NULL;
@ -482,16 +510,12 @@ static gboolean search_cb(const gchar *extcap _U_, const gchar *ifname _U_, gcha
if ( dev_module ) { if ( dev_module ) {
GList * walker = arguments; GList * walker = arguments;
GRegex * regex = g_regex_new ("[-]+", (GRegexCompileFlags) 0, (GRegexMatchFlags) 0, NULL );
if (regex) {
while ( walker != NULL ) { while ( walker != NULL ) {
extcap_arg * arg = (extcap_arg *)walker->data; extcap_arg * arg = (extcap_arg *)walker->data;
if ( arg->save ) { if ( arg->save ) {
struct preference * pref = NULL; struct preference * pref = NULL;
gchar * pref_ifname = extcap_settings_key(ifname, arg->call);
gchar * pref_name = g_regex_replace(regex, arg->call, strlen(arg->call), 0, "", (GRegexMatchFlags) 0, NULL );
gchar * pref_ifname = g_strdup(g_strconcat(ifname, ".", pref_name, NULL));
if ( ( pref = prefs_find_preference(dev_module, pref_ifname) ) == NULL ) { if ( ( pref = prefs_find_preference(dev_module, pref_ifname) ) == NULL ) {
/* Set an initial value */ /* Set an initial value */
@ -505,15 +529,11 @@ static gboolean search_cb(const gchar *extcap _U_, const gchar *ifname _U_, gcha
if (! arg->storeval && pref->varp.string) if (! arg->storeval && pref->varp.string)
arg->storeval = g_strdup(*(pref->varp.string)); arg->storeval = g_strdup(*(pref->varp.string));
} }
g_free(pref_name);
g_free(pref_ifname); g_free(pref_ifname);
} }
walker = g_list_next(walker); walker = g_list_next(walker);
} }
g_regex_unref(regex);
}
} }
*il = g_list_append(*il, arguments); *il = g_list_append(*il, arguments);

View File

@ -87,6 +87,9 @@ extcap_get_if_configuration(const char * ifname);
gboolean gboolean
extcap_has_configuration(const char * ifname, gboolean is_required); extcap_has_configuration(const char * ifname, gboolean is_required);
/* converts an extcap setting to its equivalent preference key */
gchar * extcap_settings_key(const gchar * ifname, const gchar * setting);
#ifdef WIN32 #ifdef WIN32
HANDLE HANDLE
extcap_get_win32_handle(); extcap_get_win32_handle();

View File

@ -593,12 +593,12 @@ QString ExtcapArgument::defaultValue()
return QString(); return QString();
} }
QString ExtcapArgument::prefKey() QString ExtcapArgument::prefKey(const QString & device_name)
{ {
if ( ! _argument->save ) if ( ! _argument->save )
return QString(); return QString();
return QString(_argument->call).replace("-", ""); return QString(extcap_settings_key(device_name.toStdString().c_str(), _argument->call));
} }
bool ExtcapArgument::isRequired() bool ExtcapArgument::isRequired()

View File

@ -98,7 +98,7 @@ public:
bool isValid(); bool isValid();
bool isRequired(); bool isRequired();
QString prefKey(); QString prefKey(const QString & device_name);
virtual QString prefValue(); virtual QString prefValue();
static ExtcapArgument * create(extcap_arg * argument = 0); static ExtcapArgument * create(extcap_arg * argument = 0);

View File

@ -373,16 +373,15 @@ void ExtcapOptionsDialog::storeValues()
else else
value = (*iter)->prefValue(); value = (*iter)->prefValue();
QString prefKey = QString("%1.%2").arg(device_name).arg(argument->prefKey()); QString key = argument->prefKey(device_name);
if ( prefKey.length() > 0 ) if (key.length() > 0)
{ {
gchar * key = g_strdup(prefKey.toStdString().c_str());
gchar * val = g_strdup(value.length() == 0 ? " " : value.toStdString().c_str()); gchar * val = g_strdup(value.length() == 0 ? " " : value.toStdString().c_str());
/* Setting the internally stored value for the preference to the new value */ /* Setting the internally stored value for the preference to the new value */
(*iter)->argument()->storeval = g_strdup(val); (*iter)->argument()->storeval = g_strdup(val);
g_hash_table_insert(entries, key, val); g_hash_table_insert(entries, g_strdup(key.toStdString().c_str()), val);
} }
} }