diff options
author | Jeff Morriss <jeff.morriss@ulticom.com> | 2012-06-13 01:13:12 +0000 |
---|---|---|
committer | Jeff Morriss <jeff.morriss@ulticom.com> | 2012-06-13 01:13:12 +0000 |
commit | 4fdc3c3cc2f7796187651d5d987debd438d23521 (patch) | |
tree | 0758e88c61334cffbb722b80e6c2200fc77e6884 | |
parent | f0a74f3a5c90cfd6418905d1f7a02c1d59a63a7f (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.developer | 8 | ||||
-rw-r--r-- | epan/dissectors/packet-dtls.c | 8 | ||||
-rw-r--r-- | epan/dissectors/packet-ssl.c | 4 | ||||
-rw-r--r-- | epan/libwireshark.def | 1 | ||||
-rw-r--r-- | epan/prefs-int.h | 1 | ||||
-rw-r--r-- | epan/prefs.c | 41 | ||||
-rw-r--r-- | epan/prefs.h | 9 | ||||
-rw-r--r-- | plugins/asn1/packet-asn1.c | 8 | ||||
-rw-r--r-- | plugins/mate/packet-mate.c | 8 | ||||
-rw-r--r-- | ui/gtk/prefs_dlg.c | 58 |
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); |