aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2005-07-05 05:16:28 +0000
committerAnders Broman <anders.broman@ericsson.com>2005-07-05 05:16:28 +0000
commitc8b69874cbd0094d5e3bd2daed314c028e36f166 (patch)
tree7c2e14ebe87dbb8e2372da805817079433173a03
parent623f9057c185e938582caa87553a8080f1d2cf86 (diff)
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
-rw-r--r--gtk/graph_analysis.c25
-rw-r--r--gtk/graph_analysis.h1
-rw-r--r--gtk/voip_calls.c38
-rw-r--r--gtk/voip_calls.h3
-rw-r--r--gtk/voip_calls_dlg.c95
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 */
}