aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Morriss <jeff.morriss@ulticom.com>2012-06-13 01:13:12 +0000
committerJeff Morriss <jeff.morriss@ulticom.com>2012-06-13 01:13:12 +0000
commit4fdc3c3cc2f7796187651d5d987debd438d23521 (patch)
tree0758e88c61334cffbb722b80e6c2200fc77e6884
parentf0a74f3a5c90cfd6418905d1f7a02c1d59a63a7f (diff)
Create, and start using, file name preferences.
File name preferences are basically just string preferences except that the GUI will present a "Browse" button that allows the user to go and find the file s/he wants (rather than having to blindly type in the full path). svn path=/trunk/; revision=43228
-rw-r--r--doc/README.developer8
-rw-r--r--epan/dissectors/packet-dtls.c8
-rw-r--r--epan/dissectors/packet-ssl.c4
-rw-r--r--epan/libwireshark.def1
-rw-r--r--epan/prefs-int.h1
-rw-r--r--epan/prefs.c41
-rw-r--r--epan/prefs.h9
-rw-r--r--plugins/asn1/packet-asn1.c8
-rw-r--r--plugins/mate/packet-mate.c8
-rw-r--r--ui/gtk/prefs_dlg.c58
10 files changed, 123 insertions, 23 deletions
diff --git a/doc/README.developer b/doc/README.developer
index 29cc51443d..1bbc52a8c7 100644
--- a/doc/README.developer
+++ b/doc/README.developer
@@ -3721,6 +3721,14 @@ routines -
void prefs_register_string_preference(module_t *module, const char *name,
const char *title, const char *description, char **var)
+ /* Register a preference with a file name (string) value.
+ * File name preferences are basically like string preferences
+ * except that the GUI gives the user the ability to browse for the
+ * file.
+ */
+ void prefs_register_filename_preference(module_t *module, const char *name,
+ const char *title, const char *description, char **var)
+
/* Register a preference with a range of unsigned integers (e.g.,
* "1-20,30-40").
*/
diff --git a/epan/dissectors/packet-dtls.c b/epan/dissectors/packet-dtls.c
index 3e2765d8b1..ab19fd6e5e 100644
--- a/epan/dissectors/packet-dtls.c
+++ b/epan/dissectors/packet-dtls.c
@@ -2657,10 +2657,10 @@ proto_register_dtls(void)
"A table of RSA keys for DTLS decryption",
dtlsdecrypt_uat);
- prefs_register_string_preference(dtls_module, "debug_file", "DTLS debug file",
- "redirect dtls debug to file name; leave empty to disable debug, "
- "use \"" SSL_DEBUG_USE_STDERR "\" to redirect output to stderr\n",
- &dtls_debug_file_name);
+ prefs_register_filename_preference(dtls_module, "debug_file", "DTLS debug file",
+ "redirect dtls debug to file name; leave empty to disable debug, "
+ "use \"" SSL_DEBUG_USE_STDERR "\" to redirect output to stderr\n",
+ &dtls_debug_file_name);
prefs_register_string_preference(dtls_module, "keys_list", "RSA keys list (deprecated)",
"Semicolon-separated list of private RSA keys used for DTLS decryption. "
diff --git a/epan/dissectors/packet-ssl.c b/epan/dissectors/packet-ssl.c
index fdd954a009..922c7e4998 100644
--- a/epan/dissectors/packet-ssl.c
+++ b/epan/dissectors/packet-ssl.c
@@ -5638,7 +5638,7 @@ proto_register_ssl(void)
"A table of RSA keys for SSL decryption",
ssldecrypt_uat);
- prefs_register_string_preference(ssl_module, "debug_file", "SSL debug file",
+ prefs_register_filename_preference(ssl_module, "debug_file", "SSL debug file",
"Redirect SSL debug to file name; leave empty to disable debugging, "
"or use \"" SSL_DEBUG_USE_STDERR "\" to redirect output to stderr\n",
&ssl_debug_file_name);
@@ -5670,7 +5670,7 @@ proto_register_ssl(void)
"Pre-Shared-Key as HEX string, should be 0 to 16 bytes",
&ssl_psk);
- prefs_register_string_preference(ssl_module, "keylog_file", "(Pre)-Master-Secret log filename",
+ prefs_register_filename_preference(ssl_module, "keylog_file", "(Pre)-Master-Secret log filename",
"The filename of a file which contains a list of \n"
"(pre-)master secrets in one of the following formats:\n"
"\n"
diff --git a/epan/libwireshark.def b/epan/libwireshark.def
index db92016783..aa0fb2e6cb 100644
--- a/epan/libwireshark.def
+++ b/epan/libwireshark.def
@@ -733,6 +733,7 @@ prefs_modules_foreach_submodules
prefs_pref_foreach
prefs_register_bool_preference
prefs_register_enum_preference
+prefs_register_filename_preference
prefs_register_modules
prefs_register_obsolete_preference
prefs_register_protocol
diff --git a/epan/prefs-int.h b/epan/prefs-int.h
index 8208bfa3d2..c7f8d4fc9f 100644
--- a/epan/prefs-int.h
+++ b/epan/prefs-int.h
@@ -64,6 +64,7 @@ typedef enum {
PREF_RANGE,
PREF_STATIC_TEXT,
PREF_UAT,
+ PREF_FILENAME,
PREF_OBSOLETE
} pref_type_t;
diff --git a/epan/prefs.c b/epan/prefs.c
index 9cd716861a..6b3dffae55 100644
--- a/epan/prefs.c
+++ b/epan/prefs.c
@@ -139,6 +139,7 @@ free_pref(gpointer data, gpointer user_data _U_)
case PREF_UAT:
break;
case PREF_STRING:
+ case PREF_FILENAME:
g_free((char *)*pref->varp.string);
*pref->varp.string = NULL;
g_free(pref->default_val.string);
@@ -734,19 +735,16 @@ prefs_register_enum_preference(module_t *module, const char *name,
preference->info.enum_info.radio_buttons = radio_buttons;
}
-/*
- * Register a preference with a character-string value.
- */
-void
-prefs_register_string_preference(module_t *module, const char *name,
- const char *title, const char *description,
- const char **var)
+static void
+register_string_like_preference(module_t *module, const char *name,
+ const char *title, const char *description,
+ const char **var, pref_type_t type)
{
pref_t *preference;
char *varcopy;
preference = register_preference(module, name, title, description,
- PREF_STRING);
+ type);
/*
* String preference values should be non-null (as you can't
@@ -770,6 +768,30 @@ prefs_register_string_preference(module_t *module, const char *name,
}
/*
+ * Register a preference with a character-string value.
+ */
+void
+prefs_register_string_preference(module_t *module, const char *name,
+ const char *title, const char *description,
+ const char **var)
+{
+ register_string_like_preference(module, name, title, description, var,
+ PREF_STRING);
+}
+
+/*
+ * Register a preference with a file name (string) value.
+ */
+void
+prefs_register_filename_preference(module_t *module, const char *name,
+ const char *title, const char *description,
+ const char **var)
+{
+ register_string_like_preference(module, name, title, description, var,
+ PREF_FILENAME);
+}
+
+/*
* Register a preference with a ranged value.
*/
void
@@ -1433,6 +1455,7 @@ reset_pref(gpointer data, gpointer user_data _U_)
break;
case PREF_STRING:
+ case PREF_FILENAME:
g_free((void *)*pref->varp.string);
*pref->varp.string = g_strdup(pref->default_val.string);
break;
@@ -2989,6 +3012,7 @@ set_pref(gchar *pref_name, gchar *value, void *private_data _U_,
break;
case PREF_STRING:
+ case PREF_FILENAME:
if (strcmp(*pref->varp.string, value) != 0) {
module->prefs_changed = TRUE;
g_free((void *)*pref->varp.string);
@@ -3141,6 +3165,7 @@ write_pref(gpointer data, gpointer user_data)
break;
case PREF_STRING:
+ case PREF_FILENAME:
fprintf(arg->pf, "# A string.\n");
if (!(strcmp(pref->default_val.string, *pref->varp.string)))
fprintf(arg->pf, "#");
diff --git a/epan/prefs.h b/epan/prefs.h
index eae802e3d7..49b453770c 100644
--- a/epan/prefs.h
+++ b/epan/prefs.h
@@ -348,6 +348,15 @@ extern void prefs_register_string_preference(module_t *module, const char *name,
const char *title, const char *description, const char **var);
/*
+ * Register a preference with a file name (string) value.
+ * File name preferences are basically like string preferences
+ * except that the GUI gives the user the ability to browse for the
+ * file.
+ */
+extern void prefs_register_filename_preference(module_t *module, const char *name,
+ const char *title, const char *description, const char **var);
+
+/*
* Register a preference with a ranged value.
*/
extern void prefs_register_range_preference(module_t *module, const char *name,
diff --git a/plugins/asn1/packet-asn1.c b/plugins/asn1/packet-asn1.c
index a9f50b46ab..394dd58c48 100644
--- a/plugins/asn1/packet-asn1.c
+++ b/plugins/asn1/packet-asn1.c
@@ -5311,10 +5311,10 @@ proto_register_asn1(void) {
#endif
orig_ptr = asn1_filename;
- prefs_register_string_preference(asn1_module, "file",
- "ASN.1 type table file",
- "Compiled ASN.1 description of ASN.1 types",
- &asn1_filename);
+ prefs_register_filename_preference(asn1_module, "file",
+ "ASN.1 type table file",
+ "Compiled ASN.1 description of ASN.1 types",
+ &asn1_filename);
/* prefs_register_string_preference just overwrite our pointer with a pointer
* to a _copy_ of our string. Free the original string.
*/
diff --git a/plugins/mate/packet-mate.c b/plugins/mate/packet-mate.c
index 2ed67a57e3..5aa8a2a36f 100644
--- a/plugins/mate/packet-mate.c
+++ b/plugins/mate/packet-mate.c
@@ -372,10 +372,10 @@ proto_register_mate(void)
proto_mate = proto_register_protocol("Meta Analysis Tracing Engine", "MATE", "mate");
register_dissector("mate",mate_tree,proto_mate);
mate_module = prefs_register_protocol(proto_mate, proto_reg_handoff_mate);
- prefs_register_string_preference(mate_module, "config",
- "Configuration Filename",
- "The name of the file containing the mate module's configuration",
- &pref_mate_config_filename);
+ prefs_register_filename_preference(mate_module, "config",
+ "Configuration Filename",
+ "The name of the file containing the mate module's configuration",
+ &pref_mate_config_filename);
mate_handle = find_dissector("mate");
register_postdissector(mate_handle);
diff --git a/ui/gtk/prefs_dlg.c b/ui/gtk/prefs_dlg.c
index 696dc9acea..acb5787208 100644
--- a/ui/gtk/prefs_dlg.c
+++ b/ui/gtk/prefs_dlg.c
@@ -59,6 +59,7 @@
#include "ui/gtk/keys.h"
#include "ui/gtk/uat_gui.h"
#include "ui/gtk/old-gtk-compat.h"
+#include "ui/gtk/file_dlg.h"
#ifdef HAVE_LIBPCAP
#ifdef _WIN32
@@ -79,6 +80,8 @@ static gboolean prefs_main_delete_event_cb(GtkWidget *, GdkEvent *, gpointer);
static void prefs_main_destroy_cb(GtkWidget *, gpointer);
static void prefs_tree_select_cb(GtkTreeSelection *, gpointer);
+static GtkWidget *create_preference_filename_entry(GtkWidget *, int,
+ const gchar *, const gchar *, char *);
#define E_PREFSW_SCROLLW_KEY "prefsw_scrollw"
#define E_PREFSW_TREE_KEY "prefsw_tree"
@@ -219,6 +222,15 @@ pref_show(pref_t *pref, gpointer user_data)
pref->saved_val.string);
break;
+ case PREF_FILENAME:
+ g_free(pref->saved_val.string);
+ pref->saved_val.string = g_strdup(*pref->varp.string);
+ pref->control = create_preference_filename_entry(main_tb, pref->ordinal,
+ label_string,
+ pref->description,
+ pref->saved_val.string);
+ break;
+
case PREF_RANGE:
{
char *range_str_p;
@@ -863,6 +875,45 @@ create_preference_entry(GtkWidget *main_tb, int table_position,
return entry;
}
+static void
+preference_filename_entry_cb(GtkWidget *button, GtkWidget *filename_te)
+{
+ /* XXX - use a better browser dialog title */
+ file_selection_browse(button, filename_te, "Wireshark: file preference",
+ FILE_SELECTION_READ_BROWSE);
+}
+
+static GtkWidget *
+create_preference_filename_entry(GtkWidget *main_tb, int table_position,
+ const gchar *label_text, const gchar *tooltip_text, char *value)
+{
+ GtkWidget *entry;
+ GtkWidget *button, *file_bt_hb;
+
+ set_option_label(main_tb, table_position, label_text, tooltip_text);
+ file_bt_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
+ gtk_table_attach_defaults(GTK_TABLE(main_tb), file_bt_hb, 1, 2,
+ table_position, table_position + 1);
+ gtk_widget_show(file_bt_hb);
+
+ button = gtk_button_new_from_stock(WIRESHARK_STOCK_BROWSE);
+ gtk_box_pack_end(GTK_BOX(file_bt_hb), button, FALSE, FALSE, 0);
+ gtk_widget_show(button);
+
+ entry = gtk_entry_new();
+ gtk_box_pack_start(GTK_BOX(file_bt_hb), entry, TRUE, TRUE, 0);
+ if (value != NULL)
+ gtk_entry_set_text(GTK_ENTRY(entry), value);
+ if (tooltip_text != NULL)
+ gtk_widget_set_tooltip_text(entry, tooltip_text);
+ gtk_widget_show(entry);
+
+ g_signal_connect(button, "clicked", G_CALLBACK(preference_filename_entry_cb), entry);
+
+
+ return entry;
+}
+
GtkWidget *
create_preference_static_text(GtkWidget *main_tb, int table_position,
const gchar *label_text, const gchar *tooltip_text)
@@ -886,7 +937,7 @@ GtkWidget *
create_preference_uat(GtkWidget *main_tb, int table_position,
const gchar *label_text, const gchar *tooltip_text, void* uat)
{
- GtkWidget *button = NULL;
+ GtkWidget *button;
set_option_label(main_tb, table_position, label_text, tooltip_text);
@@ -947,6 +998,7 @@ pref_check(pref_t *pref, gpointer user_data)
break;
case PREF_STRING:
+ case PREF_FILENAME:
/* Value can't be bad. */
break;
@@ -1035,6 +1087,7 @@ pref_fetch(pref_t *pref, gpointer user_data)
break;
case PREF_STRING:
+ case PREF_FILENAME:
str_val = gtk_entry_get_text(GTK_ENTRY(pref->control));
if (strcmp(*pref->varp.string, str_val) != 0) {
*pref_changed_p = TRUE;
@@ -1182,6 +1235,7 @@ pref_clean(pref_t *pref, gpointer user_data _U_)
break;
case PREF_STRING:
+ case PREF_FILENAME:
if (pref->saved_val.string != NULL) {
g_free(pref->saved_val.string);
pref->saved_val.string = NULL;
@@ -1377,6 +1431,7 @@ pref_copy(pref_t *pref, gpointer user_data _U_)
break;
case PREF_STRING:
+ case PREF_FILENAME:
g_free(pref->saved_val.string);
pref->saved_val.string = g_strdup(*pref->varp.string);
break;
@@ -1576,6 +1631,7 @@ pref_revert(pref_t *pref, gpointer user_data)
break;
case PREF_STRING:
+ case PREF_FILENAME:
if (strcmp(*pref->varp.string, pref->saved_val.string) != 0) {
*pref_changed_p = TRUE;
g_free((void *)*pref->varp.string);