Ethereal-dev: Re: [Ethereal-dev] Voip Calls analysis and Graph analysis
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Alejandro Vaquero <alejandrovaquero@xxxxxxxxx>
Date: Mon, 28 Feb 2005 21:03:53 -0700
|
Hi All, Find attached a patch to "Voip analysis" to: - Add a horizontal scrollbar in the "Graph" to scroll the "comments" - Fix a "state" bug in H323 and SIP calls - Fix a bug that can make the "graph" to crash, and also clean up the "address" when the window is close Regards Alejandro Alejandro Vaquero wrote: Hi All, |
Index: gtk/graph_analysis.c
===================================================================
--- gtk/graph_analysis.c (revision 13505)
+++ gtk/graph_analysis.c (working copy)
@@ -83,6 +83,7 @@
user_data->nodes[i].type = AT_NONE;
user_data->nodes[i].len = 0;
g_free((void *)user_data->nodes[i].data);
+ user_data->nodes[i].data = NULL;
}
user_data->dlg.first_node=0;
@@ -95,15 +96,31 @@
/* Reset the user_data structure */
static void graph_analysis_init_dlg(graph_analysis_data_t* user_data)
{
+ int i;
+
+ user_data->num_nodes = 0;
+ user_data->num_items = 0;
+ for (i=0; i<MAX_NUM_NODES; i++){
+ user_data->nodes[i].type = AT_NONE;
+ user_data->nodes[i].len = 0;
+ user_data->nodes[i].data = NULL;
+ }
+
+ user_data->dlg.first_node=0;
+ user_data->dlg.first_item=0;
+ user_data->dlg.left_x_border=0;
+ user_data->dlg.selected_item=0xFFFFFFFF; /*not item selected */
/* init dialog_graph */
user_data->dlg.needs_redraw=TRUE;
user_data->dlg.draw_area=NULL;
user_data->dlg.pixmap=NULL;
+ user_data->dlg.draw_area_comments=NULL;
+ user_data->dlg.pixmap_comments=NULL;
user_data->dlg.h_scrollbar=NULL;
user_data->dlg.h_scrollbar_adjustment=NULL;
user_data->dlg.v_scrollbar=NULL;
user_data->dlg.v_scrollbar_adjustment=NULL;
- user_data->dlg.pixmap_width=600;
+ user_data->dlg.pixmap_width=350;
user_data->dlg.pixmap_height=400;
user_data->dlg.first_node=0;
user_data->dlg.first_item=0;
@@ -125,8 +142,9 @@
user_data->nodes[i].type = AT_NONE;
user_data->nodes[i].len = 0;
g_free((void *)user_data->nodes[i].data);
+ user_data->nodes[i].data = NULL;
}
- g_free(user_data);
+ user_data->dlg.window = NULL;
}
@@ -168,12 +186,12 @@
}
#define MAX_LABEL 50
-#define MAX_COMMENT 60
+#define MAX_COMMENT 100
#define ITEM_HEIGHT 20
#define NODE_WIDTH 100
#define TOP_Y_BORDER 40
#define BOTTOM_Y_BORDER 0
-#define COMMENT_WIDTH 250
+#define COMMENT_WIDTH 400
/****************************************************************************/
static void dialog_graph_draw(graph_analysis_data_t* user_data)
@@ -224,9 +242,17 @@
user_data->dlg.draw_area->allocation.width,
user_data->dlg.draw_area->allocation.height);
+ gdk_draw_rectangle(user_data->dlg.pixmap_comments,
+ user_data->dlg.draw_area->style->white_gc,
+ TRUE,
+ 0, 0,
+ COMMENT_WIDTH,
+ user_data->dlg.draw_area->allocation.height);
+
+
/* Calculate the y border */
top_y_border=TOP_Y_BORDER; /* to display the node address */
- bottom_y_border=BOTTOM_Y_BORDER;
+ bottom_y_border=2;
draw_height=user_data->dlg.pixmap_height-top_y_border-bottom_y_border;
@@ -305,7 +331,7 @@
left_x_border=label_width+10;
user_data->dlg.left_x_border = left_x_border;
- right_x_border=COMMENT_WIDTH;
+ right_x_border=2;
/* Calculate the number of nodes to display */
draw_width=user_data->dlg.pixmap_width-right_x_border-left_x_border;
@@ -404,18 +430,18 @@
#if GTK_MAJOR_VERSION < 2
label_width=gdk_string_width(small_font, label_string);
label_height=gdk_string_height(small_font, label_string);
- gdk_draw_string(user_data->dlg.pixmap,
+ gdk_draw_string(user_data->dlg.pixmap_comments,
small_font,
- user_data->dlg.draw_area->style->black_gc,
- user_data->dlg.pixmap_width-right_x_border+3,
+ user_data->dlg.draw_area_comments->style->black_gc,
+ 2,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2+label_height/4,
label_string);
#else
pango_layout_set_text(small_layout, label_string, -1);
pango_layout_get_pixel_size(small_layout, &label_width, &label_height);
- gdk_draw_layout(user_data->dlg.pixmap,
+ gdk_draw_layout(user_data->dlg.pixmap_comments,
user_data->dlg.draw_area->style->black_gc,
- user_data->dlg.pixmap_width-right_x_border+3,
+ 2,
top_y_border+current_item*ITEM_HEIGHT+ITEM_HEIGHT/2-label_height/2,
small_layout);
#endif
@@ -586,12 +612,12 @@
FALSE,
left_x_border-1,
(user_data->dlg.selected_item-first_item)*ITEM_HEIGHT+TOP_Y_BORDER,
- user_data->dlg.pixmap_width-COMMENT_WIDTH-left_x_border+1,
+ user_data->dlg.pixmap_width-left_x_border-right_x_border+1,
ITEM_HEIGHT);
}
-
+ /* refresh the draw areas */
gdk_draw_pixmap(user_data->dlg.draw_area->window,
user_data->dlg.draw_area->style->fg_gc[GTK_WIDGET_STATE(user_data->dlg.draw_area)],
user_data->dlg.pixmap,
@@ -599,7 +625,14 @@
0, 0,
user_data->dlg.pixmap_width, user_data->dlg.pixmap_height);
+ gdk_draw_pixmap(user_data->dlg.draw_area_comments->window,
+ user_data->dlg.draw_area_comments->style->fg_gc[GTK_WIDGET_STATE(user_data->dlg.draw_area_comments)],
+ user_data->dlg.pixmap_comments,
+ 0, 0,
+ 0, 0,
+ COMMENT_WIDTH, user_data->dlg.pixmap_height);
+
/* update the h_scrollbar */
user_data->dlg.h_scrollbar_adjustment->upper=(gfloat) user_data->num_nodes-1;
user_data->dlg.h_scrollbar_adjustment->step_increment=1;
@@ -619,7 +652,6 @@
gtk_adjustment_changed(user_data->dlg.v_scrollbar_adjustment);
gtk_adjustment_value_changed(user_data->dlg.v_scrollbar_adjustment);
-
}
/****************************************************************************/
@@ -630,19 +662,6 @@
}
/****************************************************************************/
-static gint quit(GtkWidget *widget, GdkEventExpose *event _U_)
-{
- graph_analysis_data_t *user_data;
-
- user_data=(graph_analysis_data_t *)OBJECT_GET_DATA(widget, "graph_analysis_data_t");
-
- user_data->dlg.window = NULL;
-
- user_data = NULL;
- return TRUE;
-}
-
-/****************************************************************************/
static gint button_press_event(GtkWidget *widget, GdkEventButton *event _U_)
{
graph_analysis_data_t *user_data;
@@ -750,6 +769,27 @@
return FALSE;
}
+/****************************************************************************/
+static gint expose_event_comments(GtkWidget *widget, GdkEventExpose *event)
+{
+ graph_analysis_data_t *user_data;
+
+ user_data=(graph_analysis_data_t *)OBJECT_GET_DATA(widget, "graph_analysis_data_t");
+ if(!user_data){
+ exit(10);
+ }
+
+
+ gdk_draw_pixmap(widget->window,
+ widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+ user_data->dlg.pixmap_comments,
+ event->area.x, event->area.y,
+ event->area.x, event->area.y,
+ event->area.width, event->area.height);
+
+ return FALSE;
+}
+
static const GdkColor COLOR_GRAY = {0, 0x7fff, 0x7fff, 0x7fff};
/****************************************************************************/
@@ -830,6 +870,38 @@
}
/****************************************************************************/
+static gint configure_event_comments(GtkWidget *widget, GdkEventConfigure *event _U_)
+{
+ graph_analysis_data_t *user_data;
+
+ user_data=(graph_analysis_data_t *)OBJECT_GET_DATA(widget, "graph_analysis_data_t");
+
+ if(!user_data){
+ exit(10);
+ }
+
+ if(user_data->dlg.pixmap_comments){
+ gdk_pixmap_unref(user_data->dlg.pixmap_comments);
+ user_data->dlg.pixmap_comments=NULL;
+ }
+
+ user_data->dlg.pixmap_comments=gdk_pixmap_new(widget->window,
+ COMMENT_WIDTH,
+ widget->allocation.height,
+ -1);
+
+ gdk_draw_rectangle(user_data->dlg.pixmap_comments,
+ widget->style->white_gc,
+ TRUE,
+ 0, 0,
+ COMMENT_WIDTH,
+ widget->allocation.height);
+
+ dialog_graph_redraw(user_data);
+ return TRUE;
+}
+
+/****************************************************************************/
static gint h_scrollbar_changed(GtkWidget *widget _U_, gpointer data)
{
graph_analysis_data_t *user_data=(graph_analysis_data_t *)data;
@@ -869,6 +941,8 @@
{
GtkWidget *vbox;
GtkWidget *hbox;
+ GtkWidget *scroll_window;
+ GtkWidget *viewport;
hbox=gtk_hbox_new(FALSE, 0);
gtk_widget_show(hbox);
@@ -876,28 +950,45 @@
vbox=gtk_vbox_new(FALSE, 0);
gtk_widget_show(vbox);
+ /* create "comments" draw area */
+ user_data->dlg.draw_area_comments=gtk_drawing_area_new();
+ WIDGET_SET_SIZE(user_data->dlg.draw_area_comments, COMMENT_WIDTH, user_data->dlg.pixmap_height);
+ scroll_window=gtk_scrolled_window_new(NULL, NULL);
+ WIDGET_SET_SIZE(scroll_window, COMMENT_WIDTH/2, user_data->dlg.pixmap_height);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_window), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER);
+ viewport = gtk_viewport_new(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scroll_window)), gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scroll_window)));
+ gtk_container_add(GTK_CONTAINER(viewport), user_data->dlg.draw_area_comments);
+ gtk_container_add(GTK_CONTAINER(scroll_window), viewport);
+ gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
+ OBJECT_SET_DATA(user_data->dlg.draw_area_comments, "graph_analysis_data_t", user_data);
+ gtk_widget_add_events (user_data->dlg.draw_area_comments, GDK_BUTTON_PRESS_MASK);
+ SIGNAL_CONNECT(user_data->dlg.draw_area_comments, "scroll_event", scroll_event, user_data);
+ /* create main Graph draw area */
user_data->dlg.draw_area=gtk_drawing_area_new();
GTK_WIDGET_SET_FLAGS(user_data->dlg.draw_area, GTK_CAN_FOCUS);
gtk_widget_grab_focus(user_data->dlg.draw_area);
-
- SIGNAL_CONNECT(user_data->dlg.draw_area, "destroy", quit, user_data);
OBJECT_SET_DATA(user_data->dlg.draw_area, "graph_analysis_data_t", user_data);
-
WIDGET_SET_SIZE(user_data->dlg.draw_area, user_data->dlg.pixmap_width, user_data->dlg.pixmap_height);
/* signals needed to handle backing pixmap */
SIGNAL_CONNECT(user_data->dlg.draw_area, "expose_event", expose_event, NULL);
SIGNAL_CONNECT(user_data->dlg.draw_area, "configure_event", configure_event, user_data);
+ /* signals needed to handle backing pixmap comments*/
+ SIGNAL_CONNECT(user_data->dlg.draw_area_comments, "expose_event", expose_event_comments, NULL);
+ SIGNAL_CONNECT(user_data->dlg.draw_area_comments, "configure_event", configure_event_comments, user_data);
- gtk_widget_add_events (user_data->dlg.draw_area,
- GDK_BUTTON_PRESS_MASK);
+ gtk_widget_add_events (user_data->dlg.draw_area, GDK_BUTTON_PRESS_MASK);
SIGNAL_CONNECT(user_data->dlg.draw_area, "button_press_event", button_press_event, user_data);
SIGNAL_CONNECT(user_data->dlg.draw_area, "scroll_event", scroll_event, user_data);
SIGNAL_CONNECT(user_data->dlg.draw_area, "key_press_event", key_press_event, user_data);
-
+
gtk_widget_show(user_data->dlg.draw_area);
+ gtk_widget_show(user_data->dlg.draw_area_comments);
+ gtk_widget_show(viewport);
+
gtk_box_pack_start(GTK_BOX(vbox), user_data->dlg.draw_area, TRUE, TRUE, 0);
+ gtk_widget_show(scroll_window);
/* create the associated h_scrollbar */
user_data->dlg.h_scrollbar_adjustment=(GtkAdjustment *)gtk_adjustment_new(0,0,0,0,0,0);
@@ -908,6 +999,8 @@
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), scroll_window, FALSE, FALSE, 0);
+
/* create the associated v_scrollbar */
user_data->dlg.v_scrollbar_adjustment=(GtkAdjustment *)gtk_adjustment_new(0,0,0,0,0,0);
user_data->dlg.v_scrollbar=gtk_vscrollbar_new(user_data->dlg.v_scrollbar_adjustment);
@@ -944,6 +1037,7 @@
window_set_cancel_button(user_data->dlg.window, bt_close, window_cancel_button_cb);
SIGNAL_CONNECT(user_data->dlg.window, "delete_event", window_delete_event_cb, NULL);
+ SIGNAL_CONNECT(user_data->dlg.window, "destroy", on_destroy, user_data);
gtk_widget_show(user_data->dlg.window);
window_present(user_data->dlg.window);
Index: gtk/graph_analysis.h
===================================================================
--- gtk/graph_analysis.h (revision 13505)
+++ gtk/graph_analysis.h (working copy)
@@ -84,7 +84,9 @@
gboolean needs_redraw;
gint selected_row;
GtkWidget *draw_area;
+ GtkWidget *draw_area_comments;
GdkPixmap *pixmap;
+ GdkPixmap *pixmap_comments;
GtkAdjustment *h_scrollbar_adjustment;
GtkWidget *h_scrollbar;
GtkWidget *v_scrollbar;
Index: gtk/voip_calls.c
===================================================================
--- gtk/voip_calls.c (revision 13505)
+++ gtk/voip_calls.c (working copy)
@@ -10,7 +10,7 @@
* Copyright 2004, Iskratel, Ltd, Kranj
* By Miha Jemec <m.jemec@xxxxxxxxxxx>
*
- * H323, RTP and Graph Support
+ * H323, RTP, MGCP and Graph Support
* By Alejandro Vaquero, alejandro.vaquero@xxxxxxxxx
* Copyright 2005, Verso Technologies Inc.
*
@@ -548,10 +548,12 @@
if ((strcmp(pi->request_method,"INVITE")==0)&&(ADDRESSES_EQUAL(&tmp_src,&(strinfo->initial_speaker)))){
tmp_sipinfo->invite_cseq = pi->tap_cseq_number;
+ strinfo->call_state = VOIP_CALL_SETUP;
comment = g_strdup_printf("SIP From: %s To:%s", strinfo->from_identity, strinfo->to_identity);
}
else if ((strcmp(pi->request_method,"ACK")==0)&&(pi->tap_cseq_number == tmp_sipinfo->invite_cseq)
- &&(ADDRESSES_EQUAL(&tmp_src,&(strinfo->initial_speaker)))&&(tmp_sipinfo->sip_state==SIP_200_REC)){
+ &&(ADDRESSES_EQUAL(&tmp_src,&(strinfo->initial_speaker)))&&(tmp_sipinfo->sip_state==SIP_200_REC)
+ &&(strinfo->call_state == VOIP_CALL_SETUP)){
strinfo->call_state = VOIP_IN_CALL;
comment = g_strdup_printf("SIP Request");
}
@@ -1245,19 +1247,18 @@
strinfo->call_state=VOIP_REJECTED;
tapinfo->rejected_calls++;
}
+ } else {
+ strinfo->call_state=VOIP_COMPLETED;
+ tapinfo->completed_calls++;
}
- else {
- strinfo->call_state=VOIP_REJECTED;
- tapinfo->rejected_calls++;
- }
- /* get the Q931 Release cause code */
- if (q931_frame_num == pinfo->fd->num &&
- q931_cause_value != 0xFF){
- comment = g_strdup_printf("H225 Q931 Rel Cause (%i):%s", q931_cause_value, val_to_str(q931_cause_value, q931_cause_code_vals, "<unknown>"));
- } else { /* Cause not set */
- comment = g_strdup("H225 No Q931 Rel Cause");
- }
- break;
+ /* get the Q931 Release cause code */
+ if (q931_frame_num == pinfo->fd->num &&
+ q931_cause_value != 0xFF){
+ comment = g_strdup_printf("H225 Q931 Rel Cause (%i):%s", q931_cause_value, val_to_str(q931_cause_value, q931_cause_code_vals, "<unknown>"));
+ } else { /* Cause not set */
+ comment = g_strdup("H225 No Q931 Rel Cause");
+ }
+ break;
case H225_PROGRESS:
case H225_ALERTING:
case H225_CALL_PROCEDING:
- References:
- [Ethereal-dev] Voip Calls analysis and Graph analysis
- From: Anders Broman
- Re: [Ethereal-dev] Voip Calls analysis and Graph analysis
- From: Lars Roland
- [Ethereal-dev] Voip Calls analysis and Graph analysis
- From: Alejandro Vaquero
- Re: [Ethereal-dev] Voip Calls analysis and Graph analysis
- From: LEGO
- Re: [Ethereal-dev] Voip Calls analysis and Graph analysis
- From: Lars Roland
- Re: [Ethereal-dev] Voip Calls analysis and Graph analysis
- From: Lars Roland
- Re: [Ethereal-dev] Voip Calls analysis and Graph analysis
- From: Alejandro Vaquero
- Re: [Ethereal-dev] Voip Calls analysis and Graph analysis
- From: Alejandro Vaquero
- [Ethereal-dev] Voip Calls analysis and Graph analysis
- Prev by Date: Re: [Ethereal-dev] how to dissect 2 packets
- Next by Date: Re: [Ethereal-dev] VoIP call analysis: ISUP messages listed several times
- Previous by thread: Re: [Ethereal-dev] Voip Calls analysis and Graph analysis
- Next by thread: Re: [Ethereal-dev] Voip Calls analysis and Graph analysis
- Index(es):





