module->description = description;
module->apply_cb = apply_cb;
module->prefs = NULL; /* no preferences, to start */
+ module->parent = parent;
module->submodules = NULL; /* no submodules, to start */
module->numprefs = 0;
module->prefs_changed = FALSE;
*/
if (protocols_module == NULL) {
/*
- * No. Do so.
+ * No. Register Protocols subtree as well as any preferences
+ * for non-dissector modules.
*/
- protocols_module = prefs_register_subtree(NULL, "Protocols", NULL);
+ prefs_register_modules();
}
protocol = find_protocol_by_id(id);
return prefs_register_module(protocols_module,
*/
if (protocols_module == NULL) {
/*
- * No. Do so.
+ * No. Register Protocols subtree as well as any preferences
+ * for non-dissector modules.
*/
- protocols_module = prefs_register_subtree(NULL, "Protocols", NULL);
+ prefs_register_modules();
}
subtree_module = protocols_module;
*/
if (protocols_module == NULL) {
/*
- * No. Do so.
+ * No. Register Protocols subtree as well as any preferences
+ * for non-dissector modules.
*/
- protocols_module = prefs_register_subtree(NULL, "Protocols", NULL);
+ prefs_register_modules();
}
protocol = find_protocol_by_id(id);
module = prefs_register_module(protocols_module,
return 0;
}
+static void stats_callback(void)
+{
+ /* Test for a sane tap update interval */
+ if (prefs.tap_update_interval < 100 || prefs.tap_update_interval > 10000) {
+ prefs.tap_update_interval = TAP_UPDATE_DEFAULT_INTERVAL;
+ }
+
+#ifdef HAVE_LIBPORTAUDIO
+ /* Test for a sane max channels entry */
+ if (prefs.rtp_player_max_visible < 1 || prefs.rtp_player_max_visible > 10)
+ prefs.rtp_player_max_visible = RTP_PLAYER_DEFAULT_VISIBLE;
+#endif
+
+}
+
/*
* Register all non-dissector modules' preferences.
*/
void
prefs_register_modules(void)
{
+ module_t* stats;
+
+ if (protocols_module != NULL) {
+ /* Already setup preferences */
+ return;
+ }
+
+ stats = prefs_register_module(NULL, "statistics", "Statistics",
+ "Statistics", &stats_callback);
+
+ prefs_register_uint_preference(stats, "update_interval",
+ "Tap update interval in ms",
+ "Determines time between tap updates",
+ 10,
+ &prefs.tap_update_interval);
+
+#ifdef HAVE_LIBPORTAUDIO
+ prefs_register_uint_preference(stats, "rtp_player_max_visible",
+ "Max visible channels in RTP Player",
+ "Determines maximum height of RTP Player window",
+ 10,
+ &prefs.rtp_player_max_visible);
+#endif
+
+ protocols_module = prefs_register_module(NULL, "protocols", "Protocols",
+ "Protocols", NULL);
+
+ prefs_register_bool_preference(protocols_module, "display_hidden_proto_items",
+ "Display hidden protocol items",
+ "Display all hidden protocol items in the packet list.",
+ &prefs.display_hidden_proto_items);
}
/* Parse through a list of comma-separated, possibly quoted strings.
#define GREEN_COMPONENT(x) (guint16) (((((x) >> 8) & 0xff) * 65535 / 255))
#define BLUE_COMPONENT(x) (guint16) ( (((x) & 0xff) * 65535 / 255))
-/* values for the rtp player preferences dialog box */
-#define PRS_TAP_UPDATE_INTERVAL "taps.update_interval"
-#define PRS_RTP_PLAYER_MAX_VISIBLE "taps.rtp_player_max_visible"
-
-#define PRS_DISPLAY_HIDDEN_PROTO_ITEMS "packet_list.display_hidden_proto_items"
-
static const gchar *pr_formats[] = { "text", "postscript" };
static const gchar *pr_dests[] = { "command", "file" };
prefs.load_smi_modules = ((g_ascii_strcasecmp(value, "true") == 0)?TRUE:FALSE);
} else if (strcmp(pref_name, PRS_NAME_RESOLVE_SUPPRESS_SMI_ERRORS) == 0) {
prefs.suppress_smi_errors = ((g_ascii_strcasecmp(value, "true") == 0)?TRUE:FALSE);
- } else if ((strcmp(pref_name, PRS_RTP_PLAYER_MAX_VISIBLE) == 0) ||
- (strcmp(pref_name, "rtp_player.max_visible") == 0)) {
- /* ... also accepting old name for this preference */
- prefs.rtp_player_max_visible = strtol(value, NULL, 10);
- } else if (strcmp(pref_name, PRS_TAP_UPDATE_INTERVAL) == 0) {
- prefs.tap_update_interval = strtol(value, NULL, 10);
- } else if (strcmp(pref_name, PRS_DISPLAY_HIDDEN_PROTO_ITEMS) == 0) {
- prefs.display_hidden_proto_items = ((g_ascii_strcasecmp(value, "true") == 0)?TRUE:FALSE);
} else {
/* To which module does this preference belong? */
module = NULL;
fprintf(pf, PRS_NAME_RESOLVE_SUPPRESS_SMI_ERRORS ": %s\n",
prefs.suppress_smi_errors == TRUE ? "TRUE" : "FALSE");
- fprintf(pf, "\n####### Taps/Statistics ########\n");
-
- fprintf(pf, "\n# Tap update interval in ms.\n");
- fprintf(pf, "# An integer value greater between 100 and 10000.\n");
- if (prefs.tap_update_interval == default_prefs.tap_update_interval)
- fprintf(pf, "#");
- fprintf(pf, PRS_TAP_UPDATE_INTERVAL ": %d\n",
- prefs.tap_update_interval);
-
- fprintf(pf, "\n# Maximum visible channels in RTP Player window.\n");
- fprintf(pf, "# An integer value greater than 0.\n");
- if (prefs.rtp_player_max_visible == default_prefs.rtp_player_max_visible)
- fprintf(pf, "#");
- fprintf(pf, PRS_RTP_PLAYER_MAX_VISIBLE ": %d\n",
- prefs.rtp_player_max_visible);
+ /*
+ * XXX - The following members are intentionally not written here because
+ * they are handled within the 'generic' preference handling:
+ * tap_update_interval
+ * rtp_player_max_visible
+ */
fprintf(pf, "\n####### Filter Expressions ########\n");
{
fprintf(pf, "\n####### Protocols ########\n");
- fprintf(pf, "\n# Display hidden items in packet details pane?\n");
- fprintf(pf, "# TRUE or FALSE (case-insensitive).\n");
- if (prefs.display_hidden_proto_items == default_prefs.display_hidden_proto_items)
- fprintf(pf, "#");
- fprintf(pf, PRS_DISPLAY_HIDDEN_PROTO_ITEMS ": %s\n",
- prefs.display_hidden_proto_items == TRUE ? "TRUE" : "FALSE");
+ /*
+ * XXX - The following members are intentionally not written here because
+ * they are handled within the 'generic' preference handling:
+ * display_hidden_proto_items
+ */
pe_tree_foreach(prefs_modules, write_module_prefs, pf);
dest->capture_show_info = src->capture_show_info;
dest->name_resolve = src->name_resolve;
dest->name_resolve_concurrency = src->name_resolve_concurrency;
- dest->tap_update_interval = src->tap_update_interval;
- dest->rtp_player_max_visible = src->rtp_player_max_visible;
- dest->display_hidden_proto_items = src->display_hidden_proto_items;
-
+ /*
+ * XXX - The following members are intentionally not copied because they
+ * are handled within the 'generic' preference handling:
+ * tap_update_interval
+ * rtp_player_max_visible
+ * display_hidden_proto_items
+ */
}
/* Free a set of preferences. */
#include "ui/gtk/prefs_layout.h"
#include "ui/gtk/prefs_capture.h"
#include "ui/gtk/prefs_nameres.h"
-#include "ui/gtk/prefs_taps.h"
-#include "ui/gtk/prefs_protocols.h"
#include "ui/gtk/gui_utils.h"
#include "ui/gtk/dlg_utils.h"
#include "ui/gtk/stock_icons.h"
#define E_CAPTURE_PAGE_KEY "capture_options_page"
#define E_PRINT_PAGE_KEY "printer_options_page"
#define E_NAMERES_PAGE_KEY "nameres_options_page"
-#define E_TAPS_PAGE_KEY "taps_options_page"
-#define E_PROTOCOLS_PAGE_KEY "protocols_options_page"
#define E_FILTER_EXPRESSIONS_PAGE_KEY "filter_expressions_page"
/*
GtkWidget *tree;
GtkTreeIter iter;
gint page;
- gboolean is_protocol;
+ GtkTreeStore *store;
};
static gint protocols_page = 0;
return 0;
}
+#define prefs_tree_iter GtkTreeIter
+
+/* add a page to the tree */
+static prefs_tree_iter
+prefs_tree_page_add(const gchar *title, gint page_nr,
+ gpointer store, prefs_tree_iter *parent_iter)
+{
+ prefs_tree_iter iter;
+
+ gtk_tree_store_append(store, &iter, parent_iter);
+ gtk_tree_store_set(store, &iter, 0, title, 1, page_nr, -1);
+ return iter;
+}
+
+/* add a page to the notebook */
+static GtkWidget *
+prefs_nb_page_add(GtkWidget *notebook, const gchar *title, GtkWidget *page, const char *page_key)
+{
+ GtkWidget *frame;
+
+ frame = gtk_frame_new(title);
+ gtk_widget_show(frame);
+ if(page) {
+ gtk_container_add(GTK_CONTAINER(frame), page);
+ g_object_set_data(G_OBJECT(prefs_w), page_key, page);
+ }
+ gtk_notebook_append_page (GTK_NOTEBOOK(notebook), frame, NULL);
+
+ return frame;
+}
+
+/* create a basic window for preferences */
+GtkWidget*
+simple_prefs_show(module_t *module, struct ct_struct *cts, gchar* label_str)
+{
+ GtkWidget *main_tb, *main_vb, *frame, *main_sw;
+ int pos = 0;
+
+ /* Scrolled window */
+ main_sw = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(main_sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+ /* Frame */
+ frame = gtk_frame_new(module->description);
+ gtk_container_set_border_width(GTK_CONTAINER(frame), 5);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(main_sw), frame);
+ g_object_set_data(G_OBJECT(main_sw), E_PAGESW_FRAME_KEY, frame);
+
+ /* Main vertical box */
+ main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 5, FALSE);
+ gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
+ gtk_container_add(GTK_CONTAINER(frame), main_vb);
+
+ /* Main table */
+ main_tb = gtk_table_new(module->numprefs, 2, FALSE);
+ gtk_box_pack_start(GTK_BOX(main_vb), main_tb, FALSE, FALSE, 0);
+ gtk_table_set_row_spacings(GTK_TABLE(main_tb), 10);
+ gtk_table_set_col_spacings(GTK_TABLE(main_tb), 15);
+
+ /* Add items for each of the preferences */
+ prefs_pref_foreach(module, pref_show, main_tb);
+
+ /* Show 'em what we got */
+ gtk_widget_show_all(main_vb);
+
+ return main_vb;
+}
+
#define MAX_TREE_NODE_NAME_LEN 64
+
/* show prefs page for each registered module (protocol) */
static guint
module_prefs_show(module_t *module, gpointer user_data)
*/
g_strlcpy(label_str, module->title, MAX_TREE_NODE_NAME_LEN);
model = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(cts->tree)));
- if (prefs_module_has_submodules(module) && !cts->iter.stamp)
- gtk_tree_store_append(model, &iter, NULL);
+
+ if (module->parent == NULL) {
+ prefs_nb_page_add(cts->notebook, label_str, simple_prefs_show(module, cts, label_str), module->title);
+ gtk_tree_store_append(model, &iter, NULL);
+ /* Save the protocols page */
+ if (strcmp(module->title, "Protocols") == 0) {
+ protocols_page = cts->page++;
+ } else {
+ cts->page++;
+ }
+ }
else
gtk_tree_store_append(model, &iter, &cts->iter);
*/
child_cts = *cts;
child_cts.iter = iter;
- if (module == protocols_module)
- child_cts.is_protocol = TRUE;
prefs_modules_foreach_submodules(module, module_prefs_show, &child_cts);
/* keep the page count right */
}
-#define prefs_tree_iter GtkTreeIter
-
-/* add a page to the tree */
-static prefs_tree_iter
-prefs_tree_page_add(const gchar *title, gint page_nr,
- gpointer store, prefs_tree_iter *parent_iter)
-{
- prefs_tree_iter iter;
-
- gtk_tree_store_append(store, &iter, parent_iter);
- gtk_tree_store_set(store, &iter, 0, title, 1, page_nr, -1);
- return iter;
-}
-
-/* add a page to the notebook */
-static GtkWidget *
-prefs_nb_page_add(GtkWidget *notebook, const gchar *title, GtkWidget *page, const char *page_key)
-{
- GtkWidget *frame;
-
- frame = gtk_frame_new(title);
- gtk_widget_show(frame);
- if(page) {
- gtk_container_add(GTK_CONTAINER(frame), page);
- g_object_set_data(G_OBJECT(prefs_w), page_key, page);
- }
- gtk_notebook_append_page (GTK_NOTEBOOK(notebook), frame, NULL);
-
- return frame;
-}
-
-
/* show the dialog */
void
prefs_cb(GtkWidget *w, gpointer dummy)
cts.page = 0;
- /* Preferences common for all protocols */
- g_strlcpy(label_str, "Protocols", MAX_TREE_NODE_NAME_LEN);
- prefs_nb_page_add(prefs_nb, label_str, protocols_prefs_show(), E_PROTOCOLS_PAGE_KEY);
- protocols_page = cts.page++;
-
/* GUI prefs */
g_strlcpy(label_str, "User Interface", MAX_TREE_NODE_NAME_LEN);
prefs_nb_page_add(prefs_nb, label_str, gui_prefs_show(), E_GUI_PAGE_KEY);
#endif /* _WIN32 */
#endif /* HAVE_LIBPCAP */
- /* Printing prefs */
- g_strlcpy(label_str, "Printing", MAX_TREE_NODE_NAME_LEN);
- prefs_nb_page_add(prefs_nb, label_str, printer_prefs_show(), E_PRINT_PAGE_KEY);
+ /* Saved filter prefs */
+ g_strlcpy(label_str, "Filter Expressions", MAX_TREE_NODE_NAME_LEN);
+ prefs_nb_page_add(prefs_nb, label_str, filter_expressions_prefs_show(),
+ E_FILTER_EXPRESSIONS_PAGE_KEY);
prefs_tree_page_add(label_str, cts.page, store, NULL);
cts.page++;
prefs_tree_page_add(label_str, cts.page, store, NULL);
cts.page++;
- /* Saved filter prefs */
- g_strlcpy(label_str, "Filter Expressions", MAX_TREE_NODE_NAME_LEN);
- prefs_nb_page_add(prefs_nb, label_str, filter_expressions_prefs_show(),
- E_FILTER_EXPRESSIONS_PAGE_KEY);
- prefs_tree_page_add(label_str, cts.page, store, NULL);
- cts.page++;
-
- /* TAPS player prefs */
- g_strlcpy(label_str, "Statistics", MAX_TREE_NODE_NAME_LEN);
- prefs_nb_page_add(prefs_nb, label_str, stats_prefs_show(), E_TAPS_PAGE_KEY);
+ /* Printing prefs */
+ g_strlcpy(label_str, "Printing", MAX_TREE_NODE_NAME_LEN);
+ prefs_nb_page_add(prefs_nb, label_str, printer_prefs_show(), E_PRINT_PAGE_KEY);
prefs_tree_page_add(label_str, cts.page, store, NULL);
cts.page++;
/* Registered prefs */
cts.notebook = prefs_nb;
- cts.is_protocol = FALSE;
+ cts.store = store;
prefs_modules_foreach_submodules(NULL, module_prefs_show, &cts);
/* Button row: OK and alike buttons */
nameres_prefs_fetch(g_object_get_data(G_OBJECT(dlg), E_NAMERES_PAGE_KEY));
filter_expressions_prefs_fetch(g_object_get_data(G_OBJECT(dlg),
E_FILTER_EXPRESSIONS_PAGE_KEY));
- stats_prefs_fetch(g_object_get_data(G_OBJECT(dlg), E_TAPS_PAGE_KEY));
- protocols_prefs_fetch(g_object_get_data(G_OBJECT(dlg), E_PROTOCOLS_PAGE_KEY));
prefs_modules_foreach(module_prefs_fetch, must_redissect);
return TRUE;
#endif /* HAVE_LIBPCAP */
printer_prefs_apply(g_object_get_data(G_OBJECT(dlg), E_PRINT_PAGE_KEY));
nameres_prefs_apply(g_object_get_data(G_OBJECT(dlg), E_NAMERES_PAGE_KEY));
- stats_prefs_apply(g_object_get_data(G_OBJECT(dlg), E_TAPS_PAGE_KEY));
- protocols_prefs_apply(g_object_get_data(G_OBJECT(dlg), E_PROTOCOLS_PAGE_KEY));
/* show/hide the Save button - depending on setting */
save_bt = g_object_get_data(G_OBJECT(prefs_w), E_PREFSW_SAVE_BT_KEY);
#endif /* HAVE_LIBPCAP */
printer_prefs_destroy(g_object_get_data(G_OBJECT(dlg), E_PRINT_PAGE_KEY));
nameres_prefs_destroy(g_object_get_data(G_OBJECT(dlg), E_NAMERES_PAGE_KEY));
- stats_prefs_destroy(g_object_get_data(G_OBJECT(dlg), E_TAPS_PAGE_KEY));
/* Free up the saved preferences (both for "prefs" and for registered
preferences). */
free_prefs(&saved_prefs);
prefs_modules_foreach(module_prefs_clean, NULL);
- protocols_prefs_destroy(g_object_get_data(G_OBJECT(dlg), E_PROTOCOLS_PAGE_KEY));
}