extcap: Convert settings to preference friendly key names
authorMikael Kanstrup <mikael.kanstrup@gmail.com>
Wed, 3 Feb 2016 11:14:15 +0000 (12:14 +0100)
committerRoland Knall <rknall@gmail.com>
Thu, 11 Feb 2016 06:40:16 +0000 (06:40 +0000)
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>
extcap.c
extcap.h
ui/qt/extcap_argument.cpp
ui/qt/extcap_argument.h
ui/qt/extcap_options_dialog.cpp

index 938042880a0aa7d91a27aa60fc299afa3f427de3..61a4c3aa8ba157b30c342bf43ab9e259b752232b 100644 (file)
--- a/extcap.c
+++ b/extcap.c
@@ -461,6 +461,34 @@ static void extcap_free_if_configuration(GList *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,
         char **err_str _U_) {
     extcap_token_sentence *tokens = NULL;
@@ -482,37 +510,29 @@ static gboolean search_cb(const gchar *extcap _U_, const gchar *ifname _U_, gcha
     if ( dev_module ) {
         GList * walker = arguments;
 
-        GRegex * regex = g_regex_new ("[-]+", (GRegexCompileFlags) 0, (GRegexMatchFlags) 0, NULL );
-        if (regex) {
-            while ( walker != NULL ) {
-                extcap_arg * arg = (extcap_arg *)walker->data;
-
-                if ( arg->save ) {
-                    struct preference * pref = NULL;
+        while ( walker != NULL ) {
+            extcap_arg * arg = (extcap_arg *)walker->data;
 
-                    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 ( arg->save ) {
+                struct preference * pref = NULL;
+                gchar * pref_ifname = extcap_settings_key(ifname, arg->call);
 
-                    if ( ( pref = prefs_find_preference(dev_module, pref_ifname) ) == NULL ) {
-                        /* Set an initial value */
-                        if ( ! arg->storeval && arg->default_complex )
-                            arg->storeval = g_strdup(arg->default_complex->_val);
+                if ( ( pref = prefs_find_preference(dev_module, pref_ifname) ) == NULL ) {
+                    /* Set an initial value */
+                    if ( ! arg->storeval && arg->default_complex )
+                        arg->storeval = g_strdup(arg->default_complex->_val);
 
-                        prefs_register_string_preference(dev_module, g_strdup(pref_ifname),
-                                arg->display, arg->display, (const gchar **)&(arg->storeval));
-                    } else {
-                        /* Been here before, restore stored value */
-                        if (! arg->storeval && pref->varp.string)
-                            arg->storeval = g_strdup(*(pref->varp.string));
+                    prefs_register_string_preference(dev_module, g_strdup(pref_ifname),
+                            arg->display, arg->display, (const gchar **)&(arg->storeval));
+                } else {
+                    /* Been here before, restore stored value */
+                    if (! arg->storeval && pref->varp.string)
+                        arg->storeval = g_strdup(*(pref->varp.string));
                     }
-
-                    g_free(pref_name);
-                    g_free(pref_ifname);
-                }
-
-                walker = g_list_next(walker);
+                g_free(pref_ifname);
             }
-            g_regex_unref(regex);
+
+            walker = g_list_next(walker);
         }
     }
 
index b2b6b5fa4346b153227668d4271c3dd69f539fd7..823c04af3cb87592ce511ae0bb74d4fba9ac5d53 100644 (file)
--- a/extcap.h
+++ b/extcap.h
@@ -87,6 +87,9 @@ extcap_get_if_configuration(const char * ifname);
 gboolean
 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
 HANDLE
 extcap_get_win32_handle();
index 3200a7e1d62c37eddff128c8540675364539ede1..c4e14039d48e80c8b10363487a3a91aae6a208c6 100644 (file)
@@ -593,12 +593,12 @@ QString ExtcapArgument::defaultValue()
     return QString();
 }
 
-QString ExtcapArgument::prefKey()
+QString ExtcapArgument::prefKey(const QString & device_name)
 {
     if ( ! _argument->save )
         return QString();
 
-    return QString(_argument->call).replace("-", "");
+    return QString(extcap_settings_key(device_name.toStdString().c_str(), _argument->call));
 }
 
 bool ExtcapArgument::isRequired()
index 2d605d28811ea4666ac195e0f4afc69fac3e00eb..084b3336f16e077d726bcd1b57d1965df87f77d9 100644 (file)
@@ -98,7 +98,7 @@ public:
     bool isValid();
     bool isRequired();
 
-    QString prefKey();
+    QString prefKey(const QString & device_name);
     virtual QString prefValue();
 
     static ExtcapArgument * create(extcap_arg * argument = 0);
index ed7a0150e4edf3cdb492750c78430aa6a2416584..07c0523628ef14879552694473c7aac10e64c3a8 100644 (file)
@@ -373,16 +373,15 @@ void ExtcapOptionsDialog::storeValues()
         else
             value = (*iter)->prefValue();
 
-        QString prefKey = QString("%1.%2").arg(device_name).arg(argument->prefKey());
-        if ( prefKey.length() > 0 )
+        QString key = argument->prefKey(device_name);
+        if (key.length() > 0)
         {
-            gchar * key = g_strdup(prefKey.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 */
             (*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);
         }
     }