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
This commit is contained in:
parent
623f9057c1
commit
c8b69874cb
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 */
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue