diff options
-rw-r--r-- | epan/libwireshark.def | 2 | ||||
-rw-r--r-- | epan/prefs-int.h | 4 | ||||
-rw-r--r-- | epan/prefs.c | 84 | ||||
-rw-r--r-- | epan/prefs.h | 23 | ||||
-rw-r--r-- | ui/CMakeLists.txt | 1 | ||||
-rw-r--r-- | ui/Makefile.common | 2 | ||||
-rw-r--r-- | ui/gtk/airpcap_dlg.c | 1 | ||||
-rw-r--r-- | ui/gtk/capture_dlg.c | 3 | ||||
-rw-r--r-- | ui/gtk/filter_expression_save_dlg.c | 5 | ||||
-rw-r--r-- | ui/gtk/gtkglobals.h | 3 | ||||
-rw-r--r-- | ui/gtk/main.c | 16 | ||||
-rw-r--r-- | ui/gtk/main.h | 3 | ||||
-rw-r--r-- | ui/gtk/main_menubar.c | 1 | ||||
-rw-r--r-- | ui/gtk/packet_list.c | 1 | ||||
-rw-r--r-- | ui/gtk/prefs_dlg.c | 247 | ||||
-rw-r--r-- | ui/gtk/prefs_dlg.h | 4 | ||||
-rw-r--r-- | ui/preference_utils.c | 295 | ||||
-rw-r--r-- | ui/preference_utils.h | 88 | ||||
-rw-r--r-- | ui/qt/display_filter_combo.cpp | 2 | ||||
-rw-r--r-- | ui/qt/main.cpp | 3 | ||||
-rw-r--r-- | ui/qt/main_window.cpp | 4 | ||||
-rw-r--r-- | ui/qt/packet_list.cpp | 4 | ||||
-rw-r--r-- | ui/qt/packet_list.h | 2 | ||||
-rw-r--r-- | ui/qt/preferences_dialog.cpp | 219 | ||||
-rw-r--r-- | ui/qt/preferences_dialog.h | 7 | ||||
-rw-r--r-- | ui/qt/qt_ui_utils.cpp | 5 | ||||
-rw-r--r-- | ui/qt/wireshark_application.cpp | 20 | ||||
-rw-r--r-- | ui/qt/wireshark_application.h | 11 |
28 files changed, 693 insertions, 367 deletions
diff --git a/epan/libwireshark.def b/epan/libwireshark.def index bbd7cb0d3f..93109f7bad 100644 --- a/epan/libwireshark.def +++ b/epan/libwireshark.def @@ -738,7 +738,6 @@ prefs_module_has_submodules prefs_modules_foreach prefs_modules_foreach_submodules prefs_pref_foreach -prefs_pref_is_default prefs_pref_to_str prefs_pref_type_description prefs_pref_type_name @@ -947,7 +946,6 @@ report_open_failure report_read_failure report_write_failure req_resp_hdrs_do_reassembly -reset_pref reset_tap_listeners reset_tcp_reassembly rose_ctx_clean_data diff --git a/epan/prefs-int.h b/epan/prefs-int.h index 9994a4555d..799a7fa4dd 100644 --- a/epan/prefs-int.h +++ b/epan/prefs-int.h @@ -119,7 +119,7 @@ struct preference { const char **string; range_t **range; void* uat; - color_t *color; + color_t *colorp; GList** list; } varp; /**< pointer to variable storing the value */ union { @@ -130,7 +130,7 @@ struct preference { range_t *range; color_t color; GList* list; - } saved_val; /**< original value, when editing from the GUI */ + } stashed_val; /**< original value, when editing from the GUI */ union { guint uint; gboolean boolval; diff --git a/epan/prefs.c b/epan/prefs.c index 9c3fc78f86..ec88812492 100644 --- a/epan/prefs.c +++ b/epan/prefs.c @@ -929,7 +929,7 @@ register_string_like_preference(module_t *module, const char *name, } preference->varp.string = var; preference->default_val.string = varcopy; - preference->saved_val.string = NULL; + preference->stashed_val.string = NULL; return preference; } @@ -1004,7 +1004,7 @@ prefs_register_range_preference(module_t *module, const char *name, *var = range_empty(); preference->varp.range = var; preference->default_val.range = range_copy(*var); - preference->saved_val.range = NULL; + preference->stashed_val.range = NULL; } /* @@ -1043,7 +1043,7 @@ void prefs_register_color_preference(module_t *module, const char *name, { pref_t* preference = register_preference(module, name, title, description, PREF_COLOR); - preference->varp.color = color; + preference->varp.colorp = color; preference->default_val.color = *color; } @@ -2696,7 +2696,7 @@ pre_init_prefs(void) /* * Reset a single dissector preference. */ -void +static void reset_pref(pref_t *pref) { if (!pref) return; @@ -2739,7 +2739,7 @@ reset_pref(pref_t *pref) break; case PREF_COLOR: - *pref->varp.color = pref->default_val.color; + *pref->varp.colorp = pref->default_val.color; break; case PREF_CUSTOM: @@ -3867,14 +3867,14 @@ set_pref(gchar *pref_name, const gchar *value, void *private_data _U_, case PREF_COLOR: { cval = strtoul(value, NULL, 16); - pref->varp.color->pixel = 0; - if ((pref->varp.color->red != RED_COMPONENT(cval)) || - (pref->varp.color->green != GREEN_COMPONENT(cval)) || - (pref->varp.color->blue != BLUE_COMPONENT(cval))) { + pref->varp.colorp->pixel = 0; + if ((pref->varp.colorp->red != RED_COMPONENT(cval)) || + (pref->varp.colorp->green != GREEN_COMPONENT(cval)) || + (pref->varp.colorp->blue != BLUE_COMPONENT(cval))) { module->prefs_changed = TRUE; - pref->varp.color->red = RED_COMPONENT(cval); - pref->varp.color->green = GREEN_COMPONENT(cval); - pref->varp.color->blue = BLUE_COMPONENT(cval); + pref->varp.colorp->red = RED_COMPONENT(cval); + pref->varp.colorp->green = GREEN_COMPONENT(cval); + pref->varp.colorp->blue = BLUE_COMPONENT(cval); } break; } @@ -4065,7 +4065,7 @@ prefs_pref_type_description(pref_t *pref) return g_strdup(type_desc); } -gboolean +static gboolean prefs_pref_is_default(pref_t *pref) { if (!pref) return FALSE; @@ -4088,7 +4088,7 @@ prefs_pref_is_default(pref_t *pref) { case PREF_STRING: case PREF_FILENAME: - if (!(strcmp(pref->default_val.string, *pref->varp.string))) + if (!(g_strcmp0(pref->default_val.string, *pref->varp.string))) return TRUE; break; @@ -4101,9 +4101,9 @@ prefs_pref_is_default(pref_t *pref) { case PREF_COLOR: { - if ((pref->default_val.color.red == pref->varp.color->red) && - (pref->default_val.color.green == pref->varp.color->green) && - (pref->default_val.color.blue == pref->varp.color->blue)) + if ((pref->default_val.color.red == pref->varp.colorp->red) && + (pref->default_val.color.green == pref->varp.colorp->green) && + (pref->default_val.color.blue == pref->varp.colorp->blue)) return TRUE; break; } @@ -4122,7 +4122,7 @@ prefs_pref_is_default(pref_t *pref) { } char * -prefs_pref_to_str(pref_t *pref, gboolean default_val) { +prefs_pref_to_str(pref_t *pref, pref_source_t source) { const char *pref_text = "[Unknown]"; guint pref_uint; gboolean pref_boolval; @@ -4132,24 +4132,38 @@ prefs_pref_to_str(pref_t *pref, gboolean default_val) { color_t *pref_color; if (!pref) { - return g_strdup(pref_text); /* ...or maybe assert? */ + return g_strdup(pref_text); } - if (default_val) { - pref_uint = pref->default_val.uint; - pref_boolval = pref->default_val.boolval; - pref_enumval = pref->default_val.enumval; - pref_string = pref->default_val.string; - pref_range = pref->default_val.range; - pref_color = &pref->default_val.color; - } else { - pref_uint = *pref->varp.uint; - pref_boolval = *pref->varp.boolp; - pref_enumval = *pref->varp.enump; - pref_string = *pref->varp.string; - pref_range = *pref->varp.range; - pref_color = pref->varp.color; + switch (source) { + case pref_default: + pref_uint = pref->default_val.uint; + pref_boolval = pref->default_val.boolval; + pref_enumval = pref->default_val.enumval; + pref_string = pref->default_val.string; + pref_range = pref->default_val.range; + pref_color = &pref->default_val.color; + break; + case pref_stashed: + pref_uint = pref->stashed_val.uint; + pref_boolval = pref->stashed_val.boolval; + pref_enumval = pref->stashed_val.enumval; + pref_string = pref->stashed_val.string; + pref_range = pref->stashed_val.range; + pref_color = &pref->stashed_val.color; + break; + case pref_current: + pref_uint = *pref->varp.uint; + pref_boolval = *pref->varp.boolp; + pref_enumval = *pref->varp.enump; + pref_string = *pref->varp.string; + pref_range = *pref->varp.range; + pref_color = pref->varp.colorp; + break; + default: + return g_strdup(pref_text); } + switch (pref->type) { case PREF_UINT: @@ -4209,7 +4223,7 @@ prefs_pref_to_str(pref_t *pref, gboolean default_val) { case PREF_CUSTOM: if (pref->custom_cbs.to_str_cb) - return pref->custom_cbs.to_str_cb(pref, default_val); + return pref->custom_cbs.to_str_cb(pref, source == pref_default ? TRUE : FALSE); pref_text = "[Custom]"; break; @@ -4300,7 +4314,7 @@ write_pref(gpointer data, gpointer user_data) g_strfreev(desc_lines); g_free(type_desc); - pref_text = prefs_pref_to_str(pref, FALSE); + pref_text = prefs_pref_to_str(pref, pref_current); fprintf(arg->pf, "%s%s.%s: ", def_prefix, name_prefix, pref->name); desc_lines = g_strsplit(pref_text,"\n",0); for (i = 0; desc_lines[i] != NULL; ++i) { diff --git a/epan/prefs.h b/epan/prefs.h index 461a04753a..9795ced0c1 100644 --- a/epan/prefs.h +++ b/epan/prefs.h @@ -113,6 +113,12 @@ typedef enum { version_neither } version_info_e; +typedef enum { + pref_default, + pref_stashed, + pref_current +} pref_source_t; + typedef struct _e_prefs { gint pr_format; @@ -474,15 +480,6 @@ const char *prefs_pref_type_name(pref_t *pref); */ char *prefs_pref_type_description(pref_t *pref); -/** Check if a preference differs from its default value - * - * @param pref A preference. - * - * @return TRUE if the current value of the preference is the same as - * its default value or FALSE if they differ. - */ -gboolean prefs_pref_is_default(pref_t *pref); - /** Fetch a string representation of the preference. * * @param pref A preference. @@ -491,7 +488,7 @@ gboolean prefs_pref_is_default(pref_t *pref); * * @return A string representation of the preference. Must be g_free()d. */ -char *prefs_pref_to_str(pref_t *pref, gboolean default_val); +char *prefs_pref_to_str(pref_t *pref, pref_source_t source); /* Read the preferences file, fill in "prefs", and return a pointer to it. @@ -514,12 +511,6 @@ extern e_prefs *read_prefs(int *, int *, char **, int *, int *, char **); into "*pf_path_return", and return the errno. */ extern int write_prefs(char **); -/** Set a preference to its default value - * - * @param pref A preference. - */ -extern void reset_pref(pref_t *pref); - /* * Given a string of the form "<pref name>:<pref value>", as might appear * as an argument to a "-o" option, parse it and set the preference in diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt index 620d3d00dc..664cb25d8f 100644 --- a/ui/CMakeLists.txt +++ b/ui/CMakeLists.txt @@ -30,6 +30,7 @@ set(COMMON_UI_SRC export_object_smb.c help_url.c iface_lists.c + preference_utils.c profile.c ssl_key_export.c text_import.c diff --git a/ui/Makefile.common b/ui/Makefile.common index 626cc6f82a..4509496f7d 100644 --- a/ui/Makefile.common +++ b/ui/Makefile.common @@ -51,6 +51,7 @@ WIRESHARK_UI_SRC = \ export_object_smb.c \ iface_lists.c \ help_url.c \ + preference_utils.c \ profile.c \ ssl_key_export.c \ text_import.c \ @@ -66,6 +67,7 @@ noinst_HEADERS = \ help_url.h \ iface_lists.h \ main_statusbar.h \ + preference_utils.h \ profile.h \ progress_dlg.h \ recent.h \ diff --git a/ui/gtk/airpcap_dlg.c b/ui/gtk/airpcap_dlg.c index ea0fd3f290..6e9661fb4b 100644 --- a/ui/gtk/airpcap_dlg.c +++ b/ui/gtk/airpcap_dlg.c @@ -41,6 +41,7 @@ #include <pcap.h> +#include "ui/preference_utils.h" #include "ui/simple_dialog.h" #include "ui/gtk/main.h" diff --git a/ui/gtk/capture_dlg.c b/ui/gtk/capture_dlg.c index 083d473001..f971292c6d 100644 --- a/ui/gtk/capture_dlg.c +++ b/ui/gtk/capture_dlg.c @@ -46,6 +46,7 @@ #include "ui/capture_globals.h" #include "ui/iface_lists.h" +#include "ui/preference_utils.h" #include "ui/recent.h" #include "ui/recent_utils.h" #include "ui/simple_dialog.h" @@ -4429,7 +4430,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) /* load the airpcap interfaces */ airpcap_if_list = get_airpcap_interface_list(&err, &err_str); - /* If we don't get a list don't do any thing. + /* If we don't get a list don't do any thing. * If the error is AIRPCAP_NOT_LOADED it avoids a unneccessay rescan of the packet list * ( see airpcap_loader.h for error codes). */ diff --git a/ui/gtk/filter_expression_save_dlg.c b/ui/gtk/filter_expression_save_dlg.c index 1c9b598de1..73db849892 100644 --- a/ui/gtk/filter_expression_save_dlg.c +++ b/ui/gtk/filter_expression_save_dlg.c @@ -41,8 +41,9 @@ #include "../globals.h" #include "ui/alert_box.h" -#include "ui/simple_dialog.h" #include "ui/main_statusbar.h" +#include "ui/preference_utils.h" +#include "ui/simple_dialog.h" #include "ui/ui_util.h" #include "ui/gtk/gui_utils.h" @@ -227,7 +228,7 @@ filter_expression_save_dlg(gpointer data) *filter_save_type_vb, *filter_save_type_hb, *entry_hb, *bbox, *ok_bt, *cancel_bt, *help_bt, *filter_text_box, *label_text_box; - + const char *expr; /* The filter requested */ diff --git a/ui/gtk/gtkglobals.h b/ui/gtk/gtkglobals.h index e5d69d3a2f..7cf7737ef0 100644 --- a/ui/gtk/gtkglobals.h +++ b/ui/gtk/gtkglobals.h @@ -51,7 +51,4 @@ extern GtkWidget *byte_nb_ptr_gbl; /** The filter text entry in the filter toolbar. */ extern GtkWidget *main_display_filter_widget; -/** If autoscroll in live captures is active or not */ -extern gboolean auto_scroll_live; - #endif diff --git a/ui/gtk/main.c b/ui/gtk/main.c index 276dabfa6a..4b27b55419 100644 --- a/ui/gtk/main.c +++ b/ui/gtk/main.c @@ -106,6 +106,7 @@ #include "ui/alert_box.h" #include "ui/main_statusbar.h" +#include "ui/preference_utils.h" #include "ui/recent.h" #include "ui/recent_utils.h" #include "ui/simple_dialog.h" @@ -3786,21 +3787,6 @@ show_main_window(gboolean doing_work) #endif /* HAVE_AIRPCAP */ } -/* Fill in capture options with values from the preferences */ -void -prefs_to_capture_opts(void) -{ -#ifdef HAVE_LIBPCAP - /* Set promiscuous mode from the preferences setting. */ - /* the same applies to other preferences settings as well. */ - global_capture_opts.default_options.promisc_mode = prefs.capture_prom_mode; - global_capture_opts.use_pcapng = prefs.capture_pcap_ng; - global_capture_opts.show_info = prefs.capture_show_info; - global_capture_opts.real_time_mode = prefs.capture_real_time; - auto_scroll_live = prefs.capture_auto_scroll; -#endif /* HAVE_LIBPCAP */ -} - static void copy_global_profile (const gchar *profile_name) { char *pf_dir_path, *pf_dir_path2, *pf_filename; diff --git a/ui/gtk/main.h b/ui/gtk/main.h index 80edea5762..845cf296c0 100644 --- a/ui/gtk/main.h +++ b/ui/gtk/main.h @@ -355,9 +355,6 @@ extern void create_console(void); extern void reset_tap_update_timer(void); #endif -/** Fill in capture options with values from the preferences */ -extern void prefs_to_capture_opts(void); - /** Change configuration profile */ extern void change_configuration_profile(const gchar *profile_name); diff --git a/ui/gtk/main_menubar.c b/ui/gtk/main_menubar.c index 4082ed43ba..ac6afa366f 100644 --- a/ui/gtk/main_menubar.c +++ b/ui/gtk/main_menubar.c @@ -54,6 +54,7 @@ #include "ui/iface_lists.h" #include "ui/main_statusbar.h" +#include "ui/preference_utils.h" #include "ui/recent.h" #include "ui/simple_dialog.h" #include "ui/ui_util.h" diff --git a/ui/gtk/packet_list.c b/ui/gtk/packet_list.c index 37c14985ac..87911a10c6 100644 --- a/ui/gtk/packet_list.c +++ b/ui/gtk/packet_list.c @@ -42,6 +42,7 @@ #include <epan/emem.h> #include "ui/main_statusbar.h" +#include "ui/preference_utils.h" #include "ui/progress_dlg.h" #include "ui/recent.h" #include "ui/recent_utils.h" diff --git a/ui/gtk/prefs_dlg.c b/ui/gtk/prefs_dlg.c index 348b8cd800..2cb781c901 100644 --- a/ui/gtk/prefs_dlg.c +++ b/ui/gtk/prefs_dlg.c @@ -28,7 +28,6 @@ #include <string.h> -#include <epan/filesystem.h> #include <epan/packet.h> #include <epan/prefs.h> #include <epan/strutil.h> @@ -37,6 +36,7 @@ #include "../file.h" #include "../print.h" +#include "ui/preference_utils.h" #include "ui/simple_dialog.h" #include "ui/gtk/main.h" @@ -120,25 +120,6 @@ pref_exists(pref_t *pref _U_, gpointer user_data _U_) return 1; } -static const char* -get_pref_type_string(pref_type_t t) -{ - switch (t) - { -#define CASE(T) case PREF_##T: return #T - CASE(UINT); - CASE(BOOL); - CASE(ENUM); - CASE(STRING); - CASE(RANGE); - CASE(STATIC_TEXT); - CASE(UAT); - CASE(OBSOLETE); - default: - return "UNKNOWN"; - } -} - /* show a single preference on the GtkTable of a preference page */ static guint pref_show(pref_t *pref, gpointer user_data) @@ -146,6 +127,7 @@ pref_show(pref_t *pref, gpointer user_data) GtkWidget *main_tb = user_data; module_t *module = g_object_get_data(G_OBJECT(main_tb), E_TABLE_MODULE_KEY); const char *title; + const char *type_name = prefs_pref_type_name(pref); char *label_string; size_t label_len; char uint_str[10+1]; @@ -161,7 +143,7 @@ pref_show(pref_t *pref, gpointer user_data) tooltip_txt = pref->description? g_strdup_printf("%s.%s: %s\n%s", module->name, pref->name, - get_pref_type_string(pref->type), + type_name ? type_name : "Unknown", pref->description): NULL; /* @@ -171,14 +153,14 @@ pref_show(pref_t *pref, gpointer user_data) if (pref->type != PREF_STATIC_TEXT) g_strlcat(label_string, ":", label_len); + pref_stash(pref, NULL); + /* Save the current value of the preference, so that we can revert it if the user does "Apply" and then "Cancel", and create the control for editing the preference. */ switch (pref->type) { case PREF_UINT: - pref->saved_val.uint = *pref->varp.uint; - /* XXX - there are no uint spinbuttons, so we can't use a spinbutton. Even more annoyingly, even if there were, GLib doesn't define G_MAXUINT - but I think ANSI C may define UINT_MAX, so we could @@ -186,15 +168,15 @@ pref_show(pref_t *pref, gpointer user_data) switch (pref->info.base) { case 10: - g_snprintf(uint_str, sizeof(uint_str), "%u", pref->saved_val.uint); + g_snprintf(uint_str, sizeof(uint_str), "%u", pref->stashed_val.uint); break; case 8: - g_snprintf(uint_str, sizeof(uint_str), "%o", pref->saved_val.uint); + g_snprintf(uint_str, sizeof(uint_str), "%o", pref->stashed_val.uint); break; case 16: - g_snprintf(uint_str, sizeof(uint_str), "%x", pref->saved_val.uint); + g_snprintf(uint_str, sizeof(uint_str), "%x", pref->stashed_val.uint); break; } pref->control = create_preference_entry(main_tb, pref->ordinal, @@ -203,52 +185,44 @@ pref_show(pref_t *pref, gpointer user_data) break; case PREF_BOOL: - pref->saved_val.boolval = *pref->varp.boolp; pref->control = create_preference_check_button(main_tb, pref->ordinal, label_string, tooltip_txt, - pref->saved_val.boolval); + pref->stashed_val.boolval); break; case PREF_ENUM: - pref->saved_val.enumval = *pref->varp.enump; if (pref->info.enum_info.radio_buttons) { /* Show it as radio buttons. */ pref->control = create_preference_radio_buttons(main_tb, pref->ordinal, label_string, tooltip_txt, pref->info.enum_info.enumvals, - pref->saved_val.enumval); + pref->stashed_val.enumval); } else { /* Show it as an option menu. */ pref->control = create_preference_option_menu(main_tb, pref->ordinal, label_string, tooltip_txt, pref->info.enum_info.enumvals, - pref->saved_val.enumval); + pref->stashed_val.enumval); } break; case PREF_STRING: - g_free(pref->saved_val.string); - pref->saved_val.string = g_strdup(*pref->varp.string); pref->control = create_preference_entry(main_tb, pref->ordinal, label_string, tooltip_txt, - pref->saved_val.string); + pref->stashed_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, tooltip_txt, - pref->saved_val.string); + pref->stashed_val.string); break; case PREF_RANGE: { char *range_str_p; - g_free(pref->saved_val.range); - pref->saved_val.range = range_copy(*pref->varp.range); range_str_p = range_convert_range(*pref->varp.range); pref->control = create_preference_entry(main_tb, pref->ordinal, label_string, tooltip_txt, @@ -1230,51 +1204,7 @@ prefs_airpcap_update(void) #endif static guint -pref_clean(pref_t *pref, gpointer user_data _U_) -{ - switch (pref->type) { - - case PREF_UINT: - break; - - case PREF_BOOL: - break; - - case PREF_ENUM: - break; - - case PREF_STRING: - case PREF_FILENAME: - if (pref->saved_val.string != NULL) { - g_free(pref->saved_val.string); - pref->saved_val.string = NULL; - } - break; - - case PREF_RANGE: - if (pref->saved_val.range != NULL) { - g_free(pref->saved_val.range); - pref->saved_val.range = NULL; - } - break; - - case PREF_STATIC_TEXT: - case PREF_UAT: - break; - - case PREF_COLOR: - case PREF_CUSTOM: - /* currently not supported */ - - case PREF_OBSOLETE: - g_assert_not_reached(); - break; - } - return 0; -} - -static guint -module_prefs_clean(module_t *module, gpointer user_data _U_) +module_prefs_clean_stash(module_t *module, gpointer user_data _U_) { /* Ignore any preferences with their own interface */ if (!module->use_gui) { @@ -1283,7 +1213,7 @@ module_prefs_clean(module_t *module, gpointer user_data _U_) /* For all preferences in this module, clean up any cruft allocated for use by the GUI code. */ - prefs_pref_foreach(module, pref_clean, NULL); + prefs_pref_foreach(module, pref_clean_stash, NULL); return 0; /* keep cleaning modules */ } @@ -1414,51 +1344,7 @@ prefs_main_destroy_all(GtkWidget *dlg) /* Free up the saved preferences (both for "prefs" and for registered preferences). */ - prefs_modules_foreach(module_prefs_clean, NULL); -} - - -static guint -pref_copy(pref_t *pref, gpointer user_data _U_) -{ - switch (pref->type) { - - case PREF_UINT: - pref->saved_val.uint = *pref->varp.uint; - break; - - case PREF_BOOL: - pref->saved_val.boolval = *pref->varp.boolp; - break; - - case PREF_ENUM: - pref->saved_val.enumval = *pref->varp.enump; - break; - - case PREF_STRING: - case PREF_FILENAME: - g_free(pref->saved_val.string); - pref->saved_val.string = g_strdup(*pref->varp.string); - break; - - case PREF_RANGE: - g_free(pref->saved_val.range); - pref->saved_val.range = range_copy(*pref->varp.range); - break; - - case PREF_STATIC_TEXT: - case PREF_UAT: - break; - - case PREF_COLOR: - case PREF_CUSTOM: - /* currently not supported */ - - case PREF_OBSOLETE: - g_assert_not_reached(); - break; - } - return 0; + prefs_modules_foreach(module_prefs_clean_stash, NULL); } static guint @@ -1470,7 +1356,7 @@ module_prefs_copy(module_t *module, gpointer user_data _U_) } /* For all preferences in this module, (re)save current value */ - prefs_pref_foreach(module, pref_copy, NULL); + prefs_pref_foreach(module, pref_stash, NULL); return 0; /* continue making copies */ } @@ -1480,42 +1366,6 @@ static void prefs_copy(void) { prefs_modules_foreach(module_prefs_copy, NULL); } - -void -prefs_main_write(void) -{ - int err; - char *pf_dir_path; - char *pf_path; - - /* Create the directory that holds personal configuration files, if - necessary. */ - if (create_persconffile_dir(&pf_dir_path) == -1) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, - "Can't create directory\n\"%s\"\nfor preferences file: %s.", pf_dir_path, - g_strerror(errno)); - g_free(pf_dir_path); - } else { - /* Write the preferencs out. */ - err = write_prefs(&pf_path); - if (err != 0) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, - "Can't open preferences file\n\"%s\": %s.", pf_path, - g_strerror(err)); - g_free(pf_path); - } - } - -#ifdef HAVE_AIRPCAP - /* - * Load the Wireshark decryption keys (just set) and save - * the changes to the adapters' registry - */ - airpcap_load_decryption_keys(airpcap_if_list); -#endif -} - - static void prefs_main_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) { @@ -1614,67 +1464,6 @@ prefs_main_save_cb(GtkWidget *save_bt _U_, gpointer parent_w) } static guint -pref_revert(pref_t *pref, gpointer user_data) -{ - gboolean *pref_changed_p = user_data; - - /* Revert the preference to its saved value. */ - switch (pref->type) { - - case PREF_UINT: - if (*pref->varp.uint != pref->saved_val.uint) { - *pref_changed_p = TRUE; - *pref->varp.uint = pref->saved_val.uint; - } - break; - - case PREF_BOOL: - if (*pref->varp.boolp != pref->saved_val.boolval) { - *pref_changed_p = TRUE; - *pref->varp.boolp = pref->saved_val.boolval; - } - break; - - case PREF_ENUM: - if (*pref->varp.enump != pref->saved_val.enumval) { - *pref_changed_p = TRUE; - *pref->varp.enump = pref->saved_val.enumval; - } - 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); - *pref->varp.string = g_strdup(pref->saved_val.string); - } - break; - - case PREF_RANGE: - if (!ranges_are_equal(*pref->varp.range, pref->saved_val.range)) { - *pref_changed_p = TRUE; - g_free(*pref->varp.range); - *pref->varp.range = range_copy(pref->saved_val.range); - } - break; - - case PREF_STATIC_TEXT: - case PREF_UAT: - break; - - case PREF_COLOR: - case PREF_CUSTOM: - /* currently not supported */ - - case PREF_OBSOLETE: - g_assert_not_reached(); - break; - } - return 0; -} - -static guint module_prefs_revert(module_t *module, gpointer user_data) { gboolean *must_redissect_p = user_data; @@ -1688,7 +1477,7 @@ module_prefs_revert(module_t *module, gpointer user_data) it had when we popped up the Preferences dialog. Find out whether this changes any of them. */ module->prefs_changed = FALSE; /* assume none of them changed */ - prefs_pref_foreach(module, pref_revert, &module->prefs_changed); + prefs_pref_foreach(module, pref_unstash, &module->prefs_changed); /* If any of them changed, indicate that we must redissect and refilter the current capture (if we have one), as the preference change diff --git a/ui/gtk/prefs_dlg.h b/ui/gtk/prefs_dlg.h index 440443ce87..efb84a9167 100644 --- a/ui/gtk/prefs_dlg.h +++ b/ui/gtk/prefs_dlg.h @@ -185,8 +185,4 @@ GtkWidget * create_preference_uat(GtkWidget *main_tb, int table_position, const gchar *label_text, const gchar *tooltip_text, void *uat); -/** Save all preferences */ -void -prefs_main_write(void); - #endif diff --git a/ui/preference_utils.c b/ui/preference_utils.c new file mode 100644 index 0000000000..faf6b6d3e9 --- /dev/null +++ b/ui/preference_utils.c @@ -0,0 +1,295 @@ +/* preference_utils.h + * Routines for handling preferences + * + * $Id$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" + +#include <errno.h> + +#include <glib.h> + +#include <epan/filesystem.h> +#include <epan/prefs.h> +#include <epan/prefs-int.h> + +#ifdef HAVE_LIBPCAP +#include "capture_opts.h" +#include "ui/capture_globals.h" +#endif + +#include "ui/preference_utils.h" +#include "ui/simple_dialog.h" + +guint +pref_stash(pref_t *pref, gpointer unused _U_) +{ + g_log(NULL,G_LOG_LEVEL_INFO, "=stashing %s", pref->name); + switch (pref->type) { + + case PREF_UINT: + pref->stashed_val.uint = *pref->varp.uint; + break; + + case PREF_BOOL: + pref->stashed_val.boolval = *pref->varp.boolp; + break; + + case PREF_ENUM: + pref->stashed_val.enumval = *pref->varp.enump; + break; + + case PREF_STRING: + case PREF_FILENAME: + g_free(pref->stashed_val.string); + pref->stashed_val.string = g_strdup(*pref->varp.string); + break; + + case PREF_RANGE: + g_free(pref->stashed_val.range); + pref->stashed_val.range = range_copy(*pref->varp.range); + break; + + case PREF_COLOR: + g_log(NULL,G_LOG_LEVEL_INFO, "=stashing %s", pref->name); + pref->stashed_val.color = *pref->varp.colorp; + break; + + case PREF_STATIC_TEXT: + case PREF_UAT: + case PREF_CUSTOM: + break; + + case PREF_OBSOLETE: + g_assert_not_reached(); + break; + } + return 0; +} + +guint +pref_unstash(pref_t *pref, gpointer changed_p) +{ + gboolean *pref_changed_p = changed_p; + + /* Revert the preference to its saved value. */ + switch (pref->type) { + + case PREF_UINT: + if (*pref->varp.uint != pref->stashed_val.uint) { + *pref_changed_p = TRUE; + *pref->varp.uint = pref->stashed_val.uint; + } + break; + + case PREF_BOOL: + if (*pref->varp.boolp != pref->stashed_val.boolval) { + *pref_changed_p = TRUE; + *pref->varp.boolp = pref->stashed_val.boolval; + } + break; + + case PREF_ENUM: + if (*pref->varp.enump != pref->stashed_val.enumval) { + *pref_changed_p = TRUE; + *pref->varp.enump = pref->stashed_val.enumval; + } + break; + + case PREF_STRING: + case PREF_FILENAME: + if (strcmp(*pref->varp.string, pref->stashed_val.string) != 0) { + *pref_changed_p = TRUE; + g_free((void *)*pref->varp.string); + *pref->varp.string = g_strdup(pref->stashed_val.string); + } + break; + + case PREF_RANGE: + if (!ranges_are_equal(*pref->varp.range, pref->stashed_val.range)) { + *pref_changed_p = TRUE; + g_free(*pref->varp.range); + *pref->varp.range = range_copy(pref->stashed_val.range); + } + break; + + case PREF_COLOR: + *pref->varp.colorp = pref->stashed_val.color; + break; + + case PREF_STATIC_TEXT: + case PREF_UAT: + case PREF_CUSTOM: + break; + + case PREF_OBSOLETE: + g_assert_not_reached(); + break; + } + return 0; +} + +void +reset_stashed_pref(pref_t *pref) { + switch (pref->type) { + + case PREF_UINT: + pref->stashed_val.uint = pref->default_val.uint; + break; + + case PREF_BOOL: + pref->stashed_val.boolval = pref->default_val.boolval; + break; + + case PREF_ENUM: + pref->stashed_val.enumval = pref->default_val.enumval; + break; + + case PREF_STRING: + case PREF_FILENAME: + g_free(pref->stashed_val.string); + pref->stashed_val.string = g_strdup(pref->default_val.string); + break; + + case PREF_RANGE: + g_free(pref->stashed_val.range); + pref->stashed_val.range = range_copy(pref->default_val.range); + break; + + case PREF_COLOR: + memcpy(&pref->stashed_val.color, &pref->default_val.color, sizeof(color_t)); + break; + + case PREF_STATIC_TEXT: + case PREF_UAT: + case PREF_CUSTOM: + break; + + case PREF_OBSOLETE: + g_assert_not_reached(); + break; + } +} + +guint +pref_clean_stash(pref_t *pref, gpointer unused _U_) +{ + switch (pref->type) { + + case PREF_UINT: + break; + + case PREF_BOOL: + break; + + case PREF_ENUM: + break; + + case PREF_STRING: + case PREF_FILENAME: + if (pref->stashed_val.string != NULL) { + g_free(pref->stashed_val.string); + pref->stashed_val.string = NULL; + } + break; + + case PREF_RANGE: + if (pref->stashed_val.range != NULL) { + g_free(pref->stashed_val.range); + pref->stashed_val.range = NULL; + } + break; + + case PREF_STATIC_TEXT: + case PREF_UAT: + case PREF_COLOR: + case PREF_CUSTOM: + break; + + case PREF_OBSOLETE: + g_assert_not_reached(); + break; + } + return 0; +} + +/* Fill in capture options with values from the preferences */ +void +prefs_to_capture_opts(void) +{ +#ifdef HAVE_LIBPCAP + /* Set promiscuous mode from the preferences setting. */ + /* the same applies to other preferences settings as well. */ + global_capture_opts.default_options.promisc_mode = prefs.capture_prom_mode; + global_capture_opts.use_pcapng = prefs.capture_pcap_ng; + global_capture_opts.show_info = prefs.capture_show_info; + global_capture_opts.real_time_mode = prefs.capture_real_time; + auto_scroll_live = prefs.capture_auto_scroll; +#endif /* HAVE_LIBPCAP */ +} + +void +prefs_main_write(void) +{ + int err; + char *pf_dir_path; + char *pf_path; + + /* Create the directory that holds personal configuration files, if + necessary. */ + if (create_persconffile_dir(&pf_dir_path) == -1) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, + "Can't create directory\n\"%s\"\nfor preferences file: %s.", pf_dir_path, + g_strerror(errno)); + g_free(pf_dir_path); + } else { + /* Write the preferencs out. */ + err = write_prefs(&pf_path); + if (err != 0) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, + "Can't open preferences file\n\"%s\": %s.", pf_path, + g_strerror(err)); + g_free(pf_path); + } + } + +#ifdef HAVE_AIRPCAP + /* + * Load the Wireshark decryption keys (just set) and save + * the changes to the adapters' registry + */ + airpcap_load_decryption_keys(airpcap_if_list); +#endif +} + +/* + * Editor modelines + * + * Local Variables: + * c-basic-offset: 2 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * ex: set shiftwidth=2 tabstop=8 expandtab: + * :indentSize=2:tabSize=8:noTabs=true: + */ diff --git a/ui/preference_utils.h b/ui/preference_utils.h new file mode 100644 index 0000000000..c135b1d305 --- /dev/null +++ b/ui/preference_utils.h @@ -0,0 +1,88 @@ +/* preference_utils.h + * Routines for handling preferences + * + * $Id$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef __PREFRENCE_UTILS_H__ +#define __PREFRENCE_UTILS_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** @file + * Preference utility routines. + * @ingroup prefs_group + */ + +/** "Stash" a preference. + * Copy a preference to its stashed value. Can be called from prefs_pref_foreach(). + * + * @param pref: A preference. + */ +extern guint pref_stash(pref_t *pref, gpointer unused _U_); + +/** "Untash" a preference. + * Set a preference to its stashed value. Can be called from prefs_pref_foreach(). + * + * @param pref: A preference. + * @param changed_p: A pointer to a gboolean. Set to TRUE if the preference differs + * from its stashed value. + * + * @return Always returns 0. + */ +extern guint pref_unstash(pref_t *pref, gpointer changed_p); + +/** Clean up a stashed preference. + * Can be called from prefs_pref_foreach(). + * + * @param pref A preference. + * + * @return Always returns 0. + */ +extern guint pref_clean_stash(pref_t *pref, gpointer unused _U_); + +/** Set a stashed preference to its default value. + * + *@pram pref A preference. + */ +extern void reset_stashed_pref(pref_t *pref); + + +/** If autoscroll in live captures is active or not + */ +extern gboolean auto_scroll_live; + +/** Fill in capture options with values from the preferences + */ +extern void prefs_to_capture_opts(void); + +/** Save all preferences + */ +extern void prefs_main_write(void); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __PREFRENCE_UTILS_H__ */ diff --git a/ui/qt/display_filter_combo.cpp b/ui/qt/display_filter_combo.cpp index 1d6b121b80..bd0f5bd589 100644 --- a/ui/qt/display_filter_combo.cpp +++ b/ui/qt/display_filter_combo.cpp @@ -76,7 +76,7 @@ DisplayFilterCombo::DisplayFilterCombo(QWidget *parent) : ); completer()->setCompletionMode(QCompleter::PopupCompletion); - connect(wsApp, SIGNAL(updatePreferences()), this, SLOT(updateMaxCount())); + connect(wsApp, SIGNAL(preferencesChanged()), this, SLOT(updateMaxCount())); } extern "C" void dfilter_recent_combo_write_all(FILE *rf) { diff --git a/ui/qt/main.cpp b/ui/qt/main.cpp index 43b00c615f..955ebac211 100644 --- a/ui/qt/main.cpp +++ b/ui/qt/main.cpp @@ -962,7 +962,8 @@ int main(int argc, char *argv[]) /* Notify all registered modules that have had any of their preferences changed either from one of the preferences file or from the command line that their preferences have changed. */ - wsApp->applyAllPreferences(); + prefs_apply_all(); + wsApp->emitAppSignal(WiresharkApplication::PreferencesChanged); #ifdef HAVE_LIBPCAP if ((global_capture_opts.num_selected == 0) && diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp index 0e78e59b4d..d0aa9993ba 100644 --- a/ui/qt/main_window.cpp +++ b/ui/qt/main_window.cpp @@ -191,6 +191,8 @@ MainWindow::MainWindow(QWidget *parent) : this, SLOT(captureFileClosing(const capture_file*))); connect(wsApp, SIGNAL(captureFileClosed(const capture_file*)), this, SLOT(captureFileClosed(const capture_file*))); + connect(wsApp, SIGNAL(packetDissectionChanged()), + this, SLOT(redissectPackets())); connect(main_welcome_, SIGNAL(startCapture()), this, SLOT(startCapture())); @@ -224,7 +226,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(packet_list_->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(setMenusForSelectedPacket())); - connect(packet_list_, SIGNAL(packetsChanged()), + connect(packet_list_, SIGNAL(packetDissectionChanged()), this, SLOT(redissectPackets())); connect(proto_tree_, SIGNAL(protoItemSelected(QString&)), diff --git a/ui/qt/packet_list.cpp b/ui/qt/packet_list.cpp index fdf2877f2c..0e93cd454f 100644 --- a/ui/qt/packet_list.cpp +++ b/ui/qt/packet_list.cpp @@ -746,7 +746,7 @@ void PacketList::ignoreFrame() fdata = packet_list_model_->getRowFdata(row); setFrameIgnore(!fdata->flags.ignored, fdata); - emit packetsChanged(); + emit packetDissectionChanged(); } void PacketList::ignoreAllDisplayedFrames(bool set) @@ -761,7 +761,7 @@ void PacketList::ignoreAllDisplayedFrames(bool set) if (!set || fdata->flags.passed_dfilter) setFrameIgnore(set, fdata); } - emit packetsChanged(); + emit packetDissectionChanged(); } void PacketList::setTimeReference() diff --git a/ui/qt/packet_list.h b/ui/qt/packet_list.h index 739c8116cc..e8e1595c5c 100644 --- a/ui/qt/packet_list.h +++ b/ui/qt/packet_list.h @@ -71,7 +71,7 @@ private: void setFrameReftime(gboolean set, frame_data *fdata); signals: - void packetsChanged(); + void packetDissectionChanged(); public slots: void setCaptureFile(capture_file *cf); diff --git a/ui/qt/preferences_dialog.cpp b/ui/qt/preferences_dialog.cpp index 8f96ffee6a..c48f465c7f 100644 --- a/ui/qt/preferences_dialog.cpp +++ b/ui/qt/preferences_dialog.cpp @@ -27,6 +27,8 @@ #include <epan/prefs-int.h> +#include <ui/preference_utils.h> + #include "syntax_line_edit.h" #include "qt_ui_utils.h" @@ -72,14 +74,17 @@ fill_advanced_prefs(module_t *module, gpointer root_ptr) const char *type_name = prefs_pref_type_name(pref); if (!type_name) continue; + pref_stash(pref, NULL); + QTreeWidgetItem *item = new QTreeWidgetItem(); QString full_name = QString(module->name ? module->name : module->parent->name) + "." + pref->name; QString type_desc = gchar_free_to_qstring(prefs_pref_type_description(pref)); - QString default_value = gchar_free_to_qstring(prefs_pref_to_str(pref, true)); + QString default_value = gchar_free_to_qstring(prefs_pref_to_str(pref, pref_stashed)); item->setData(0, Qt::UserRole, qVariantFromValue(pref)); item->setText(0, full_name); item->setToolTip(0, QString("<span>%1</span>").arg(pref->description)); + item->setToolTip(1, "Has this preference been changed?"); item->setText(2, type_name); item->setToolTip(2, QString("<span>%1</span>").arg(type_desc)); item->setToolTip(3, QString("<span>%1</span>").arg( @@ -94,13 +99,62 @@ fill_advanced_prefs(module_t *module, gpointer root_ptr) return 0; } +static guint +module_prefs_unstash(module_t *module, gpointer data) +{ + gboolean *must_redissect_p = (gboolean *)data; + + module->prefs_changed = FALSE; /* assume none of them changed */ + for (GList *pref_l = module->prefs; pref_l && pref_l->data; pref_l = g_list_next(pref_l)) { + pref_t *pref = (pref_t *) pref_l->data; + + if (pref->type == PREF_OBSOLETE || pref->type == PREF_STATIC_TEXT) continue; + + pref_unstash(pref, &module->prefs_changed); + } + + /* If any of them changed, indicate that we must redissect and refilter + the current capture (if we have one), as the preference change + could cause packets to be dissected differently. */ + if (module->prefs_changed) + *must_redissect_p = TRUE; + + if(prefs_module_has_submodules(module)) + return prefs_modules_foreach_submodules(module, module_prefs_unstash, data); + + return 0; /* Keep unstashing. */ +} + +static guint +module_prefs_clean_stash(module_t *module, gpointer unused) +{ + Q_UNUSED(unused); + + for (GList *pref_l = module->prefs; pref_l && pref_l->data; pref_l = g_list_next(pref_l)) { + pref_t *pref = (pref_t *) pref_l->data; + + if (pref->type == PREF_OBSOLETE || pref->type == PREF_STATIC_TEXT) continue; + + pref_clean_stash(pref, NULL); + } + + if(prefs_module_has_submodules(module)) + return prefs_modules_foreach_submodules(module, module_prefs_clean_stash, NULL); + + return 0; /* Keep cleaning modules */ +} + } // extern "C" +// Preference tree items const int appearance_item_ = 0; const int protocols_item_ = 4; const int statistics_item_ = 5; const int advanced_item_ = 6; +// We store the saved and current preference values in the "Advanced" tree columns +const int pref_ptr_col_ = 0; + PreferencesDialog::PreferencesDialog(QWidget *parent) : QDialog(parent), pd_ui_(new Ui::PreferencesDialog), @@ -115,11 +169,11 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) : pd_ui_->advancedTree->invisibleRootItem()->addChildren(tmp_item.takeChildren()); QTreeWidgetItemIterator pref_it(pd_ui_->advancedTree, QTreeWidgetItemIterator::NoChildren); while (*pref_it) { -// pref_t *pref = (*pref_it)->data(0, Qt::UserRole).value<pref_t *>(); updateItem(*(*pref_it)); -// if (pref) pref_item_hash_[pref] = (*pref_it); ++pref_it; } + qDebug() << "FIX: Open UAT dialogs from prefs dialog."; + qDebug() << "FIX: Auto-size each preference pane."; pd_ui_->splitter->setStretchFactor(0, 1); pd_ui_->splitter->setStretchFactor(1, 5); @@ -131,6 +185,7 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) : PreferencesDialog::~PreferencesDialog() { delete pd_ui_; + prefs_modules_foreach_submodules(NULL, module_prefs_clean_stash, NULL); } void PreferencesDialog::showEvent(QShowEvent *evt) @@ -200,18 +255,74 @@ void PreferencesDialog::keyPressEvent(QKeyEvent *evt) QDialog::keyPressEvent(evt); } +// Copied from prefs.c:prefs_pref_is_default. We may want to move this to +// prefs.c as well. +bool PreferencesDialog::stashedPrefIsDefault(pref_t *pref) +{ + if (!pref) return false; + + switch (pref->type) { + + case PREF_UINT: + if (pref->default_val.uint == pref->stashed_val.uint) + return true; + break; + + case PREF_BOOL: + if (pref->default_val.boolval == pref->stashed_val.boolval) + return true; + break; + + case PREF_ENUM: + if (pref->default_val.enumval == pref->stashed_val.enumval) + return true; + break; + + case PREF_STRING: + case PREF_FILENAME: + if (!(g_strcmp0(pref->default_val.string, pref->stashed_val.string))) + return true; + break; + + case PREF_RANGE: + { + if ((ranges_are_equal(pref->default_val.range, pref->stashed_val.range))) + return true; + break; + } + + case PREF_COLOR: + { + if ((pref->default_val.color.red == pref->stashed_val.color.red) && + (pref->default_val.color.green == pref->stashed_val.color.green) && + (pref->default_val.color.blue == pref->stashed_val.color.blue)) + return true; + break; + } + + case PREF_CUSTOM: + case PREF_OBSOLETE: + case PREF_STATIC_TEXT: + case PREF_UAT: + return false; + break; + } + return false; +} + + void PreferencesDialog::updateItem(QTreeWidgetItem &item) { - pref_t *pref = item.data(0, Qt::UserRole).value<pref_t *>(); + pref_t *pref = item.data(pref_ptr_col_, Qt::UserRole).value<pref_t *>(); if (!pref) return; - QString cur_value = gchar_free_to_qstring(prefs_pref_to_str(pref, false)).remove(QRegExp("\n\t")); + QString cur_value = gchar_free_to_qstring(prefs_pref_to_str(pref, pref_stashed)).remove(QRegExp("\n\t")); bool is_changed = false; QFont font = item.font(0); - if (pref->type == PREF_UAT) { + if (pref->type == PREF_UAT || pref->type == PREF_CUSTOM) { item.setText(1, "Unknown"); - } else if (prefs_pref_is_default(pref)) { + } else if (stashedPrefIsDefault(pref)) { item.setText(1, "Default"); } else { item.setText(1, "Changed"); @@ -224,7 +335,6 @@ void PreferencesDialog::updateItem(QTreeWidgetItem &item) item.setFont(2, font); item.setFont(3, font); - item.setToolTip(1, "Has this value been changed?"); item.setText(3, cur_value); } @@ -243,7 +353,7 @@ void PreferencesDialog::on_advancedSearchLineEdit_textEdited(const QString &sear // Hide or show each branch QTreeWidgetItemIterator branch_it(pd_ui_->advancedTree); while (*branch_it) { - if ((*branch_it)->data(0, Qt::UserRole).value<pref_t *>() == NULL) { + if ((*branch_it)->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>() == NULL) { (*branch_it)->setHidden(!search_str.isEmpty()); } ++branch_it; @@ -254,7 +364,7 @@ void PreferencesDialog::on_advancedSearchLineEdit_textEdited(const QString &sear while (*pref_it) { bool hidden = true; - if ((*pref_it)->data(0, Qt::UserRole).value<pref_t *>()) { + if ((*pref_it)->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>()) { QTreeWidgetItem *parent = (*pref_it)->parent(); if (search_str.isEmpty() || @@ -286,11 +396,11 @@ void PreferencesDialog::on_advancedTree_currentItemChanged(QTreeWidgetItem *curr void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int column) { - pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>(); + pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>(); if (!pref || cur_line_edit_ || cur_combo_box_) return; - if (column < 3) { - reset_pref(pref); + if (column < 3) { // Reset to default + reset_stashed_pref(pref); updateItem(*item); } else { QWidget *editor = NULL; @@ -300,13 +410,13 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int { cur_line_edit_ = new QLineEdit(); // cur_line_edit_->setInputMask("0000000009;"); - saved_string_pref_ = QString::number(*pref->varp.uint, pref->info.base); + saved_string_pref_ = QString::number(pref->stashed_val.uint, pref->info.base); connect(cur_line_edit_, SIGNAL(editingFinished()), this, SLOT(uintPrefEditingFinished())); editor = cur_line_edit_; break; } case PREF_BOOL: - *pref->varp.boolp = !*pref->varp.boolp; + pref->stashed_val.boolval = !pref->stashed_val.boolval; updateItem(*item); break; case PREF_ENUM: @@ -315,7 +425,7 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int const enum_val_t *ev; for (ev = pref->info.enum_info.enumvals; ev && ev->description; ev++) { cur_combo_box_->addItem(ev->description, QVariant(ev->value)); - if (*pref->varp.enump == ev->value) + if (pref->stashed_val.enumval == ev->value) cur_combo_box_->setCurrentIndex(cur_combo_box_->count() - 1); } saved_combo_idx_ = cur_combo_box_->currentIndex(); @@ -326,7 +436,7 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int case PREF_STRING: { cur_line_edit_ = new QLineEdit(); - saved_string_pref_ = *pref->varp.string; + saved_string_pref_ = pref->stashed_val.string; connect(cur_line_edit_, SIGNAL(editingFinished()), this, SLOT(stringPrefEditingFinished())); editor = cur_line_edit_; break; @@ -335,10 +445,10 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int { QString filename = QFileDialog::getSaveFileName(this, QString("Wireshark: ") + pref->description, - *pref->varp.string); + pref->stashed_val.string); if (!filename.isEmpty()) { - g_free((void *)*pref->varp.string); - *pref->varp.string = g_strdup(filename.toUtf8().constData()); + g_free((void *)pref->stashed_val.string); + pref->stashed_val.string = g_strdup(filename.toUtf8().constData()); updateItem(*item); } break; @@ -346,7 +456,7 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int case PREF_RANGE: { SyntaxLineEdit *syntax_edit = new SyntaxLineEdit(); - char *cur_val = prefs_pref_to_str(pref, FALSE); + char *cur_val = prefs_pref_to_str(pref, pref_stashed); saved_string_pref_ = gchar_free_to_qstring(cur_val); connect(syntax_edit, SIGNAL(textChanged(QString)), this, SLOT(rangePrefTextChanged(QString))); @@ -359,15 +469,15 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int QColorDialog color_dlg; color_dlg.setCurrentColor(QColor( - pref->varp.color->red >> 8, - pref->varp.color->green >> 8, - pref->varp.color->blue >> 8 + pref->stashed_val.color.red >> 8, + pref->stashed_val.color.green >> 8, + pref->stashed_val.color.blue >> 8 )); if (color_dlg.exec() == QDialog::Accepted) { QColor cc = color_dlg.currentColor(); - pref->varp.color->red = cc.red() << 8 | cc.red(); - pref->varp.color->green = cc.green() << 8 | cc.green(); - pref->varp.color->blue = cc.blue() << 8 | cc.blue(); + pref->stashed_val.color.red = cc.red() << 8 | cc.red(); + pref->stashed_val.color.green = cc.green() << 8 | cc.green(); + pref->stashed_val.color.blue = cc.blue() << 8 | cc.blue(); updateItem(*item); } break; @@ -423,10 +533,13 @@ void PreferencesDialog::uintPrefEditingFinished() QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem(); if (!cur_line_edit_ || !item) return; - pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>(); + pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>(); if (!pref) return; - *pref->varp.uint = cur_line_edit_->text().toUInt(NULL, pref->info.base); + bool ok; + guint new_val = cur_line_edit_->text().toUInt(&ok, pref->info.base); + + if (ok) pref->stashed_val.uint = new_val; pd_ui_->advancedTree->removeItemWidget(item, 3); updateItem(*item); } @@ -436,11 +549,10 @@ void PreferencesDialog::enumPrefCurrentIndexChanged(int index) QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem(); if (!cur_combo_box_ || !item || index < 0) return; - pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>(); + pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>(); if (!pref) return; - *pref->varp.enump = cur_combo_box_->itemData(index, Qt::UserRole).toInt(); -// pd_ui_->advancedTree->removeItemWidget(item, 3); + pref->stashed_val.enumval = cur_combo_box_->itemData(index, Qt::UserRole).toInt(); updateItem(*item); } @@ -449,11 +561,11 @@ void PreferencesDialog::stringPrefEditingFinished() QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem(); if (!cur_line_edit_ || !item) return; - pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>(); + pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>(); if (!pref) return; - g_free((void *)*pref->varp.string); - *pref->varp.string = g_strdup(cur_line_edit_->text().toUtf8().constData()); + g_free((void *)pref->stashed_val.string); + pref->stashed_val.string = g_strdup(cur_line_edit_->text().toUtf8().constData()); pd_ui_->advancedTree->removeItemWidget(item, 3); updateItem(*item); } @@ -464,7 +576,7 @@ void PreferencesDialog::rangePrefTextChanged(const QString &text) QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem(); if (!syntax_edit || !item) return; - pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>(); + pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>(); if (!pref) return; if (text.isEmpty()) { @@ -488,20 +600,49 @@ void PreferencesDialog::rangePrefEditingFinished() QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem(); if (!syntax_edit || !item) return; - pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>(); + pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>(); if (!pref) return; range_t *newrange; convert_ret_t ret = range_convert_str(&newrange, syntax_edit->text().toUtf8().constData(), pref->info.max_value); if (ret == CVT_NO_ERROR) { - g_free(*pref->varp.range); - *pref->varp.range = newrange; + g_free(pref->stashed_val.range); + pref->stashed_val.range = newrange; } pd_ui_->advancedTree->removeItemWidget(item, 3); updateItem(*item); } +void PreferencesDialog::on_buttonBox_accepted() +{ + gboolean must_redissect = FALSE; + + // XXX - We should validate preferences as the user changes them, not here. +// if (!prefs_main_fetch_all(parent_w, &must_redissect)) +// return; /* Errors in some preference setting - already reported */ + prefs_modules_foreach_submodules(NULL, module_prefs_unstash, (gpointer) &must_redissect); + + prefs_main_write(); + + /* Fill in capture options with values from the preferences */ + prefs_to_capture_opts(); + +#ifdef HAVE_AIRPCAP + prefs_airpcap_update(); +#endif + + wsApp->emitAppSignal(WiresharkApplication::PreferencesChanged); + + /* Now destroy the "Preferences" dialog. */ +// window_destroy(GTK_WIDGET(parent_w)); + + if (must_redissect) { + /* Redissect all the packets, and re-evaluate the display filter. */ + wsApp->emitAppSignal(WiresharkApplication::PacketDissectionChanged); + } +} + void PreferencesDialog::on_buttonBox_helpRequested() { wsApp->helpTopicAction(HELP_PREFERENCES_DIALOG); diff --git a/ui/qt/preferences_dialog.h b/ui/qt/preferences_dialog.h index b00b60d4a1..4654146db0 100644 --- a/ui/qt/preferences_dialog.h +++ b/ui/qt/preferences_dialog.h @@ -54,6 +54,7 @@ protected: void keyPressEvent(QKeyEvent *evt); private: + bool stashedPrefIsDefault(pref_t *pref); void updateItem(QTreeWidgetItem &item); Ui::PreferencesDialog *pd_ui_; @@ -62,7 +63,6 @@ private: QString saved_string_pref_; QComboBox *cur_combo_box_; int saved_combo_idx_; -// QHash<pref_t *, QTreeWidgetItem *> pref_item_hash_; private slots: void on_prefsTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); @@ -75,8 +75,11 @@ private slots: void stringPrefEditingFinished(); void rangePrefTextChanged(const QString & text); void rangePrefEditingFinished(); - void on_buttonBox_helpRequested(); + void on_advancedTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); + + void on_buttonBox_accepted(); + void on_buttonBox_helpRequested(); }; #endif // PREFERENCES_DIALOG_H diff --git a/ui/qt/qt_ui_utils.cpp b/ui/qt/qt_ui_utils.cpp index d2c27e8728..5a5677cb1a 100644 --- a/ui/qt/qt_ui_utils.cpp +++ b/ui/qt/qt_ui_utils.cpp @@ -164,6 +164,11 @@ format_size_flags_e operator|(format_size_flags_e lhs, format_size_flags_e rhs) return (format_size_flags_e) ((int)lhs| (int)rhs); } +/* + * We might want to create our own "wsstring" class with convenience + * methods for handling g_malloc()ed strings, GStrings, and a shortcut + * to .toUtf8().constData(). + */ QString gchar_free_to_qstring(gchar *glib_string) { QString *qt_string = new QString(glib_string); g_free(glib_string); diff --git a/ui/qt/wireshark_application.cpp b/ui/qt/wireshark_application.cpp index 6dd3e93f11..9f00ff9b02 100644 --- a/ui/qt/wireshark_application.cpp +++ b/ui/qt/wireshark_application.cpp @@ -523,6 +523,20 @@ void WiresharkApplication::registerUpdate(register_action_e action, const char * emit splashUpdate(action, message); } +void WiresharkApplication::emitAppSignal(AppSignal signal) +{ + switch (signal) { + case PreferencesChanged: + emit preferencesChanged(); + break; + case PacketDissectionChanged: + emit packetDissectionChanged(); + break; + default: + break; + } +} + void WiresharkApplication::allSystemsGo() { initialized_ = true; @@ -533,12 +547,6 @@ void WiresharkApplication::allSystemsGo() } } -void WiresharkApplication::applyAllPreferences() -{ - prefs_apply_all(); - emit updatePreferences(); -} - e_prefs * WiresharkApplication::readConfigurationFiles(char **gdp_path, char **dp_path) { int gpf_open_errno, gpf_read_errno; diff --git a/ui/qt/wireshark_application.h b/ui/qt/wireshark_application.h index 219c33d171..326d7cd248 100644 --- a/ui/qt/wireshark_application.h +++ b/ui/qt/wireshark_application.h @@ -60,9 +60,14 @@ class WiresharkApplication : public QApplication public: explicit WiresharkApplication(int &argc, char **argv); + enum AppSignal { + PacketDissectionChanged, + PreferencesChanged + }; + void registerUpdate(register_action_e action, const char *message); + void emitAppSignal(AppSignal signal); void allSystemsGo(); - void applyAllPreferences(); e_prefs * readConfigurationFiles(char **gdp_path, char **dp_path); QList<recent_item_status *> recentItems() const; void addRecentItem(const QString &filename, qint64 size, bool accessible); @@ -93,9 +98,11 @@ signals: void openCaptureFile(QString &cf_path); void updateRecentItemStatus(const QString &filename, qint64 size, bool accessible); void splashUpdate(register_action_e action, const char *message); - void updatePreferences(); void configurationProfileChanged(const gchar *profile_name); + void packetDissectionChanged(); + void preferencesChanged(); + #ifdef HAVE_LIBPCAP // XXX It might make more sense to move these to main.cpp or main_window.cpp or their own class. void captureCapturePrepared(capture_options *capture_opts); |