diff options
author | Anders Broman <anders.broman@ericsson.com> | 2005-07-05 05:16:28 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2005-07-05 05:16:28 +0000 |
commit | c8b69874cbd0094d5e3bd2daed314c028e36f166 (patch) | |
tree | 7c2e14ebe87dbb8e2372da805817079433173a03 /gtk | |
parent | 623f9057c185e938582caa87553a8080f1d2cf86 (diff) | |
download | wireshark-c8b69874cbd0094d5e3bd2daed314c028e36f166.tar.gz wireshark-c8b69874cbd0094d5e3bd2daed314c028e36f166.tar.bz2 wireshark-c8b69874cbd0094d5e3bd2daed314c028e36f166.zip |
From Alejandro Vaquero
- avoid the clist of the calls dlg to be refreshed multiple times when
first appear.
- destroy the Graph window when the data is not valid anymore.
- fixes an H245 packet count error
- resizing the Graph windows when is displayed (up to 5 columns).
With a change to leave static voip_calls_tapinfo_t the_tapinfo_struct =
{0, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0};
alone.
svn path=/trunk/; revision=14852
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/graph_analysis.c | 25 | ||||
-rw-r--r-- | gtk/graph_analysis.h | 1 | ||||
-rw-r--r-- | gtk/voip_calls.c | 38 | ||||
-rw-r--r-- | gtk/voip_calls.h | 3 | ||||
-rw-r--r-- | gtk/voip_calls_dlg.c | 95 |
5 files changed, 118 insertions, 44 deletions
diff --git a/gtk/graph_analysis.c b/gtk/graph_analysis.c index ddc9202128..7284b31e23 100644 --- a/gtk/graph_analysis.c +++ b/gtk/graph_analysis.c @@ -1421,7 +1421,6 @@ static void create_draw_area(graph_analysis_data_t* user_data, GtkWidget *box) { GtkWidget *vbox; GtkWidget *hbox; - GtkWidget *scroll_window; GtkWidget *viewport; GtkWidget *scroll_window_comments; GtkWidget *viewport_comments; @@ -1457,12 +1456,15 @@ static void create_draw_area(graph_analysis_data_t* user_data, GtkWidget *box) user_data->dlg.draw_area=gtk_drawing_area_new(); user_data->dlg.pixmap_width = user_data->num_nodes * NODE_WIDTH; WIDGET_SET_SIZE(user_data->dlg.draw_area, user_data->dlg.pixmap_width, user_data->dlg.pixmap_height); - scroll_window=gtk_scrolled_window_new(NULL, NULL); - WIDGET_SET_SIZE(scroll_window, NODE_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))); + user_data->dlg.scroll_window=gtk_scrolled_window_new(NULL, NULL); + if ( user_data->num_nodes < 6) + WIDGET_SET_SIZE(user_data->dlg.scroll_window, NODE_WIDTH*user_data->num_nodes, user_data->dlg.pixmap_height); + else + WIDGET_SET_SIZE(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.pixmap_height); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER); + viewport = gtk_viewport_new(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window)), gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(user_data->dlg.scroll_window))); gtk_container_add(GTK_CONTAINER(viewport), user_data->dlg.draw_area); - gtk_container_add(GTK_CONTAINER(scroll_window), viewport); + gtk_container_add(GTK_CONTAINER(user_data->dlg.scroll_window), viewport); gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE); OBJECT_SET_DATA(user_data->dlg.draw_area, "graph_analysis_data_t", user_data); GTK_WIDGET_SET_FLAGS(user_data->dlg.draw_area, GTK_CAN_FOCUS); @@ -1493,13 +1495,13 @@ static void create_draw_area(graph_analysis_data_t* user_data, GtkWidget *box) gtk_widget_show(user_data->dlg.draw_area_comments); gtk_widget_show(viewport_comments); - gtk_widget_show(scroll_window); + gtk_widget_show(user_data->dlg.scroll_window); gtk_widget_show(scroll_window_comments); gtk_box_pack_start(GTK_BOX(hbox), user_data->dlg.draw_area_time, FALSE, FALSE, 0); user_data->dlg.hpane = gtk_hpaned_new(); - gtk_paned_pack1(GTK_PANED (user_data->dlg.hpane), scroll_window, TRUE, TRUE); + gtk_paned_pack1(GTK_PANED (user_data->dlg.hpane), user_data->dlg.scroll_window, TRUE, TRUE); gtk_paned_pack2(GTK_PANED (user_data->dlg.hpane), scroll_window_comments, FALSE, TRUE); #if GTK_MAJOR_VERSION >= 2 SIGNAL_CONNECT(user_data->dlg.hpane, "notify::position", pane_callback, user_data); @@ -1671,6 +1673,13 @@ void graph_analysis_update(graph_analysis_data_t* user_data) /* get nodes (each node is an address) */ get_nodes(user_data); + user_data->dlg.pixmap_width = user_data->num_nodes * NODE_WIDTH; + WIDGET_SET_SIZE(user_data->dlg.draw_area, user_data->dlg.pixmap_width, user_data->dlg.pixmap_height); + if ( user_data->num_nodes < 6) + WIDGET_SET_SIZE(user_data->dlg.scroll_window, NODE_WIDTH*user_data->num_nodes, user_data->dlg.pixmap_height); + else + WIDGET_SET_SIZE(user_data->dlg.scroll_window, NODE_WIDTH*5, user_data->dlg.pixmap_height); + /* redraw the graph */ dialog_graph_redraw(user_data); diff --git a/gtk/graph_analysis.h b/gtk/graph_analysis.h index 684dbfe934..d8abdaff04 100644 --- a/gtk/graph_analysis.h +++ b/gtk/graph_analysis.h @@ -89,6 +89,7 @@ typedef struct _dialog_data_t { GdkPixmap *pixmap_time; GdkPixmap *pixmap; GdkPixmap *pixmap_comments; + GtkWidget *scroll_window; GtkWidget *v_scrollbar; GtkAdjustment *v_scrollbar_adjustment; GtkWidget *hpane; diff --git a/gtk/voip_calls.c b/gtk/voip_calls.c index e2a132e396..b9376e58b3 100644 --- a/gtk/voip_calls.c +++ b/gtk/voip_calls.c @@ -197,8 +197,6 @@ int add_to_graph(voip_calls_tapinfo_t *tapinfo _U_, packet_info *pinfo, const gc gai = g_malloc(sizeof(graph_analysis_item_t)); gai->frame_num = pinfo->fd->num; gai->time= (double)pinfo->fd->rel_secs + (double) pinfo->fd->rel_usecs/1000000; -/* COPY_ADDRESS(&(gai->src_addr),&(pinfo->src)); - COPY_ADDRESS(&(gai->dst_addr),&(pinfo->dst));*/ COPY_ADDRESS(&(gai->src_addr),src_addr); COPY_ADDRESS(&(gai->dst_addr),dst_addr); @@ -494,6 +492,9 @@ RTP_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const vo strinfo->stop_rel_sec = pinfo->fd->rel_secs; strinfo->stop_rel_usec = pinfo->fd->rel_usecs; } + + the_tapinfo_struct.redraw = TRUE; + return 1; } @@ -750,12 +751,15 @@ SIPcalls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, con sdp_summary = NULL; } } + + tapinfo->redraw = TRUE; + return 1; /* refresh output */ } /****************************************************************************/ -const voip_calls_tapinfo_t* voip_calls_get_info(void) +voip_calls_tapinfo_t* voip_calls_get_info(void) { return &the_tapinfo_struct; } @@ -991,10 +995,9 @@ isup_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co g_free(frame_label); } + tapinfo->redraw = TRUE; - - - return 1; + return 1; /* refresh output */ } /****************************************************************************/ @@ -1273,6 +1276,9 @@ q931_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co if (!append_to_frame_graph(tapinfo, q931_frame_num, "", comment)) { /* if not exist, add to the graph */ add_to_graph(tapinfo, pinfo, "", comment, tmp_listinfo->call_num, &(pinfo->src), &(pinfo->dst)); + ++(tmp_listinfo->npackets); + /* increment the packets counter of all calls */ + ++(tapinfo->npackets); } /* Add the H245 info if exists to the Graph */ @@ -1380,7 +1386,9 @@ q931_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co g_free((char *)pstn_add.data); } - return 0; + tapinfo->redraw = TRUE; + + return 1; /* refresh output */ } /****************************************************************************/ @@ -1652,6 +1660,8 @@ H225calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, con } + tapinfo->redraw = TRUE; + return 1; /* refresh output */ } @@ -1804,6 +1814,9 @@ H245dgcalls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, c /* Tunnel is OFF, and we matched the h245 add so we add it to graph */ if (strinfo!=NULL){ + ++(strinfo->npackets); + /* increment the packets counter of all calls */ + ++(tapinfo->npackets); frame_label = g_strdup(pi->frame_label); comment = g_strdup(pi->comment); /* if the frame number exists in graph, append to it*/ @@ -1821,6 +1834,8 @@ H245dgcalls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, c h245_add_label(pinfo->fd->num, (gchar *) pi->frame_label, (gchar *) pi->comment); } + tapinfo->redraw = TRUE; + return 1; /* refresh output */ } @@ -1890,6 +1905,8 @@ SDPcalls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, cons sdp_summary = g_strdup_printf("SDP (%s)", pi->summary_str); append_to_frame_graph(tapinfo, pinfo->fd->num, sdp_summary, NULL); + tapinfo->redraw = TRUE; + return 1; /* refresh output */ } @@ -2257,6 +2274,8 @@ MGCPcalls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co sdp_summary = NULL; } + tapinfo->redraw = TRUE; + return 1; /* refresh output */ } @@ -2391,6 +2410,9 @@ ACTRACEcalls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, g_free(comment); g_free((char *)pstn_add.data); } + + tapinfo->redraw = TRUE; + return 1; /* refresh output */ } @@ -2459,6 +2481,8 @@ prot_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co ++(tapinfo->npackets); } + tapinfo->redraw = TRUE; + return 1; } */ diff --git a/gtk/voip_calls.h b/gtk/voip_calls.h index 940e9d6485..2b23860871 100644 --- a/gtk/voip_calls.h +++ b/gtk/voip_calls.h @@ -160,6 +160,7 @@ typedef struct _voip_calls_tapinfo { int completed_calls; int rejected_calls; graph_analysis_info_t* graph_analysis; + gboolean redraw; /* * Now add dummy variables, one for each tap listener. * Their address will be used to distinguish between them. @@ -249,7 +250,7 @@ void remove_tap_listener_actrace_calls(void); * Retrieves a constant reference to the unique info structure of the voip_calls tap listener. * The user should not modify the data pointed to. */ -const voip_calls_tapinfo_t* voip_calls_get_info(void); +voip_calls_tapinfo_t* voip_calls_get_info(void); /* * Cleans up memory of voip calls tap. diff --git a/gtk/voip_calls_dlg.c b/gtk/voip_calls_dlg.c index ffdad92495..ca1c1fa91c 100644 --- a/gtk/voip_calls_dlg.c +++ b/gtk/voip_calls_dlg.c @@ -89,9 +89,11 @@ static GList *last_list = NULL; static guint32 calls_nb = 0; /* number of displayed calls */ static guint32 calls_ns = 0; /* number of selected calls */ -static graph_analysis_data_t *graph_analysis_data; +static graph_analysis_data_t *graph_analysis_data = NULL; #define NUM_COLS 9 +static const GdkColor COLOR_SELECT = {0, 0x00ff, 0x80ff, 0x80ff}; +static const GdkColor COLOR_DEFAULT = {0, 0xffff, 0xffff, 0xffff}; /****************************************************************************/ /* append a line to clist */ @@ -105,10 +107,12 @@ static void add_to_clist(voip_calls_info_t* strinfo) isup_calls_info_t *tmp_isupinfo; h323_calls_info_t *tmp_h323info; gboolean tmp_bool = FALSE; + GdkColor color = COLOR_SELECT; for (c=0;c<NUM_COLS;c++){ data[c]=&field[c][0]; } +/* strinfo->selected = FALSE;*/ g_snprintf(field[0], 15, "%i.%2i", strinfo->start_sec, strinfo->start_usec/10000); g_snprintf(field[1], 15, "%i.%2i", strinfo->stop_sec, strinfo->stop_usec/10000); @@ -144,6 +148,12 @@ static void add_to_clist(voip_calls_info_t* strinfo) added_row = gtk_clist_append(GTK_CLIST(clist), data); + /* set the background color if selected */ + if (strinfo->selected) { + calls_ns++; + gtk_clist_set_background(GTK_CLIST(clist), added_row, &color); + } + /* set data pointer of last row to point to user data for that row */ gtk_clist_set_row_data(GTK_CLIST(clist), added_row, strinfo); @@ -197,10 +207,12 @@ voip_calls_on_destroy (GtkObject *object _U_, voip_calls_remove_tap_listener(); /* Clean up memory used by calls tap */ - voip_calls_reset((voip_calls_tapinfo_t*) voip_calls_get_info()); + voip_calls_dlg_reset(NULL); /* Note that we no longer have a "VoIP Calls" dialog box. */ voip_calls_dlg = NULL; + + graph_analysis_data = NULL; } @@ -379,9 +391,6 @@ on_graph_bt_clicked (GtkButton *button _U_, graph_analysis_update(graph_analysis_data); /* refresh it */ } -static const GdkColor COLOR_SELECT = {0, 0x00ff, 0x80ff, 0x80ff}; -static const GdkColor COLOR_DEFAULT = {0, 0xffff, 0xffff, 0xffff}; - /****************************************************************************/ /* when the user selects a row in the calls list */ static void @@ -396,6 +405,9 @@ voip_calls_on_select_row(GtkCList *clist, selected_call_fwd = gtk_clist_get_row_data(GTK_CLIST(clist), row); + if (selected_call_fwd==NULL) + return; + if (!selected_call_fwd->selected) calls_ns++; else @@ -424,10 +436,14 @@ voip_calls_on_select_row(GtkCList *clist, color = COLOR_DEFAULT; gtk_clist_set_background(GTK_CLIST(clist), row, &color); - - /*gtk_widget_set_sensitive(bt_unselect, TRUE);*/ - gtk_widget_set_sensitive(bt_filter, TRUE); - gtk_widget_set_sensitive(bt_graph, TRUE); + + if (calls_ns > 0) { + gtk_widget_set_sensitive(bt_filter, TRUE); + gtk_widget_set_sensitive(bt_graph, TRUE); + } else { + gtk_widget_set_sensitive(bt_filter, FALSE); + gtk_widget_set_sensitive(bt_graph, FALSE); + } /* TODO: activate other buttons when implemented */ } @@ -665,26 +681,27 @@ static void voip_calls_dlg_create (void) void voip_calls_dlg_update(GList *list) { gchar label_text[256]; -guint foo; if (voip_calls_dlg != NULL) { - gtk_clist_clear(GTK_CLIST(clist)); calls_nb = 0; calls_ns = 0; - g_snprintf(label_text, 256, - "Total: Calls: %d Start packets: %d Completed calls: %d Rejected calls: %d", - g_list_length(voip_calls_get_info()->strinfo_list), - voip_calls_get_info()->start_packets, - voip_calls_get_info()->completed_calls, - voip_calls_get_info()->rejected_calls); - gtk_label_set(GTK_LABEL(status_label), label_text); - foo= g_list_length(list); + g_snprintf(label_text, 256, + "Total: Calls: %d Start packets: %d Completed calls: %d Rejected calls: %d", + g_list_length(voip_calls_get_info()->strinfo_list), + voip_calls_get_info()->start_packets, + voip_calls_get_info()->completed_calls, + voip_calls_get_info()->rejected_calls); + gtk_label_set(GTK_LABEL(status_label), label_text); + + gtk_clist_freeze(GTK_CLIST(clist)); + gtk_clist_clear(GTK_CLIST(clist)); list = g_list_first(list); while (list) { add_to_clist((voip_calls_info_t*)(list->data)); list = g_list_next(list); } + gtk_clist_thaw(GTK_CLIST(clist)); g_snprintf(label_text, 256, "Detected %d VoIP %s. Selected %d %s.", @@ -693,8 +710,6 @@ guint foo; calls_ns, plurality(calls_ns, "Call", "Calls")); gtk_label_set(GTK_LABEL(top_label), label_text); - - voip_calls_on_unselect(NULL, NULL); } last_list = list; @@ -705,7 +720,10 @@ guint foo; /* draw function for tap listeners to keep the window up to date */ void voip_calls_dlg_draw(void *ptr _U_) { - voip_calls_dlg_update(voip_calls_get_info()->strinfo_list); + if (voip_calls_get_info()->redraw) { + voip_calls_dlg_update(voip_calls_get_info()->strinfo_list); + voip_calls_get_info()->redraw = FALSE; + } } /* reset function for tap listeners to clear window, if necessary */ @@ -713,13 +731,28 @@ void voip_calls_dlg_reset(void *ptr _U_) { /* Clean up memory used by calls tap */ voip_calls_reset((voip_calls_tapinfo_t*) voip_calls_get_info()); + + /* close the graph window if open */ + if (graph_analysis_data->dlg.window != NULL) { + window_cancel_button_cb(NULL, graph_analysis_data->dlg.window); + graph_analysis_data->dlg.window = NULL; + } } /* init function for tap */ static void voip_calls_init_tap(char *dummy _U_) { - graph_analysis_data_init(); + gint c; + gchar *data[NUM_COLS]; + gchar field[NUM_COLS][50]; + + if (graph_analysis_data == NULL) { + graph_analysis_data_init(); + /* init the Graph Analysys */ + graph_analysis_data = graph_analysis_init(); + graph_analysis_data->graph_info = voip_calls_get_info()->graph_analysis; + } /* Clean up memory used by calls tap */ voip_calls_reset((voip_calls_tapinfo_t*) voip_calls_get_info()); @@ -739,10 +772,6 @@ voip_calls_init_tap(char *dummy _U_) mgcp_calls_init_tap(); } actrace_calls_init_tap(); - - /* init the Graph Analysys */ - graph_analysis_data = graph_analysis_init(); - graph_analysis_data->graph_info = voip_calls_get_info()->graph_analysis; /* create dialog box if necessary */ if (voip_calls_dlg == NULL) { @@ -751,10 +780,20 @@ voip_calls_init_tap(char *dummy _U_) /* There's already a dialog box; reactivate it. */ reactivate_window(voip_calls_dlg); } + + voip_calls_get_info()->redraw = TRUE; + voip_calls_dlg_draw(NULL); + voip_calls_get_info()->redraw = TRUE; + for (c=0;c<NUM_COLS;c++){ + data[c]=&field[c][0]; + field[c][0] = NULL; + } + g_snprintf(field[3], 50, "Please wait..."); + gtk_clist_append(GTK_CLIST(clist), data); /* Scan for VoIP calls calls (redissect all packets) */ cf_retap_packets(&cfile); - + /* Tap listener will be removed and cleaned up in voip_calls_on_destroy */ } |