Ethereal-dev: [Ethereal-dev] patch to docs and to mgcp-stat

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Lars Roland <Lars.Roland@xxxxxxx>
Date: Sun, 27 Apr 2003 17:09:45 +0200
Hello,

Attached are patches to docu and to mgcp-stat.
I am new to gtk-programming. please take a look at it and commit, if acceptable.

I started using a gtkclist. I do not have GTK2, so I just did it for old GTK. May be someone else can make it for GTK2.

If necessary, my GtkCList makes vertical scrolling. No sorting of table at the moment.

I added two functions to gtk_stat_util.c

"init_main_stat_window" makes the settings for standard rtt-stat window.
It can be used in smb_stat.c, dcerpc_stat.c and rpc_stat.c without any modifications. This is just for reducing redundant code. No change in functionality.

"init_stat_table" makes the settings for a GtkCList including the scrolling. This may be useful, when changing the other statistic windows to a GtkCList

Best Regards,

Lars Roland

Index: ethereal/gtk/gtk_stat_util.c
===================================================================
RCS file: /cvsroot/ethereal/gtk/gtk_stat_util.c,v
retrieving revision 1.1
diff -u -r1.1 gtk_stat_util.c
--- ethereal/gtk/gtk_stat_util.c	25 Apr 2003 20:54:18 -0000	1.1
+++ ethereal/gtk/gtk_stat_util.c	27 Apr 2003 13:54:06 -0000
@@ -63,3 +63,58 @@
 	gtk_widget_show(tmp);
 }
 
+/* init a main windowfor stats, set title and display used filter in window */
+
+void
+init_main_stat_window(GtkWidget *window, GtkWidget *mainbox, char *title, char *filter)
+{
+	GtkWidget *main_label;
+	GtkWidget *filter_label;
+	char filter_string[256];
+
+
+	gtk_window_set_title(GTK_WINDOW(window), title);
+
+	gtk_container_add(GTK_CONTAINER(window), mainbox);
+	gtk_container_set_border_width(GTK_CONTAINER(mainbox), 10);
+	gtk_widget_show(mainbox);
+
+	main_label=gtk_label_new(title);
+	gtk_box_pack_start(GTK_BOX(mainbox), main_label, FALSE, FALSE, 0);
+	gtk_widget_show(main_label);
+
+	snprintf(filter_string,255,"Filter:%s",filter?filter:"");
+	filter_label=gtk_label_new(filter_string);
+	gtk_box_pack_start(GTK_BOX(mainbox), filter_label, FALSE, FALSE, 0);
+	gtk_widget_show(filter_label);
+
+}
+
+/* init a table, using a scrollable gtkclist */
+
+#if GTK_MAJOR_VERSION < 2
+void
+init_stat_table(GtkWidget *scrolled_window, GtkWidget *vbox ,GtkCList *table, int columns, char *titles[])
+{
+	int i;
+
+	/* configure scrolling window*/
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
+				       GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+	gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);
+
+	/* configure clist */
+	gtk_clist_column_titles_passive(table);
+	gtk_clist_column_titles_show(table);
+	for (i = 0; i < columns; i++)
+	    gtk_clist_set_column_auto_resize(table, i, TRUE);
+	gtk_clist_set_selection_mode(table, GTK_SELECTION_EXTENDED);
+
+	/* Put clist into a scrolled window */
+	gtk_container_add(GTK_CONTAINER(scrolled_window),
+                          GTK_WIDGET(table));
+        gtk_widget_show(GTK_WIDGET(table));
+	gtk_widget_show(scrolled_window);
+
+}
+#endif
\ No newline at end of file
Index: ethereal/gtk/gtk_stat_util.h
===================================================================
RCS file: /cvsroot/ethereal/gtk/gtk_stat_util.h,v
retrieving revision 1.1
diff -u -r1.1 gtk_stat_util.h
--- ethereal/gtk/gtk_stat_util.h	25 Apr 2003 20:54:18 -0000	1.1
+++ ethereal/gtk/gtk_stat_util.h	27 Apr 2003 13:54:06 -0000
@@ -36,5 +36,9 @@
 }gtk_table;
 
 extern void add_table_entry(gtk_table *tab, char *str, int x, int y);
+extern void init_main_stat_window(GtkWidget *window, GtkWidget *mainbox, char *title, char *filter);
 
+#if GTK_MAJOR_VERSION < 2
+extern void init_stat_table(GtkWidget *scrolled_window, GtkWidget *vbox ,GtkCList *table, int columns, char *titles[]);
+#endif
 #endif
