From 4b215597ae8c4c05f590224b390cfbc218a93166 Mon Sep 17 00:00:00 2001 From: Ulf Lamping Date: Thu, 16 Aug 2007 22:03:10 +0000 Subject: experimental feature: dissector filters add the possibility, that a dissector writer can provide (usually non-trivial) display filters specific for the protocol in question (with an example in packet-dcerpc-pn-io.c), that will appear in the GUI svn path=/trunk/; revision=22530 --- gtk/gui_stat_menu.h | 4 +-- gtk/menu.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++------- gtk/tcp_graph.c | 2 +- 3 files changed, 75 insertions(+), 13 deletions(-) (limited to 'gtk') diff --git a/gtk/gui_stat_menu.h b/gtk/gui_stat_menu.h index 40124c1d49..72cbb75a05 100644 --- a/gtk/gui_stat_menu.h +++ b/gtk/gui_stat_menu.h @@ -65,8 +65,8 @@ extern void register_stat_menu_item( const char *name, register_stat_group_t group, GtkItemFactoryCallback callback, - gboolean (*selected_packet_enabled)(frame_data *, epan_dissect_t *), - gboolean (*selected_tree_row_enabled)(field_info *), + gboolean (*selected_packet_enabled)(frame_data *, epan_dissect_t *, gpointer callback_data), + gboolean (*selected_tree_row_enabled)(field_info *, gpointer callback_data), gpointer callback_data); #ifdef __cplusplus diff --git a/gtk/menu.c b/gtk/menu.c index 0483dcf101..8307f033f2 100644 --- a/gtk/menu.c +++ b/gtk/menu.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "about_dlg.h" #include "capture_dlg.h" @@ -99,8 +100,8 @@ typedef struct _menu_item { gboolean enabled; GtkItemFactoryCallback callback; gpointer callback_data; - gboolean (*selected_packet_enabled)(frame_data *, epan_dissect_t *); - gboolean (*selected_tree_row_enabled)(field_info *); + gboolean (*selected_packet_enabled)(frame_data *, epan_dissect_t *, gpointer callback_data); + gboolean (*selected_tree_row_enabled)(field_info *, gpointer callback_data); GList *children; } menu_item_t; @@ -855,6 +856,59 @@ main_menu_new(GtkAccelGroup ** table) { return menubar; } + +void menu_dissector_filter_cb( GtkWidget *widget, + gpointer callback_data, + guint callback_action) +{ + dissector_filter_t *filter_entry = callback_data; + GtkWidget *filter_te; + const char *buf; + + + filter_te = OBJECT_GET_DATA(popup_menu_object, E_DFILTER_TE_KEY); + + /* XXX - this gets the packet_info of the last dissected packet, */ + /* which is not necessarily the last selected packet */ + /* e.g. "Update list of packets in real time" won't work correct */ + buf = filter_entry->build_filter_string(&cfile.edt->pi); + + gtk_entry_set_text(GTK_ENTRY(filter_te), buf); + + /* Run the display filter so it goes in effect - even if it's the + same as the previous display filter. */ + main_filter_packets(&cfile, buf, TRUE); + + g_free( (void *) buf); +} + +gboolean menu_dissector_filter_spe_cb(frame_data *fd, epan_dissect_t *edt, gpointer callback_data) { + dissector_filter_t *filter_entry = callback_data; + + /* XXX - this gets the packet_info of the last dissected packet, */ + /* which is not necessarily the last selected packet */ + /* e.g. "Update list of packets in real time" won't work correct */ + return (edt != NULL) ? filter_entry->is_filter_valid(&edt->pi) : FALSE; +} + +void menu_dissector_filter(void) { + GList *list_entry = dissector_filter_list; + dissector_filter_t *filter_entry; + + while(list_entry != NULL) { + filter_entry = list_entry->data; + + register_stat_menu_item(filter_entry->name, REGISTER_ANALYZE_GROUP_CONVERSATION_FILTER, + menu_dissector_filter_cb, + menu_dissector_filter_spe_cb, + NULL /* selected_tree_row_enabled */, + filter_entry); + + list_entry = g_list_next(list_entry); + } +} + + static void menus_init(void) { if (initialize) { @@ -888,6 +942,7 @@ menus_init(void) { } #endif + menu_dissector_filter(); merge_all_tap_menus(tap_menu_tree_root); /* Initialize enabled/disabled state of menu items */ @@ -926,8 +981,8 @@ static GList * tap_menu_item_add( char *name, gint group, GtkItemFactoryCallback callback, - gboolean (*selected_packet_enabled)(frame_data *, epan_dissect_t *), - gboolean (*selected_tree_row_enabled)(field_info *), + gboolean (*selected_packet_enabled)(frame_data *, epan_dissect_t *, gpointer callback_data), + gboolean (*selected_tree_row_enabled)(field_info *, gpointer callback_data), gpointer callback_data, GList *curnode) { @@ -980,8 +1035,8 @@ register_stat_menu_item( const char *name, register_stat_group_t group, GtkItemFactoryCallback callback, - gboolean (*selected_packet_enabled)(frame_data *, epan_dissect_t *), - gboolean (*selected_tree_row_enabled)(field_info *), + gboolean (*selected_packet_enabled)(frame_data *, epan_dissect_t *, gpointer callback_data), + gboolean (*selected_tree_row_enabled)(field_info *, gpointer callback_data), gpointer callback_data) { /*static const char toolspath[] = "/Statistics/";*/ @@ -1006,6 +1061,7 @@ register_stat_menu_item( case(REGISTER_STAT_GROUP_TELEPHONY): toolspath = "/Statistics/"; break; case(REGISTER_STAT_GROUP_NONE): toolspath = "/Statistics/"; break; case(REGISTER_ANALYZE_GROUP_NONE): toolspath = "/Analyze/"; break; + case(REGISTER_ANALYZE_GROUP_CONVERSATION_FILTER): toolspath = "/Analyze/Conversation Filter/"; break; #ifdef HAVE_LUA_5_1 case(REGISTER_TOOLS_GROUP_NONE): toolspath = "/Tools/"; @@ -1137,6 +1193,8 @@ static guint merge_tap_menus_layered(GList *node, gint group) { break; case(REGISTER_ANALYZE_GROUP_NONE): break; + case(REGISTER_ANALYZE_GROUP_CONVERSATION_FILTER): + break; #ifdef HAVE_LUA_5_1 case(REGISTER_TOOLS_GROUP_NONE): break; @@ -1145,7 +1203,7 @@ static guint merge_tap_menus_layered(GList *node, gint group) { g_assert_not_reached(); } #endif - gtk_item_factory_create_item(main_menu_factory, entry, node_data->callback_data, 2); + gtk_item_factory_create_item(main_menu_factory, entry, node_data->callback_data, /* callback_type */ 2); set_menu_sensitivity(main_menu_factory, node_data->name, FALSE); /* no capture file yet */ added++; } @@ -1213,6 +1271,10 @@ void merge_all_tap_menus(GList *node) { entry->path = "/Analyze/"; /*gtk_item_factory_create_item(main_menu_factory, entry, NULL, 2);*/ } + if (merge_tap_menus_layered(node, REGISTER_ANALYZE_GROUP_CONVERSATION_FILTER)) { + entry->path = "/Analyze/Conversation Filter/"; + /*gtk_item_factory_create_item(main_menu_factory, entry, NULL, 2);*/ + } #ifdef HAVE_LUA_5_1 if (merge_tap_menus_layered(node, REGISTER_TOOLS_GROUP_NONE)) { /*gtk_item_factory_create_item(main_menu_factory, entry, NULL, 2);*/ @@ -2308,7 +2370,7 @@ walk_menu_tree_for_selected_packet(GList *node, frame_data *fd, * based on its return value. */ if (node_data->selected_packet_enabled != NULL) - node_data->enabled = node_data->selected_packet_enabled(fd, edt); + node_data->enabled = node_data->selected_packet_enabled(fd, edt, node_data->callback_data); } else { /* * It's an interior node; call @@ -2418,7 +2480,7 @@ set_menus_for_selected_packet(capture_file *cf) set_menu_sensitivity(packet_list_menu_factory, "/Conversation Filter/UDP", cf->current_frame != NULL ? (cf->edt->pi.ipproto == IP_PROTO_UDP) : FALSE); set_menu_sensitivity(packet_list_menu_factory, "/Conversation Filter/PN-CBA Server", - cf->current_frame != NULL ? (cf->edt->pi.profinet_type != 0) : FALSE); + cf->current_frame != NULL ? (cf->edt->pi.profinet_type != 0 && cf->edt->pi.profinet_type < 10) : FALSE); set_menu_sensitivity(main_menu_factory, "/Analyze/Decode As...", cf->current_frame != NULL && decode_as_ok()); set_menu_sensitivity(packet_list_menu_factory, "/Decode As...", @@ -2467,7 +2529,7 @@ walk_menu_tree_for_selected_tree_row(GList *node, field_info *fi) * based on its return value. */ if (node_data->selected_tree_row_enabled != NULL) - node_data->enabled = node_data->selected_tree_row_enabled(fi); + node_data->enabled = node_data->selected_tree_row_enabled(fi, node_data->callback_data); } else { /* * It's an interior node; call diff --git a/gtk/tcp_graph.c b/gtk/tcp_graph.c index 114a8d91c0..b423671aa4 100644 --- a/gtk/tcp_graph.c +++ b/gtk/tcp_graph.c @@ -4007,7 +4007,7 @@ static int rint (double x) #endif -static gboolean tcp_graph_selected_packet_enabled(frame_data *current_frame, epan_dissect_t *edt) +static gboolean tcp_graph_selected_packet_enabled(frame_data *current_frame, epan_dissect_t *edt, gpointer callback_data _U_) { return current_frame != NULL ? (edt->pi.ipproto == IP_PROTO_TCP) : FALSE; } -- cgit v1.2.3