aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2003-09-05 10:26:44 +0000
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2003-09-05 10:26:44 +0000
commit95b3b8ca6d9e24c6f39b72ea7b7c1b21b81f8747 (patch)
tree8bebe6ff0b7f038e09db933c88a9c6fff1bf4935 /gtk
parentceb390bd7cd9c9a709ba7044f994dc7b0ff0f3e8 (diff)
Add a popup to the ServicveResponseTime tables where the user can select
Prepare/Match/FindFrame similar to chat the ConversationList has. Only enabled for SMB and ONC-RPC at this point svn path=/trunk/; revision=8391
Diffstat (limited to 'gtk')
-rw-r--r--gtk/dcerpc_stat.c4
-rw-r--r--gtk/fc_stat.c4
-rw-r--r--gtk/rpc_stat.c8
-rw-r--r--gtk/service_response_time_table.c178
-rw-r--r--gtk/service_response_time_table.h7
-rw-r--r--gtk/smb_stat.c8
6 files changed, 195 insertions, 14 deletions
diff --git a/gtk/dcerpc_stat.c b/gtk/dcerpc_stat.c
index 9064974361..d6a4f82e46 100644
--- a/gtk/dcerpc_stat.c
+++ b/gtk/dcerpc_stat.c
@@ -1,7 +1,7 @@
/* dcerpc_stat.c
* dcerpc_stat 2002 Ronnie Sahlberg
*
- * $Id: dcerpc_stat.c,v 1.15 2003/09/05 00:48:58 sahlberg Exp $
+ * $Id: dcerpc_stat.c,v 1.16 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -239,7 +239,7 @@ gtk_dcerpcstat_init(char *optarg)
/* We must display TOP LEVEL Widget before calling init_srt_table() */
gtk_widget_show(rs->win);
- init_srt_table(&rs->srt_table, max_procs+1, vbox);
+ init_srt_table(&rs->srt_table, max_procs+1, vbox, NULL);
for(i=0;i<(max_procs+1);i++){
int j;
diff --git a/gtk/fc_stat.c b/gtk/fc_stat.c
index 940251e749..549d5038f6 100644
--- a/gtk/fc_stat.c
+++ b/gtk/fc_stat.c
@@ -1,7 +1,7 @@
/* fc_stat.c
* fc_stat 2003 Ronnie Sahlberg
*
- * $Id: fc_stat.c,v 1.4 2003/09/02 08:27:33 sahlberg Exp $
+ * $Id: fc_stat.c,v 1.5 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -164,7 +164,7 @@ gtk_fcstat_init(char *optarg)
/* We must display TOP LEVEL Widget before calling init_srt_table() */
gtk_widget_show(fc->win);
- init_srt_table(&fc->fc_srt_table, 256, vbox);
+ init_srt_table(&fc->fc_srt_table, 256, vbox, NULL);
for(i=0;i<256;i++){
init_srt_table_row(&fc->fc_srt_table, i, val_to_str(i, fc_fc4_val, "Unknown(0x%02x)"));
}
diff --git a/gtk/rpc_stat.c b/gtk/rpc_stat.c
index 47c9d66fbd..4419192422 100644
--- a/gtk/rpc_stat.c
+++ b/gtk/rpc_stat.c
@@ -1,7 +1,7 @@
/* rpc_stat.c
* rpc_stat 2002 Ronnie Sahlberg
*
- * $Id: rpc_stat.c,v 1.15 2003/09/02 08:27:41 sahlberg Exp $
+ * $Id: rpc_stat.c,v 1.16 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -190,6 +190,8 @@ gtk_rpcstat_init(char *optarg)
int program, version, pos;
char *filter=NULL;
GString *error_string;
+ int hf_index;
+ header_field_info *hfi;
pos=0;
if(sscanf(optarg,"rpc,srt,%d,%d,%n",&program,&version,&pos)==2){
@@ -209,6 +211,8 @@ gtk_rpcstat_init(char *optarg)
rs->prog=rpc_prog_name(rpc_program);
rs->program=rpc_program;
rs->version=rpc_version;
+ hf_index=rpc_prog_hf(rpc_program, rpc_version);
+ hfi=proto_registrar_get_nth(hf_index);
rs->win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(rs->win), 550, 400);
@@ -238,7 +242,7 @@ gtk_rpcstat_init(char *optarg)
/* We must display TOP LEVEL Widget before calling init_srt_table() */
gtk_widget_show(rs->win);
- init_srt_table(&rs->srt_table, rpc_max_proc+1, vbox);
+ init_srt_table(&rs->srt_table, rpc_max_proc+1, vbox, hfi->abbrev);
for(i=0;i<rs->num_procedures;i++){
init_srt_table_row(&rs->srt_table, i, rpc_proc_name(rpc_program, rpc_version, i));
diff --git a/gtk/service_response_time_table.c b/gtk/service_response_time_table.c
index d8cd4cf7fc..e6f592768c 100644
--- a/gtk/service_response_time_table.c
+++ b/gtk/service_response_time_table.c
@@ -3,7 +3,7 @@
* Helper routines common to all service response time statistics
* tap.
*
- * $Id: service_response_time_table.c,v 1.6 2003/09/03 10:10:18 sahlberg Exp $
+ * $Id: service_response_time_table.c,v 1.7 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -38,6 +38,12 @@
#include "service_response_time_table.h"
#include "image/clist_ascend.xpm"
#include "image/clist_descend.xpm"
+#include "simple_dialog.h"
+#include "globals.h"
+#include "gtk/find_dlg.h"
+
+extern GtkWidget *main_display_filter_widget;
+#define GTK_MENU_FUNC(a) ((GtkItemFactoryCallback)(a))
typedef struct column_arrows {
@@ -124,8 +130,164 @@ srt_sort_column(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2)
return 0;
}
+
+
+/* action is encoded as
+ filter_action*256+filter_type
+
+ filter_action:
+ 0: Match
+ 1: Prepare
+ 2: Find
+ filter_type:
+ 0: Selected
+ 1: Not Selected
+ 2: And Selected
+ 3: Or Selected
+ 4: And Not Selected
+ 5: Or Not Selected
+*/
+static void
+srt_select_filter_cb(GtkWidget *widget _U_, gpointer callback_data, guint callback_action)
+{
+ int action, type, selection;
+ srt_stat_table *rst = (srt_stat_table *)callback_data;
+ char str[256];
+ char *current_filter;
+
+
+ if(rst->filter_string==NULL){
+ return;
+ }
+
+ action=(callback_action>>8)&0xff;
+ type=callback_action&0xff;
+
+ selection=GPOINTER_TO_INT(g_list_nth_data(GTK_CLIST(rst->table)->selection, 0));
+ if(selection>=(int)rst->num_procs){
+ simple_dialog(ESD_TYPE_WARN, NULL, "No procedure selected");
+ return;
+ }
+ /* translate it back from row index to index in procedures array */
+ selection=GPOINTER_TO_INT(gtk_clist_get_row_data(rst->table, selection));
+
+ current_filter=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
+
+ switch(type){
+ case 0:
+ /* selected */
+ snprintf(str, 255, "%s==%d", rst->filter_string, selection);
+ break;
+ case 1:
+ /* not selected */
+ snprintf(str, 255, "!(%s==%d)", rst->filter_string, selection);
+ break;
+ case 2:
+ /* and selected */
+ snprintf(str, 255, "(%s) && (%s==%d)", current_filter, rst->filter_string, selection);
+ break;
+ case 3:
+ /* or selected */
+ snprintf(str, 255, "(%s) || (%s==%d)", current_filter, rst->filter_string, selection);
+ break;
+ case 4:
+ /* and not selected */
+ snprintf(str, 255, "(%s) && !(%s==%d)", current_filter, rst->filter_string, selection);
+ break;
+ case 5:
+ /* or not selected */
+ snprintf(str, 255, "(%s) || !(%s==%d)", current_filter, rst->filter_string, selection);
+ break;
+ }
+
+ gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), str);
+
+ switch(action){
+ case 0:
+ /* match */
+ filter_packets(&cfile, str);
+ case 1:
+ /* prepare */
+ /* do nothing */
+ break;
+ case 2:
+ /* find frame */
+ find_frame_with_filter(str);
+ break;
+ }
+
+}
+
+static gint
+srt_show_popup_menu_cb(void *widg _U_, GdkEvent *event, srt_stat_table *rst)
+{
+ GdkEventButton *bevent = (GdkEventButton *)event;
+
+ if(event->type==GDK_BUTTON_PRESS && bevent->button==3){
+ gtk_menu_popup(GTK_MENU(rst->menu), NULL, NULL, NULL, NULL,
+ bevent->button, bevent->time);
+ }
+
+ return FALSE;
+}
+
+static GtkItemFactoryEntry srt_list_menu_items[] =
+{
+ /* Match */
+ ITEM_FACTORY_ENTRY("/Match Display Filter", NULL, NULL, 0, "<Branch>", NULL),
+ ITEM_FACTORY_ENTRY("/Match Display Filter/Selected", NULL,
+ srt_select_filter_cb, 0*256+0, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Match Display Filter/Not Selected", NULL,
+ srt_select_filter_cb, 0*256+1, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Match Display Filter/And Selected", NULL,
+ srt_select_filter_cb, 0*256+2, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Match Display Filter/Or Selected", NULL,
+ srt_select_filter_cb, 0*256+3, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Match Display Filter/And Not Selected", NULL,
+ srt_select_filter_cb, 0*256+4, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Match Display Filter/Or Not Selected", NULL,
+ srt_select_filter_cb, 0*256+5, NULL, NULL),
+
+ /* Prepare */
+ ITEM_FACTORY_ENTRY("/Prepare Display Filter", NULL, NULL, 0, "<Branch>", NULL),
+ ITEM_FACTORY_ENTRY("/Prepare Display Filter/Selected", NULL,
+ srt_select_filter_cb, 1*256+0, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Prepare Display Filter/Not Selected", NULL,
+ srt_select_filter_cb, 1*256+1, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Prepare Display Filter/And Selected", NULL,
+ srt_select_filter_cb, 1*256+2, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Prepare Display Filter/Or Selected", NULL,
+ srt_select_filter_cb, 1*256+3, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Prepare Display Filter/And Not Selected", NULL,
+ srt_select_filter_cb, 1*256+4, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Prepare Display Filter/Or Not Selected", NULL,
+ srt_select_filter_cb, 1*256+5, NULL, NULL),
+
+ /* Find Frame */
+ ITEM_FACTORY_ENTRY("/Find Frame", NULL, NULL, 0, "<Branch>", NULL),
+ ITEM_FACTORY_ENTRY("/Find Frame/Selected", NULL,
+ srt_select_filter_cb, 2*256+0, NULL, NULL),
+ ITEM_FACTORY_ENTRY("/Find Frame/Not Selected", NULL,
+ srt_select_filter_cb, 2*256+1, NULL, NULL),
+
+};
+
+static void
+srt_create_popup_menu(srt_stat_table *rst)
+{
+ GtkItemFactory *item_factory;
+
+ item_factory = gtk_item_factory_new(GTK_TYPE_MENU, "<main>", NULL);
+
+ gtk_item_factory_create_items_ac(item_factory, sizeof(srt_list_menu_items)/sizeof(srt_list_menu_items[0]), srt_list_menu_items, rst, 2);
+
+ rst->menu = gtk_item_factory_get_widget(item_factory, "<main>");
+ SIGNAL_CONNECT(rst->table, "button_press_event", srt_show_popup_menu_cb, rst);
+}
+
+
void
-init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox)
+init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox, char *filter_string)
{
int i, j;
column_arrows *col_arrows;
@@ -136,6 +298,11 @@ init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox)
char *default_titles[] = { "Index", "Procedure", "Calls", "Min SRT", "Max SRT", "Avg SRT" };
+ if(filter_string){
+ rst->filter_string=g_strdup(filter_string);
+ } else {
+ rst->filter_string=NULL;
+ }
rst->scrolled_window=gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(rst->scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
gtk_box_pack_start(GTK_BOX(vbox), rst->scrolled_window, TRUE, TRUE, 0);
@@ -212,6 +379,11 @@ init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox)
rst->procedures[i].entries[j]=NULL;
}
}
+
+ /* create popup menu for this table */
+ if(rst->filter_string){
+ srt_create_popup_menu(rst);
+ }
}
void
@@ -368,6 +540,8 @@ free_srt_table_data(srt_stat_table *rst)
}
}
}
+ g_free(rst->filter_string);
+ rst->filter_string=NULL;
g_free(rst->procedures);
rst->procedures=NULL;
rst->num_procs=0;
diff --git a/gtk/service_response_time_table.h b/gtk/service_response_time_table.h
index cd28b1afcd..d98e2414be 100644
--- a/gtk/service_response_time_table.h
+++ b/gtk/service_response_time_table.h
@@ -3,7 +3,7 @@
* Helper routines common to all service response time statistics
* tap.
*
- * $Id: service_response_time_table.h,v 1.1 2003/06/21 01:42:46 sahlberg Exp $
+ * $Id: service_response_time_table.h,v 1.2 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -39,11 +39,14 @@ typedef struct _srt_procedure_t {
typedef struct _srt_stat_table {
GtkWidget *scrolled_window;
GtkCList *table;
+ GtkWidget *menu;
+ char *filter_string; /* append procedure number (%d) to this string
+ to create a display filter */
int num_procs;
srt_procedure_t *procedures;
} srt_stat_table;
-void init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox);
+void init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox, char *filter_string);
void init_srt_table_row(srt_stat_table *rst, int index, char *procedure);
diff --git a/gtk/smb_stat.c b/gtk/smb_stat.c
index 39e58fb931..d5a2d4a8e2 100644
--- a/gtk/smb_stat.c
+++ b/gtk/smb_stat.c
@@ -1,7 +1,7 @@
/* smb_stat.c
* smb_stat 2003 Ronnie Sahlberg
*
- * $Id: smb_stat.c,v 1.12 2003/09/02 08:27:43 sahlberg Exp $
+ * $Id: smb_stat.c,v 1.13 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -182,7 +182,7 @@ gtk_smbstat_init(char *optarg)
/* We must display TOP LEVEL Widget before calling init_srt_table() */
gtk_widget_show(ss->win);
- init_srt_table(&ss->smb_srt_table, 256, vbox);
+ init_srt_table(&ss->smb_srt_table, 256, vbox, "smb.cmd");
for(i=0;i<256;i++){
init_srt_table_row(&ss->smb_srt_table, i, val_to_str(i, smb_cmd_vals, "Unknown(0x%02x)"));
}
@@ -191,7 +191,7 @@ gtk_smbstat_init(char *optarg)
label=gtk_label_new("Transaction2 Sub-Commands");
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
- init_srt_table(&ss->trans2_srt_table, 256, vbox);
+ init_srt_table(&ss->trans2_srt_table, 256, vbox, "smb.trans2.cmd");
for(i=0;i<256;i++){
init_srt_table_row(&ss->trans2_srt_table, i, val_to_str(i, trans2_cmd_vals, "Unknown(0x%02x)"));
}
@@ -200,7 +200,7 @@ gtk_smbstat_init(char *optarg)
label=gtk_label_new("NT Transaction Sub-Commands");
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
- init_srt_table(&ss->nt_trans_srt_table, 256, vbox);
+ init_srt_table(&ss->nt_trans_srt_table, 256, vbox, "smb.nt.function");
for(i=0;i<256;i++){
init_srt_table_row(&ss->nt_trans_srt_table, i, val_to_str(i, nt_cmd_vals, "Unknown(0x%02x)"));
}