Index: ethereal/gtk/mgcp_stat.c
===================================================================
RCS file: /cvsroot/ethereal/gtk/mgcp_stat.c,v
retrieving revision 1.5
diff -u -r1.5 mgcp_stat.c
--- ethereal/gtk/mgcp_stat.c	25 Apr 2003 20:54:18 -0000	1.5
+++ ethereal/gtk/mgcp_stat.c	27 Apr 2003 13:54:06 -0000
@@ -57,7 +57,12 @@
 	GtkWidget *win;
 	GtkWidget *vbox;
 	char *filter;
+#if GTK_MAJOR_VERSION >= 2
 	gtk_table *table;
+#else /* gtk1 using a scrollable clist*/
+	GtkWidget *scrolled_window;
+	GtkCList *table;
+#endif
         timestat_t rtd[NUM_TIMESTATS];
 	guint32 open_req_num;
 	guint32 disc_rsp_num;
@@ -194,6 +199,7 @@
 {
 	mgcpstat_t *ms=(mgcpstat_t *)pms;
 	int i;
+#if GTK_MAJOR_VERSION >= 2
 	int pos;
 	char str[256];
 
@@ -238,6 +244,37 @@
 	}
 
 	gtk_widget_show(ms->table->widget);
+#else /* gtk1 using a scrollable clist*/
+	char *str[7];
+
+	for(i=0;i<7;i++) {
+		str[i]=g_malloc(sizeof(char[256]));
+	}
+
+	/* clear list before printing */
+	gtk_clist_clear(ms->table);
+
+	for(i=0;i<NUM_TIMESTATS;i++) {
+		/* nothing seen, nothing to do */
+		if(ms->rtd[i].num==0){
+			continue;
+		}
+
+		sprintf(str[0], "%s", val_to_str(i,mgcp_mesage_type,"Other"));
+		sprintf(str[1], "%d", ms->rtd[i].num);
+		sprintf(str[2], "%8.2f msec", nstime_to_msec(&(ms->rtd[i].min)));
+		sprintf(str[3], "%8.2f msec", nstime_to_msec(&(ms->rtd[i].max)));;
+		sprintf(str[4], "%8.2f msec", get_average(&(ms->rtd[i].tot), ms->rtd[i].num));
+		sprintf(str[5], "%6u", ms->rtd[i].min_num);
+		sprintf(str[6], "%6u", ms->rtd[i].max_num);
+		gtk_clist_append(ms->table, str);
+	}
+
+	gtk_widget_show(GTK_WIDGET(ms->table));
+	for(i=0;i<7;i++) {
+		g_free(str[i]);
+	}
+#endif
 }
 
 void protect_thread_critical_region(void);
@@ -255,20 +292,35 @@
 		g_free(ms->filter);
 		ms->filter=NULL;
 	}
+#if GTK_MAJOR_VERSION >= 2
 	g_free(ms->table);
 	ms->table=NULL;
+#endif
 	g_free(ms);
 }
 
+static gchar *titles[]={"Type",
+			"Messages",
+			"Min RTD",
+			"Max RTD",
+			"Avg RTD",
+			"Min in Frame",
+			"Max in Frame" };
+
 void
 gtk_mgcpstat_init(char *optarg)
 {
 	mgcpstat_t *ms;
 	char *filter=NULL;
+	GString *error_string;
+#if GTK_MAJOR_VERSION >= 2
 	GtkWidget *stat_label;
 	GtkWidget *filter_label;
 	char filter_string[256];
-	GString *error_string;
+#else /* GTK1 using a clist */
+	int i;
+#endif
+
 
 	if(!strncmp(optarg,"mgcp,rtd,",9)){
 		filter=optarg+9;
@@ -284,22 +336,13 @@
 	mgcpstat_reset(ms);
 
 	ms->win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
-	gtk_window_set_title(GTK_WINDOW(ms->win), "MGCP Response Time Delay (RTD) Statistics");
 	SIGNAL_CONNECT(ms->win, "destroy", win_destroy_cb, ms);
 
 	ms->vbox=gtk_vbox_new(FALSE, 0);
-	gtk_container_add(GTK_CONTAINER(ms->win), ms->vbox);
-	gtk_container_set_border_width(GTK_CONTAINER(ms->vbox), 10);
-	gtk_widget_show(ms->vbox);
-
-	stat_label=gtk_label_new("MGCP Response Time Delay (RTD) Statistics");
-	gtk_box_pack_start(GTK_BOX(ms->vbox), stat_label, FALSE, FALSE, 0);
-	gtk_widget_show(stat_label);
-
-	snprintf(filter_string,255,"Filter:%s",filter?filter:"");
-	filter_label=gtk_label_new(filter_string);
-	gtk_box_pack_start(GTK_BOX(ms->vbox), filter_label, FALSE, FALSE, 0);
-	gtk_widget_show(filter_label);
+
+	init_main_stat_window(ms->win, ms->vbox, "MGCP Response Time Delay (RTD) Statistics", filter);
+
+#if GTK_MAJOR_VERSION >= 2
 
 	ms->table =(gtk_table *)g_malloc(sizeof(gtk_table));
 	ms->table->height=5;
@@ -317,11 +360,23 @@
 
 	gtk_widget_show(ms->table->widget);
 
+#else /* GTK1 using a scrollable clist*/
+        /* init a scrolled window*/
+	ms->scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+	WIDGET_SET_SIZE(ms->scrolled_window, 550, 100);
+
+	ms->table = GTK_CLIST(gtk_clist_new_with_titles(7, titles));
+
+	init_stat_table(ms->scrolled_window, ms->vbox ,ms->table, 7, titles);
+#endif
+
 	error_string=register_tap_listener("mgcp", ms, filter, mgcpstat_reset, mgcpstat_packet, mgcpstat_draw);
 	if(error_string){
 		simple_dialog(ESD_TYPE_WARN, NULL, error_string->str);
 		g_string_free(error_string, TRUE);
+#if GTK_MAJOR_VERSION >= 2
 		g_free(ms->table);
+#endif
 		g_free(ms->filter);
 		g_free(ms);
 		return;
Index: ethereal.pod.template
===================================================================
RCS file: /cvsroot/ethereal/doc/ethereal.pod.template,v
retrieving revision 1.403
diff -u -r1.403 ethereal.pod.template
--- ethereal.pod.template	27 Apr 2003 00:41:52 -0000	1.403
+++ ethereal.pod.template	27 Apr 2003 14:40:28 -0000
@@ -345,6 +345,20 @@
 Example: use B<-z "smb,rtt,ip.addr==1.2.3.4"> to only collect stats for
 SMB packets echanged by the host at IP address 1.2.3.4 .
 
+B<-z> mgcp,rtd[I<,filter>]
+
+Collect requests/response RTD (Response Time Delay) data for MGCP. 
+This is similar to B<-z smb,rtt>). Data collected is number of calls
+for each known MGCP Type, MinRTD, MaxRTD and AvgRTD.
+Example: use B<-z mgcp,rtd>.
+
+This option can be used multiple times on the command line. 
+
+If the optional filterstring is provided, the stats will only be calculated
+on those calls that match that filter.
+Example: use B<-z "mgcp,rtd,ip.addr==1.2.3.4"> to only collect stats for
+MGCP packets exchanged by the host at IP address 1.2.3.4 .
+
 =back
 
 =head1 INTERFACE
@@ -711,6 +725,20 @@
 calculation.  So for common SessionSetupAndX + TreeConnectAndX chains,
 only the SessionSetupAndX call will be used in the statistics.
 This is a flaw that might be fixed in the future.
+
+You can apply an optional filter string in a dialog box, before starting
+the calculation. The stats will only be calculated 
+on those calls matching that filter.
+
+=item Tools:Statistics:MGCP:RTD
+
+Collect requests/response RTD (Response Time Delay) data for MGCP. 
+Data collected is number of calls for each known MGCP Type, 
+MinRTD, MaxRTD and AvgRTD. The data will be presented in a table.
+
+You can apply an optional filter string in a dialog box, before starting
+the calculation. The stats will only be calculated 
+on those calls matching that filter.
 
 =back
 
Index: tethereal.pod.template
===================================================================
RCS file: /cvsroot/ethereal/doc/tethereal.pod.template,v
retrieving revision 1.75
diff -u -r1.75 tethereal.pod.template
--- tethereal.pod.template	26 Apr 2003 05:38:07 -0000	1.75
+++ tethereal.pod.template	27 Apr 2003 14:40:30 -0000
@@ -501,14 +501,15 @@
 Example: use B<-z "smb,rtt,ip.addr==1.2.3.4"> to only collect stats for
 SMB packets echanged by the host at IP address 1.2.3.4 .
 
-B<-z> mgcp,rtd,[I<filter>]
+B<-z> mgcp,rtd[I<,filter>]
 
 Collect requests/response RTD (Response Time Delay) data for MGCP. 
-This is similar to B<-z smb,rtt>). You get the number of duplicate 
-requests/responses, unresponded requests, responses ,which don't match with
-any request, and in a seperate line the number of responded requests, 
-Minimum RTD, Maximum RTD and Average RTD. 
-Example: use B<-z mgcp,rtd,>.
+This is similar to B<-z smb,rtt>). Data collected is number of calls
+for each known MGCP Type, MinRTD, MaxRTD and AvgRTD.
+Additionally you get the number of duplicate requests/responses, 
+unresponded requests, responses ,which don't match with
+any request. 
+Example: use B<-z mgcp,rtd>.
 
 This option can be used multiple times on the command line.