diff options
author | jake <jake@f5534014-38df-0310-8fa8-9805f1628bb7> | 2010-03-19 22:06:48 +0000 |
---|---|---|
committer | jake <jake@f5534014-38df-0310-8fa8-9805f1628bb7> | 2010-03-19 22:06:48 +0000 |
commit | de9af5b71247f76430bca408854ba46bc2492199 (patch) | |
tree | a7475db5745cd57200877d01202613138c7849a8 /gtk | |
parent | b24ff6104550eb8e6e107a7445ddbc84410ee07e (diff) |
Replace GtkCList by GtkTreeView.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@32248 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/voip_calls_dlg.c | 1176 |
1 files changed, 450 insertions, 726 deletions
diff --git a/gtk/voip_calls_dlg.c b/gtk/voip_calls_dlg.c index 80902f8f8d..6faad5dc00 100644 --- a/gtk/voip_calls_dlg.c +++ b/gtk/voip_calls_dlg.c @@ -66,8 +66,6 @@ #include "gtk/gtkglobals.h" #include "gtk/stock_icons.h" -#include "image/clist_ascend.xpm" -#include "image/clist_descend.xpm" #include "simple_dialog.h" #ifdef HAVE_LIBPORTAUDIO @@ -80,7 +78,10 @@ /* pointer to the one and only dialog window */ static GtkWidget *voip_calls_dlg = NULL; -static GtkWidget *clist = NULL; +static GtkListStore *list_store = NULL; +static GtkTreeIter list_iter; +static GtkWidget *list = NULL; + static GtkWidget *top_label = NULL; static GtkWidget *status_label = NULL; @@ -91,9 +92,6 @@ static GtkWidget *bt_graph = NULL; static GtkWidget *bt_player = NULL; #endif /* HAVE_LIBPORTAUDIO */ -static voip_calls_info_t* selected_call_fwd = NULL; /* current selection */ -static GList *last_list = NULL; - static guint32 calls_nb = 0; /* number of displayed calls */ static guint32 calls_ns = 0; /* number of selected calls */ @@ -110,103 +108,14 @@ enum CALL_COL_PACKETS, CALL_COL_STATE, CALL_COL_COMMENTS, + CALL_COL_DATA, NUM_COLS /* The number of columns */ }; -static const GdkColor COLOR_SELECT = {0, 0x00ff, 0x80ff, 0x80ff}; -static const GdkColor COLOR_DEFAULT = {0, 0xffff, 0xffff, 0xffff}; -static const GdkColor COLOR_FOREGROUND = {0, 0x0000, 0x0000, 0x0000}; - -/****************************************************************************/ -/* append a line to clist */ -static void add_to_clist(voip_calls_info_t* strinfo) -{ - gchar label_text[256]; - gint added_row; - gchar *data[NUM_COLS]; - gchar field[NUM_COLS][50]; - gint c; - isup_calls_info_t *tmp_isupinfo; - h323_calls_info_t *tmp_h323info; - gboolean tmp_bool = FALSE; - GdkColor bg_color = COLOR_SELECT; - GdkColor fg_color = COLOR_FOREGROUND; - for (c=0;c<NUM_COLS;c++){ - data[c]=&field[c][0]; - } - -/* strinfo->selected = FALSE;*/ - - g_snprintf(field[CALL_COL_START_TIME], 15, "%.3f", nstime_to_sec(&strinfo->start_rel)); - g_snprintf(field[CALL_COL_STOP_TIME], 15, "%3f", nstime_to_sec(&strinfo->stop_rel)); -/* XXX display_signed_time(data[0], sizeof(field[CALL_COL_START_TIME]), strinfo->start_rel.secs, strinfo->start_rel.nsecs, TO_STR_TIME_RES_T_NSECS); */ -/* display_signed_time(data[1], sizeof(field[CALL_COL_STOP_TIME]), strinfo->stop_rel.secs, strinfo->stop_rel.nsecs, TO_STR_TIME_RES_T_NSECS); */ - g_snprintf(field[CALL_COL_INITIAL_SPEAKER], 30, "%s", get_addr_name(&(strinfo->initial_speaker))); - g_snprintf(field[CALL_COL_FROM], 50, "%s", strinfo->from_identity); - g_snprintf(field[CALL_COL_TO], 50, "%s", strinfo->to_identity); - g_snprintf(field[CALL_COL_PROTOCOL], 15, "%s", ((strinfo->protocol==VOIP_COMMON)&&strinfo->protocol_name)?strinfo->protocol_name:voip_protocol_name[strinfo->protocol]); - g_snprintf(field[CALL_COL_PACKETS], 15, "%u", strinfo->npackets); - g_snprintf(field[CALL_COL_STATE], 15, "%s", voip_call_state_name[strinfo->call_state]); - - /* Add comments based on the protocol */ - switch(strinfo->protocol){ - case VOIP_ISUP: - tmp_isupinfo = strinfo->prot_info; - g_snprintf(field[CALL_COL_COMMENTS],30, "%i-%i -> %i-%i", tmp_isupinfo->ni, tmp_isupinfo->opc, - tmp_isupinfo->ni, tmp_isupinfo->dpc); - break; - case VOIP_H323: - tmp_h323info = strinfo->prot_info; - if (strinfo->call_state == VOIP_CALL_SETUP) - tmp_bool = tmp_h323info->is_faststart_Setup; - else - if ((tmp_h323info->is_faststart_Setup == TRUE) && (tmp_h323info->is_faststart_Proc == TRUE)) tmp_bool = TRUE; - g_snprintf(field[CALL_COL_COMMENTS],35, "Tunneling: %s Fast Start: %s", (tmp_h323info->is_h245Tunneling==TRUE?"ON":"OFF"), - (tmp_bool==TRUE?"ON":"OFF")); - break; - case VOIP_COMMON: - field[CALL_COL_COMMENTS][0]='\0'; - if (strinfo->call_comment) - g_snprintf(field[CALL_COL_COMMENTS],30, "%s", strinfo->call_comment); - break; - default: - field[CALL_COL_COMMENTS][0]='\0'; - } - - - 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, &bg_color); - gtk_clist_set_foreground(GTK_CLIST(clist), added_row, &fg_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); - - /* Update the top label with the number of detected calls */ - calls_nb++; - g_snprintf(label_text, 256, - "Detected %d VoIP %s. Selected %d %s.", - calls_nb, - plurality(calls_nb, "Call", "Calls"), - calls_ns, - plurality(calls_ns, "Call", "Calls")); - gtk_label_set_text(GTK_LABEL(top_label), label_text); - - /* Update the status label with the number of total messages */ - g_snprintf(label_text, 256, - "Total: Calls: %d Start packets: %d Completed calls: %d Rejected calls: %d", - g_list_length(voip_calls_get_info()->callsinfo_list), - voip_calls_get_info()->start_packets, - voip_calls_get_info()->completed_calls, - voip_calls_get_info()->rejected_calls); - gtk_label_set_text(GTK_LABEL(status_label), label_text); -} -static void voip_calls_remove_tap_listener(void) +/****************************************************************************/ +static void +voip_calls_remove_tap_listener(void) { /* Remove the calls tap listener */ remove_tap_listener_sip_calls(); @@ -219,7 +128,7 @@ static void voip_calls_remove_tap_listener(void) remove_tap_listener_sccp_calls(); remove_tap_listener_sdp_calls(); remove_tap_listener_rtp(); - if (find_tap_id("unistim")) { + if (find_tap_id("unistim")) { /* The plugin may be missing */ remove_tap_listener_unistim_calls(); } if (find_tap_id("voip")) { @@ -228,7 +137,6 @@ static void voip_calls_remove_tap_listener(void) remove_tap_listener_rtp_event(); remove_tap_listener_mgcp_calls(); remove_tap_listener_actrace_calls(); - remove_tap_listener_t38(); remove_tap_listener_skinny_calls(); remove_tap_listener_iax2_calls(); } @@ -237,8 +145,7 @@ static void voip_calls_remove_tap_listener(void) /* CALLBACKS */ /****************************************************************************/ static void -voip_calls_on_destroy (GtkObject *object _U_, - gpointer user_data _U_) +voip_calls_on_destroy(GtkObject *object _U_, gpointer user_data _U_) { /* remove_tap_listeners */ voip_calls_remove_tap_listener(); @@ -249,19 +156,15 @@ voip_calls_on_destroy (GtkObject *object _U_, /* Note that we no longer have a "VoIP Calls" dialog box. */ voip_calls_dlg = NULL; + /* Clean up graph analysis memory */ + g_free(graph_analysis_data); graph_analysis_data = NULL; } - /****************************************************************************/ static void -voip_calls_on_unselect (GtkButton *button _U_, - gpointer user_data _U_) +voip_calls_on_unselect(GtkButton *button _U_, gpointer user_data _U_) { - selected_call_fwd = NULL; - gtk_clist_unselect_all(GTK_CLIST(clist)); -/* gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT); -*/ /*gtk_widget_set_sensitive(bt_unselect, FALSE);*/ gtk_widget_set_sensitive(bt_filter, FALSE); gtk_widget_set_sensitive(bt_graph, FALSE); @@ -270,172 +173,173 @@ voip_calls_on_unselect (GtkButton *button _U_, #endif /* HAVE_LIBPORTAUDIO */ } - /****************************************************************************/ static void -voip_calls_on_filter (GtkButton *button _U_, - gpointer user_data _U_) +voip_calls_on_filter(GtkButton *button _U_, gpointer user_data _U_) { - const gchar *filter_string; - gchar c; + gchar *filter_string; GString *filter_string_fwd; const gchar *filter_prepend; - gboolean isFirst = TRUE; + gboolean is_first = TRUE; GList* list; - size_t filter_length = 0; - size_t max_filter_length = 2048; - sip_calls_info_t *tmp_sipinfo; - isup_calls_info_t *tmp_isupinfo; - h323_calls_info_t *tmp_h323info; - h245_address_t *h245_add = NULL; + GList* list2; + voip_calls_info_t *listinfo; + graph_analysis_item_t *gai; + size_t filter_length; + size_t max_filter_length = 2048; /* What's this based on ? */ int pos; - graph_analysis_item_t *gai; + const sip_calls_info_t *sipinfo; + const isup_calls_info_t *isupinfo; + const h323_calls_info_t *h323info; + const h245_address_t *h245_add = NULL; + const gcp_ctx_t* ctx; - if (selected_call_fwd==NULL) - return; + filter_string = g_strdup(gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget))); + pos = filter_length = strlen(filter_string); + g_strstrip(filter_string); - filter_string=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget)); /* sets 'position' of the entry widget to 0 ? */ - filter_length = strlen(filter_string); - pos = (int)filter_length; /* remember for later insert (ie: append */ + if (strlen(filter_string) > 0) + filter_prepend = " or "; + else + filter_prepend = ""; + g_free(filter_string); - filter_prepend = ""; - while ((c = *filter_string++) != '\0') { - if (!isspace((guchar)c)) { - /* The filter string isn't blank, so there's already - an expression; we OR in the new expression */ - filter_prepend = " or "; - break; - } - } - filter_string_fwd = g_string_new(filter_prepend); - + /* look in the Graph and get all the frame_num for this call */ - g_string_append_printf(filter_string_fwd, " ("); - list = g_list_first(voip_calls_get_info()->graph_analysis->list); - while (list) - { - gai = list->data; - if (gai->conv_num == selected_call_fwd->call_num){ - g_string_append_printf(filter_string_fwd,"%sframe.number == %d", isFirst?"":" or ", gai->frame_num ); - isFirst = FALSE; - } - list = g_list_next (list); + g_string_append_printf(filter_string_fwd, "("); + + /* Build a new filter based on frame numbers */ + list = g_list_first(voip_calls_get_info()->callsinfo_list); + while (list) { + listinfo = list->data; + if (listinfo->selected) { + list2 = g_list_first(voip_calls_get_info()->graph_analysis->list); + while (list2) { + gai = list2->data; + if (gai->conv_num == listinfo->call_num) { + g_string_append_printf(filter_string_fwd, "%sframe.number == %u", is_first?"":" or ", gai->frame_num); + is_first = FALSE; + } + list2 = g_list_next(list2); + } + } + list = g_list_next(list); } - g_string_append_printf(filter_string_fwd, ") "); - filter_length = filter_length + filter_string_fwd->len; - if (filter_length < max_filter_length){ + g_string_append_printf(filter_string_fwd, ")"); + filter_length += filter_string_fwd->len; + + if (filter_length < max_filter_length) { gtk_editable_insert_text(GTK_EDITABLE(main_display_filter_widget), filter_string_fwd->str, -1, &pos); } else { g_string_free(filter_string_fwd, TRUE); filter_string_fwd = g_string_new(filter_prepend); - switch(selected_call_fwd->protocol){ - case VOIP_SIP: - tmp_sipinfo = selected_call_fwd->prot_info; - g_string_append_printf(filter_string_fwd, - "(sip.Call-ID == \"%s\") ", - tmp_sipinfo->call_identifier - ); - gtk_editable_insert_text(GTK_EDITABLE(main_display_filter_widget), filter_string_fwd->str, -1, &pos); - break; - case VOIP_ISUP: - tmp_isupinfo = selected_call_fwd->prot_info; - g_string_append_printf(filter_string_fwd, - "(isup.cic == %i and frame.number >=%i and frame.number<=%i and mtp3.network_indicator == %i and ((mtp3.dpc == %i) and (mtp3.opc == %i)) or((mtp3.dpc == %i) and (mtp3.opc == %i))) ", - tmp_isupinfo->cic,selected_call_fwd->first_frame_num, - selected_call_fwd->last_frame_num, - tmp_isupinfo->ni, tmp_isupinfo->dpc, tmp_isupinfo->opc, - tmp_isupinfo->opc, tmp_isupinfo->dpc - ); - gtk_editable_insert_text(GTK_EDITABLE(main_display_filter_widget), filter_string_fwd->str, -1, &pos); - break; - case VOIP_H323: - tmp_h323info = selected_call_fwd->prot_info; - g_string_append_printf(filter_string_fwd, - "((h225.guid == %s || q931.call_ref == %x:%x || q931.call_ref == %x:%x) ", - guid_to_str(&tmp_h323info->guid[0]), - (guint8)(tmp_h323info->q931_crv & 0xff), - (guint8)((tmp_h323info->q931_crv & 0xff00)>>8), - (guint8)(tmp_h323info->q931_crv2 & 0xff), - (guint8)((tmp_h323info->q931_crv2 & 0xff00)>>8)); - list = g_list_first(tmp_h323info->h245_list); - while (list) - { - h245_add=list->data; + g_string_append_printf(filter_string_fwd, "("); + is_first = TRUE; + /* Build a new filter based on protocol fields */ + list = g_list_first(voip_calls_get_info()->callsinfo_list); + while (list) { + listinfo = list->data; + if (listinfo->selected) { + if (!is_first) + g_string_append_printf(filter_string_fwd, " or "); + switch (listinfo->protocol) { + case VOIP_SIP: + sipinfo = listinfo->prot_info; + g_string_append_printf(filter_string_fwd, + "(sip.Call-ID == \"%s\")", + sipinfo->call_identifier + ); + break; + case VOIP_ISUP: + isupinfo = listinfo->prot_info; + g_string_append_printf(filter_string_fwd, + "(isup.cic == %i and frame.number >= %i and frame.number <= %i and mtp3.network_indicator == %i and ((mtp3.dpc == %i) and (mtp3.opc == %i)) or ((mtp3.dpc == %i) and (mtp3.opc == %i)))", + isupinfo->cic, listinfo->first_frame_num, + listinfo->last_frame_num, + isupinfo->ni, isupinfo->dpc, isupinfo->opc, + isupinfo->opc, isupinfo->dpc + ); + break; + case VOIP_H323: + h323info = listinfo->prot_info; + g_string_append_printf(filter_string_fwd, + "((h225.guid == %s || q931.call_ref == %x:%x || q931.call_ref == %x:%x)", + guid_to_str(&h323info->guid[0]), + (guint8) (h323info->q931_crv & 0x00ff), + (guint8)((h323info->q931_crv & 0xff00)>>8), + (guint8) (h323info->q931_crv2 & 0x00ff), + (guint8)((h323info->q931_crv2 & 0xff00)>>8)); + list2 = g_list_first(h323info->h245_list); + while (list2) { + h245_add = list2->data; + g_string_append_printf(filter_string_fwd, + " || (ip.addr == %s && tcp.port == %d && h245)", + ip_to_str((guint8 *)&(h245_add->h245_address)), h245_add->h245_port); + list2 = g_list_next(list2); + } + g_string_append_printf(filter_string_fwd, ")"); + break; + case TEL_H248: + ctx = listinfo->prot_info; g_string_append_printf(filter_string_fwd, - " || (ip.addr == %s && tcp.port == %d && h245) ", - ip_to_str((guint8 *)&(h245_add->h245_address)), h245_add->h245_port); - list = g_list_next(list); + "(h248.ctx == 0x%x)", ctx->id); + break; + default: + /* placeholder to assure valid display filter expression */ + g_string_append_printf(filter_string_fwd, + "(frame)"); + break; } - g_string_append_printf(filter_string_fwd, ") "); - gtk_editable_insert_text(GTK_EDITABLE(main_display_filter_widget), filter_string_fwd->str, -1, &pos); - break; - case TEL_H248: { - const gcp_ctx_t* ctx = selected_call_fwd->prot_info; - gtk_editable_insert_text(GTK_EDITABLE(main_display_filter_widget), - ep_strdup_printf("h248.ctx == 0x%x", ctx->id ), -1, &pos); - break; + is_first = FALSE; } - case TEL_SCCP: - case VOIP_MGCP: - case VOIP_AC_ISDN: - case VOIP_AC_CAS: - case MEDIA_T38: - case TEL_BSSMAP: - case TEL_RANAP: - case VOIP_UNISTIM: - case VOIP_SKINNY: - case VOIP_IAX2: - case VOIP_COMMON: - /* XXX - not supported */ - break; + list = g_list_next(list); } - + + g_string_append_printf(filter_string_fwd, ")"); + gtk_editable_insert_text(GTK_EDITABLE(main_display_filter_widget), filter_string_fwd->str, -1, &pos); } - + g_string_free(filter_string_fwd, TRUE); } - /****************************************************************************/ static void -voip_calls_on_select_all (GtkButton *button _U_, - gpointer user_data _U_) +voip_calls_on_select_all(GtkButton *button _U_, gpointer user_data _U_) { - gtk_clist_select_all(GTK_CLIST(clist)); + GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); + gtk_tree_selection_select_all(selection); } /****************************************************************************/ static void -on_graph_bt_clicked (GtkButton *button _U_, - gpointer user_data _U_) +on_graph_bt_clicked(GtkButton *button _U_, gpointer user_data _U_) { graph_analysis_item_t *gai; GList* list; GList* list2; - voip_calls_info_t *tmp_listinfo; + voip_calls_info_t *listinfo; /* reset the "display" parameter in graph analysis */ list2 = g_list_first(voip_calls_get_info()->graph_analysis->list); - while (list2){ + while (list2) { gai = list2->data; gai->display = FALSE; list2 = g_list_next(list2); } - /* set the display for selected calls */ list = g_list_first(voip_calls_get_info()->callsinfo_list); - while (list){ - tmp_listinfo=list->data; - if (tmp_listinfo->selected){ + while (list) { + listinfo = list->data; + if (listinfo->selected) { list2 = g_list_first(voip_calls_get_info()->graph_analysis->list); - while (list2){ + while (list2) { gai = list2->data; - if (gai->conv_num == tmp_listinfo->call_num){ + if (gai->conv_num == listinfo->call_num) { gai->display = TRUE; } list2 = g_list_next(list2); @@ -445,17 +349,16 @@ on_graph_bt_clicked (GtkButton *button _U_, } /* create or refresh the graph windows */ - if (graph_analysis_data->dlg.window == NULL) /* create the window */ - graph_analysis_create(graph_analysis_data); + if (graph_analysis_data->dlg.window == NULL) + graph_analysis_create(graph_analysis_data); /* create the window */ else - graph_analysis_update(graph_analysis_data); /* refresh it */ + graph_analysis_update(graph_analysis_data); /* refresh it */ } -#ifdef HAVE_LIBPORTAUDIO /****************************************************************************/ +#ifdef HAVE_LIBPORTAUDIO static void -on_player_bt_clicked (GtkButton *button _U_, - gpointer user_data _U_) +on_player_bt_clicked(GtkButton *button _U_, gpointer user_data _U_) { rtp_player_init(voip_calls_get_info()); } @@ -463,407 +366,308 @@ on_player_bt_clicked (GtkButton *button _U_, /****************************************************************************/ /* when the user selects a row in the calls list */ -static void -voip_calls_on_select_row(GtkCList *clist_lcl, - gint row _U_, - gint column _U_, - GdkEventButton *event _U_, - gpointer user_data _U_) +static gboolean +voip_calls_mark_selected(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter, gpointer data) { -/* GdkColor color = COLOR_DEFAULT;*/ - gchar label_text[80]; - GList* list; - voip_calls_info_t *listinfo; - - selected_call_fwd = gtk_clist_get_row_data(GTK_CLIST(clist_lcl), row); - - if (selected_call_fwd==NULL) - return; - - selected_call_fwd->selected=TRUE; - - /* count the selected calls */ - calls_ns = 0; - list = g_list_first(voip_calls_get_info()->callsinfo_list); - while (list){ - listinfo=list->data; - if (listinfo->selected){ - calls_ns++; - } - list = g_list_next(list); - } + GtkTreeSelection *selection = (GtkTreeSelection *)data; + voip_calls_info_t* strinfo; - g_snprintf(label_text, 80, - "Detected %d VoIP %s. Selected %d %s.", - calls_nb, - plurality(calls_nb, "Call", "Calls"), - calls_ns, - plurality(calls_ns, "Call", "Calls")); - gtk_label_set_text(GTK_LABEL(top_label), label_text); + gtk_tree_model_get(model, iter, CALL_COL_DATA, &strinfo, -1); + strinfo->selected = gtk_tree_selection_iter_is_selected(selection, iter); - - if (calls_ns > 0) { - gtk_widget_set_sensitive(bt_filter, TRUE); - gtk_widget_set_sensitive(bt_graph, TRUE); -#ifdef HAVE_LIBPORTAUDIO - gtk_widget_set_sensitive(bt_player, TRUE); -#endif /* HAVE_LIBPORTAUDIO */ - } else { - gtk_widget_set_sensitive(bt_filter, FALSE); - gtk_widget_set_sensitive(bt_graph, FALSE); -#ifdef HAVE_LIBPORTAUDIO - gtk_widget_set_sensitive(bt_player, FALSE); -#endif /* HAVE_LIBPORTAUDIO */ - } - - /* TODO: activate other buttons when implemented */ + return FALSE; } - -/****************************************************************************/ -/* when the user selects a row in the calls list */ static void -voip_calls_on_unselect_row(GtkCList *clist_lcl, - gint row _U_, - gint column _U_, - GdkEventButton *event _U_, - gpointer user_data _U_) +voip_calls_on_select_row_cb(GtkTreeSelection *selection, gpointer data _U_) { gchar label_text[80]; - GList* list; - voip_calls_info_t *listinfo; - - selected_call_fwd = gtk_clist_get_row_data(GTK_CLIST(clist_lcl), row); - if (selected_call_fwd==NULL) - return; + gtk_tree_model_foreach(GTK_TREE_MODEL(list_store), voip_calls_mark_selected, selection); - selected_call_fwd->selected=FALSE; - - /* count the selected calls */ - calls_ns = 0; - list = g_list_first(voip_calls_get_info()->callsinfo_list); - while (list){ - listinfo=list->data; - if (listinfo->selected){ - calls_ns++; - } - list = g_list_next(list); - } + calls_ns = gtk_tree_selection_count_selected_rows(selection); g_snprintf(label_text, 80, - "Detected %d VoIP %s. Selected %d %s.", - calls_nb, - plurality(calls_nb, "Call", "Calls"), + "Detected %u VoIP %s. Selected %u %s.", + calls_nb, + plurality(calls_nb, "Call", "Calls"), calls_ns, plurality(calls_ns, "Call", "Calls")); - gtk_label_set_text(GTK_LABEL(top_label), label_text); + gtk_label_set_text(GTK_LABEL(top_label), label_text); - if (calls_ns > 0) { - gtk_widget_set_sensitive(bt_filter, TRUE); - gtk_widget_set_sensitive(bt_graph, TRUE); + gtk_widget_set_sensitive(bt_filter, calls_ns ? TRUE : FALSE); + gtk_widget_set_sensitive(bt_graph, calls_ns ? TRUE : FALSE); #ifdef HAVE_LIBPORTAUDIO - gtk_widget_set_sensitive(bt_player, TRUE); + gtk_widget_set_sensitive(bt_player, calls_ns ? TRUE : FALSE); #endif /* HAVE_LIBPORTAUDIO */ - } else { - gtk_widget_set_sensitive(bt_filter, FALSE); - gtk_widget_set_sensitive(bt_graph, FALSE); -#ifdef HAVE_LIBPORTAUDIO - gtk_widget_set_sensitive(bt_player, FALSE); -#endif /* HAVE_LIBPORTAUDIO */ - } - - /* TODO: activate other buttons when implemented */ } - - - - - - - /****************************************************************************/ - -typedef struct column_arrows { - GtkWidget *table; - GtkWidget *ascend_pm; - GtkWidget *descend_pm; -} column_arrows; - - +/* Tree view constructors */ /****************************************************************************/ +/* append a line to list */ static void -voip_calls_click_column_cb(GtkCList *clist_lcl, gint column, gpointer data) +add_to_list_store(voip_calls_info_t* strinfo) { - column_arrows *col_arrows = (column_arrows *) data; - int i; - - gtk_clist_freeze(clist_lcl); + gchar label_text[256]; + gchar *data[NUM_COLS]; + gchar field[NUM_COLS][50]; + gint c; + isup_calls_info_t *isupinfo; + h323_calls_info_t *h323info; + gboolean flag = FALSE; - for (i=0; i<NUM_COLS; i++) { - gtk_widget_hide(col_arrows[i].ascend_pm); - gtk_widget_hide(col_arrows[i].descend_pm); + for (c=0; c<NUM_COLS; c++) { + data[c] = &field[c][0]; } - if (column == clist_lcl->sort_column) { - if (clist_lcl->sort_type == GTK_SORT_ASCENDING) { - clist_lcl->sort_type = GTK_SORT_DESCENDING; - gtk_widget_show(col_arrows[column].descend_pm); - } else { - clist_lcl->sort_type = GTK_SORT_ASCENDING; - gtk_widget_show(col_arrows[column].ascend_pm); - } - } else { - clist_lcl->sort_type = GTK_SORT_ASCENDING; - gtk_widget_show(col_arrows[column].ascend_pm); - gtk_clist_set_sort_column(clist_lcl, column); + g_snprintf(field[CALL_COL_START_TIME], 15, "%3f", nstime_to_sec(&strinfo->start_rel)); + g_snprintf(field[CALL_COL_STOP_TIME], 15, "%3f", nstime_to_sec(&strinfo->stop_rel)); +/* XXX display_signed_time(data[0], sizeof(field[CALL_COL_START_TIME]), strinfo->start_rel.secs, strinfo->start_rel.nsecs, TO_STR_TIME_RES_T_NSECS); */ +/* display_signed_time(data[1], sizeof(field[CALL_COL_STOP_TIME]), strinfo->stop_rel.secs, strinfo->stop_rel.nsecs, TO_STR_TIME_RES_T_NSECS); */ + g_snprintf(field[CALL_COL_INITIAL_SPEAKER], 30, "%s", get_addr_name(&(strinfo->initial_speaker))); + g_snprintf(field[CALL_COL_FROM], 50, "%s", strinfo->from_identity); + g_snprintf(field[CALL_COL_TO], 50, "%s", strinfo->to_identity); + g_snprintf(field[CALL_COL_PROTOCOL], 15, "%s", ((strinfo->protocol==VOIP_COMMON)&&strinfo->protocol_name)?strinfo->protocol_name:voip_protocol_name[strinfo->protocol]); + g_snprintf(field[CALL_COL_PACKETS], 15, "%u", strinfo->npackets); + g_snprintf(field[CALL_COL_STATE], 15, "%s", voip_call_state_name[strinfo->call_state]); + + /* Add comments based on the protocol */ + switch (strinfo->protocol) { + case VOIP_ISUP: + isupinfo = strinfo->prot_info; + g_snprintf(field[CALL_COL_COMMENTS],30, "%i-%i -> %i-%i", isupinfo->ni, isupinfo->opc, + isupinfo->ni, isupinfo->dpc); + break; + case VOIP_H323: + h323info = strinfo->prot_info; + if (strinfo->call_state == VOIP_CALL_SETUP) + flag = h323info->is_faststart_Setup; + else + if ((h323info->is_faststart_Setup == TRUE) && (h323info->is_faststart_Proc == TRUE)) flag = TRUE; + g_snprintf(field[CALL_COL_COMMENTS],35, "Tunneling: %s Fast Start: %s", (h323info->is_h245Tunneling==TRUE?"ON":"OFF"), + (flag==TRUE?"ON":"OFF")); + break; + case VOIP_COMMON: + field[CALL_COL_COMMENTS][0]='\0'; + if (strinfo->call_comment) + g_snprintf(field[CALL_COL_COMMENTS],30, "%s", strinfo->call_comment); + break; + default: + field[CALL_COL_COMMENTS][0]='\0'; } - gtk_clist_thaw(clist_lcl); - gtk_clist_sort(clist_lcl); -} + /* Acquire an iterator */ + gtk_list_store_append(list_store, &list_iter); + + /* Fill the new row */ + gtk_list_store_set(list_store, &list_iter, + CALL_COL_START_TIME, data[0], + CALL_COL_STOP_TIME, data[1], + CALL_COL_INITIAL_SPEAKER, data[2], + CALL_COL_FROM, data[3], + CALL_COL_TO, data[4], + CALL_COL_PROTOCOL, data[5], + CALL_COL_PACKETS, data[6], + CALL_COL_STATE, data[7], + CALL_COL_COMMENTS, data[8], + CALL_COL_DATA, strinfo, + -1); + /* Update the top label with the number of detected calls */ + calls_nb++; + g_snprintf(label_text, 256, + "Detected %u VoIP %s. Selected %u %s.", + calls_nb, + plurality(calls_nb, "Call", "Calls"), + calls_ns, + plurality(calls_ns, "Call", "Calls")); + gtk_label_set_text(GTK_LABEL(top_label), label_text); -/****************************************************************************/ -static gint -voip_calls_sort_column(GtkCList *clist_lcl, gconstpointer ptr1, gconstpointer ptr2) -{ - char *text1 = NULL; - char *text2 = NULL; - guint i1, i2, i3, i4; - - const GtkCListRow *row1 = (const GtkCListRow *) ptr1; - const GtkCListRow *row2 = (const GtkCListRow *) ptr2; - - text1 = GTK_CELL_TEXT (row1->cell[clist_lcl->sort_column])->text; - text2 = GTK_CELL_TEXT (row2->cell[clist_lcl->sort_column])->text; - - switch(clist_lcl->sort_column){ - case CALL_COL_START_TIME: - case CALL_COL_STOP_TIME: - if ((sscanf(text1, "%u.%u", &i1, &i2) != 2) || - (sscanf(text2, "%u.%u", &i3, &i4) != 2) ){ - return 0; - } - if (i1>i3) - return 1; - if (i1<i3) - return -1; - return (i3-i4); - case CALL_COL_INITIAL_SPEAKER: - case CALL_COL_FROM: - case CALL_COL_TO: - case CALL_COL_PROTOCOL: - case CALL_COL_STATE: - case CALL_COL_COMMENTS: - return strcmp (text1, text2); - case CALL_COL_PACKETS: - i1=atoi(text1); - i2=atoi(text2); - return i1-i2; - } - g_assert_not_reached(); - return 0; + /* Update the status label with the number of total messages */ + g_snprintf(label_text, 256, + "Total: Calls: %u Start packets: %u Completed calls: %u Rejected calls: %u", + g_list_length(voip_calls_get_info()->callsinfo_list), + voip_calls_get_info()->start_packets, + voip_calls_get_info()->completed_calls, + voip_calls_get_info()->rejected_calls); + gtk_label_set_text(GTK_LABEL(status_label), label_text); } -#if 0 -Start of converting the clist to a gtk_list_store -/* Create list */ -static -GtkWidget* create_list(void) -{ - GtkListStore *list_store; - GtkWidget *list; - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - GtkTreeSortable *sortable; - GtkTreeView *list_view; - GtkTreeSelection *selection; - - /* Create the store */ - list_store = gtk_list_store_new(NUM_COLS, /* Total number of columns XXX */ - G_TYPE_STRING, /* Start Time */ - G_TYPE_STRING, /* Stop Time */ - G_TYPE_STRING, /* Initial Speaker */ - G_TYPE_STRING, /* From */ - G_TYPE_STRING, /* To */ - G_TYPE_STRING, /* Protocol */ - G_TYPE_STRING, /* Packets */ - G_TYPE_STRING, /* State */ - G_TYPE_STRING, /* Comments */ - G_TYPE_POINTER, /* Data */ - G_TYPE_STRING, /* Foreground color */ - G_TYPE_STRING); /* Background color */ - - /* Create a view */ - list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store)); - - list_view = GTK_TREE_VIEW(list); - sortable = GTK_TREE_SORTABLE(list_store); +/****************************************************************************/ +/* Create list view */ +static void +create_list_view(void) +{ + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + GtkTreeSortable *sortable; + GtkTreeView *list_view; + GtkTreeSelection *selection; + + /* Create the store */ + list_store = gtk_list_store_new(NUM_COLS, /* Total number of columns XXX */ + G_TYPE_STRING, /* Start Time */ + G_TYPE_STRING, /* Stop Time */ + G_TYPE_STRING, /* Initial Speaker */ + G_TYPE_STRING, /* From */ + G_TYPE_STRING, /* To */ + G_TYPE_STRING, /* Protocol */ + G_TYPE_STRING, /* Packets */ + G_TYPE_STRING, /* State */ + G_TYPE_STRING, /* Comments */ + G_TYPE_POINTER /* Data */ + ); + + /* Create a view */ + list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store)); + + list_view = GTK_TREE_VIEW(list); + sortable = GTK_TREE_SORTABLE(list_store); #if GTK_CHECK_VERSION(2,6,0) - /* Speed up the list display */ - gtk_tree_view_set_fixed_height_mode(list_view, TRUE); + /* Speed up the list display */ + gtk_tree_view_set_fixed_height_mode(list_view, TRUE); #endif - /* Setup the sortable columns */ - gtk_tree_sortable_set_sort_column_id(sortable, CALL_COL_START_TIME, GTK_SORT_ASCENDING); - gtk_tree_view_set_headers_clickable(list_view, FALSE); - - /* The view now holds a reference. We can get rid of our own reference */ - g_object_unref (G_OBJECT (list_store)); - - /* - * Create the first column packet, associating the "text" attribute of the - * cell_renderer to the first column of the model - */ - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Start Time", renderer, - "text", CALL_COL_START_TIME, - "foreground-gdk", FOREGROUND_COLOR_COL, - "background-gdk", BACKGROUND_COLOR_COL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, CALL_COL_START_TIME); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 80); - /* Add the column to the view. */ - gtk_tree_view_append_column (list_view, column); - - /* Stop Time */ - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Stop Time", renderer, - "text", CALL_COL_STOP_TIME, - "foreground-gdk", FOREGROUND_COLOR_COL, - "background-gdk", BACKGROUND_COLOR_COL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, CALL_COL_STOP_TIME); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 80); - gtk_tree_view_append_column (list_view, column); - - /* Initial Speaker */ - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Initial Speaker", renderer, - "text", CALL_COL_INITIAL_SPEAKER, - "foreground-gdk", FOREGROUND_COLOR_COL, - "background-gdk", BACKGROUND_COLOR_COL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, CALL_COL_INITIAL_SPEAKER); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 80); - gtk_tree_view_column_set_fixed_width(column, 90); - gtk_tree_view_append_column (list_view, column); - - /* From */ - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("From", renderer, - "text", CALL_COL_FROM, - "foreground-gdk", FOREGROUND_COLOR_COL, - "background-gdk", BACKGROUND_COLOR_COL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, CALL_COL_FROM); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 130); - gtk_tree_view_column_set_fixed_width(column, 140); - gtk_tree_view_append_column (list_view, column); - - /* To */ - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("To", renderer, - "text", CALL_COL_TO, - "foreground-gdk", FOREGROUND_COLOR_COL, - "background-gdk", BACKGROUND_COLOR_COL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, CALL_COL_TO); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 130); - gtk_tree_view_column_set_fixed_width(column, 140); - gtk_tree_view_append_column (list_view, column); - - /* Protocol */ - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Protocol", renderer, - "text", CALL_COL_PROTOCOL, - "foreground-gdk", FOREGROUND_COLOR_COL, - "background-gdk", BACKGROUND_COLOR_COL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, CALL_COL_PROTOCOL); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 50); - gtk_tree_view_append_column (list_view, column); - - /* Packets */ - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Packets", renderer, - "text", CALL_COL_PACKETS, - "foreground-gdk", FOREGROUND_COLOR_COL, - "background-gdk", BACKGROUND_COLOR_COL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, CALL_COL_PACKETS); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 70); - gtk_tree_view_append_column (list_view, column); - - /* State */ - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("State", renderer, - "text", CALL_COL_STATE, - "foreground-gdk", FOREGROUND_COLOR_COL, - "background-gdk", BACKGROUND_COLOR_COL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, CALL_COL_STATE); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 70); - gtk_tree_view_append_column (list_view, column); - - /* Comments */ - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Comments", renderer, - "text", CALL_COL_COMMENTS, - "foreground-gdk", FOREGROUND_COLOR_COL, - "background-gdk", BACKGROUND_COLOR_COL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, CALL_COL_COMMENTS); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 100); - gtk_tree_view_append_column (list_view, column); - - /* Now enable the sorting of each column */ - gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE); - gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE); - - /* Setup the selection handler */ - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); - gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); - -#if 0 - g_signal_connect (G_OBJECT (selection), "changed", /* select_row */ - G_CALLBACK (voip_calls_click_column_cb), - NULL); -#endif - return list; + /* Setup the sortable columns */ + gtk_tree_sortable_set_sort_column_id(sortable, CALL_COL_START_TIME, GTK_SORT_ASCENDING); + gtk_tree_view_set_headers_clickable(list_view, FALSE); + + /* The view now holds a reference. We can get rid of our own reference */ + g_object_unref(G_OBJECT(list_store)); + + /* + * Create the first column packet, associating the "text" attribute of the + * cell_renderer to the first column of the model + */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Start Time", renderer, + "text", CALL_COL_START_TIME, + NULL); + gtk_tree_view_column_set_sort_column_id(column, CALL_COL_START_TIME); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 100); + /* Add the column to the view. */ + gtk_tree_view_append_column(list_view, column); + + /* Stop Time */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Stop Time", renderer, + "text", CALL_COL_STOP_TIME, + NULL); + gtk_tree_view_column_set_sort_column_id(column, CALL_COL_STOP_TIME); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 100); + gtk_tree_view_append_column(list_view, column); + + /* Initial Speaker */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Initial Speaker", renderer, + "text", CALL_COL_INITIAL_SPEAKER, + NULL); + gtk_tree_view_column_set_sort_column_id(column, CALL_COL_INITIAL_SPEAKER); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 80); + gtk_tree_view_column_set_fixed_width(column, 120); + gtk_tree_view_append_column(list_view, column); + + /* From */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("From", renderer, + "text", CALL_COL_FROM, + NULL); + gtk_tree_view_column_set_sort_column_id(column, CALL_COL_FROM); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 130); + gtk_tree_view_column_set_fixed_width(column, 140); + gtk_tree_view_append_column(list_view, column); + + /* To */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("To", renderer, + "text", CALL_COL_TO, + NULL); + gtk_tree_view_column_set_sort_column_id(column, CALL_COL_TO); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 130); + gtk_tree_view_column_set_fixed_width(column, 140); + gtk_tree_view_append_column(list_view, column); + + /* Protocol */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Protocol", renderer, + "text", CALL_COL_PROTOCOL, + NULL); + gtk_tree_view_column_set_sort_column_id(column, CALL_COL_PROTOCOL); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 50); + gtk_tree_view_column_set_fixed_width(column, 80); + gtk_tree_view_append_column(list_view, column); + + /* Packets */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Packets", renderer, + "text", CALL_COL_PACKETS, + NULL); + gtk_tree_view_column_set_sort_column_id(column, CALL_COL_PACKETS); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 70); + gtk_tree_view_column_set_fixed_width(column, 80); + gtk_tree_view_append_column(list_view, column); + + /* State */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("State", renderer, + "text", CALL_COL_STATE, + NULL); + gtk_tree_view_column_set_sort_column_id(column, CALL_COL_STATE); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 80); + gtk_tree_view_append_column(list_view, column); + + /* Comments */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Comments", renderer, + "text", CALL_COL_COMMENTS, + NULL); + gtk_tree_view_column_set_sort_column_id(column, CALL_COL_COMMENTS); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 100); + gtk_tree_view_column_set_fixed_width(column, 140); + gtk_tree_view_append_column(list_view, column); + + /* Now enable the sorting of each column */ + gtk_tree_view_set_rules_hint(list_view, TRUE); + gtk_tree_view_set_headers_clickable(list_view, TRUE); + + /* Setup the selection handler */ + selection = gtk_tree_view_get_selection(list_view); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + + g_signal_connect(G_OBJECT(selection), "changed", /* select_row */ + G_CALLBACK(voip_calls_on_select_row_cb), + NULL); } -#endif /****************************************************************************/ /* INTERFACE */ /****************************************************************************/ - -static void voip_calls_dlg_create (void) +static void +voip_calls_dlg_create(void) { GtkWidget *voip_calls_dlg_w; GtkWidget *main_vb; @@ -873,137 +677,74 @@ static void voip_calls_dlg_create (void) GtkWidget *bt_select_all; GtkTooltips *tooltips = gtk_tooltips_new(); const gchar *title_name_ptr; - gchar *win_name; - - const gchar *titles[NUM_COLS] = {"Start Time", "Stop Time", "Initial Speaker", "From", "To", "Protocol", "Packets", "State", "Comments"}; - column_arrows *col_arrows; - GtkWidget *column_lb; - int i; + gchar *win_name; title_name_ptr = cf_get_display_name(&cfile); win_name = g_strdup_printf("%s - VoIP Calls", title_name_ptr); voip_calls_dlg_w = dlg_window_new(win_name); /* transient_for top_level */ - gtk_window_set_destroy_with_parent (GTK_WINDOW(voip_calls_dlg_w), TRUE); + gtk_window_set_destroy_with_parent(GTK_WINDOW(voip_calls_dlg_w), TRUE); gtk_window_set_default_size(GTK_WINDOW(voip_calls_dlg_w), 840, 350); - main_vb = gtk_vbox_new (FALSE, 0); + main_vb = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(voip_calls_dlg_w), main_vb); - gtk_container_set_border_width (GTK_CONTAINER (main_vb), 12); - - top_label = gtk_label_new ("Detected 0 VoIP Calls. Selected 0 Calls."); - gtk_box_pack_start (GTK_BOX (main_vb), top_label, FALSE, FALSE, 8); + gtk_container_set_border_width(GTK_CONTAINER (main_vb), 12); - scrolledwindow = scrolled_window_new (NULL, NULL); - gtk_box_pack_start (GTK_BOX (main_vb), scrolledwindow, TRUE, TRUE, 0); + top_label = gtk_label_new("Detected 0 VoIP Calls. Selected 0 Calls."); + gtk_box_pack_start(GTK_BOX (main_vb), top_label, FALSE, FALSE, 8); - clist = gtk_clist_new (NUM_COLS); - gtk_clist_set_selection_mode(GTK_CLIST (clist), GTK_SELECTION_MULTIPLE); - - gtk_container_add (GTK_CONTAINER (scrolledwindow), clist); - - gtk_clist_set_column_width (GTK_CLIST (clist), CALL_COL_START_TIME, 60); - gtk_clist_set_column_width (GTK_CLIST (clist), CALL_COL_STOP_TIME, 60); - gtk_clist_set_column_width (GTK_CLIST (clist), CALL_COL_INITIAL_SPEAKER, 80); - gtk_clist_set_column_width (GTK_CLIST (clist), CALL_COL_FROM, 130); - gtk_clist_set_column_width (GTK_CLIST (clist), CALL_COL_TO, 130); - gtk_clist_set_column_width (GTK_CLIST (clist), CALL_COL_PROTOCOL, 50); - gtk_clist_set_column_width (GTK_CLIST (clist), CALL_COL_PACKETS, 45); - gtk_clist_set_column_width (GTK_CLIST (clist), CALL_COL_STATE, 60); - gtk_clist_set_column_width (GTK_CLIST (clist), CALL_COL_COMMENTS, 100); - - gtk_clist_set_column_justification(GTK_CLIST(clist), CALL_COL_START_TIME, GTK_JUSTIFY_LEFT); - gtk_clist_set_column_justification(GTK_CLIST(clist), CALL_COL_STOP_TIME, GTK_JUSTIFY_LEFT); - gtk_clist_set_column_justification(GTK_CLIST(clist), CALL_COL_INITIAL_SPEAKER, GTK_JUSTIFY_LEFT); - gtk_clist_set_column_justification(GTK_CLIST(clist), CALL_COL_FROM, GTK_JUSTIFY_LEFT); - gtk_clist_set_column_justification(GTK_CLIST(clist), CALL_COL_TO, GTK_JUSTIFY_LEFT); - gtk_clist_set_column_justification(GTK_CLIST(clist), CALL_COL_PROTOCOL, GTK_JUSTIFY_CENTER); - gtk_clist_set_column_justification(GTK_CLIST(clist), CALL_COL_PACKETS, GTK_JUSTIFY_CENTER); - gtk_clist_set_column_justification(GTK_CLIST(clist), CALL_COL_STATE, GTK_JUSTIFY_LEFT); - gtk_clist_set_column_justification(GTK_CLIST(clist), CALL_COL_COMMENTS, GTK_JUSTIFY_LEFT); - - gtk_clist_column_titles_show (GTK_CLIST (clist)); - - gtk_clist_set_compare_func(GTK_CLIST(clist), voip_calls_sort_column); - gtk_clist_set_sort_column(GTK_CLIST(clist), 0); - gtk_clist_set_sort_type(GTK_CLIST(clist), GTK_SORT_ASCENDING); + scrolledwindow = scrolled_window_new(NULL, NULL); + gtk_box_pack_start(GTK_BOX (main_vb), scrolledwindow, TRUE, TRUE, 0); + create_list_view(); + gtk_container_add(GTK_CONTAINER(scrolledwindow), list); gtk_widget_show(voip_calls_dlg_w); - /* sort by column feature */ - col_arrows = (column_arrows *) g_malloc(sizeof(column_arrows) * NUM_COLS); - - for (i=0; i<NUM_COLS; i++) { - col_arrows[i].table = gtk_table_new(2, 2, FALSE); - gtk_table_set_col_spacings(GTK_TABLE(col_arrows[i].table), 5); - column_lb = gtk_label_new(titles[i]); - gtk_table_attach(GTK_TABLE(col_arrows[i].table), column_lb, 0, 1, 0, 2, GTK_SHRINK, GTK_SHRINK, 0, 0); - gtk_widget_show(column_lb); - - col_arrows[i].ascend_pm = xpm_to_widget(clist_ascend_xpm); - gtk_table_attach(GTK_TABLE(col_arrows[i].table), col_arrows[i].ascend_pm, 1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0); - col_arrows[i].descend_pm = xpm_to_widget(clist_descend_xpm); - gtk_table_attach(GTK_TABLE(col_arrows[i].table), col_arrows[i].descend_pm, 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0); - /* make start time be the default sort order */ - if (i == 0) { - gtk_widget_show(col_arrows[i].ascend_pm); - } - gtk_clist_set_column_widget(GTK_CLIST(clist), i, col_arrows[i].table); - gtk_widget_show(col_arrows[i].table); - } + status_label = gtk_label_new("Total: Calls: 0 Start packets: 0 Completed calls: 0 Rejected calls: 0"); + gtk_box_pack_start(GTK_BOX(main_vb), status_label, FALSE, FALSE, 8); - g_signal_connect(clist, "click-column", G_CALLBACK(voip_calls_click_column_cb), col_arrows); - -/* label_fwd = gtk_label_new (FWD_LABEL_TEXT); - gtk_box_pack_start (GTK_BOX (main_vb), label_fwd, FALSE, FALSE, 0); -*/ - status_label = gtk_label_new ("Total: Calls: 0 Start packets: 0 Completed calls: 0 Rejected calls: 0"); - gtk_box_pack_start (GTK_BOX (main_vb), status_label, FALSE, FALSE, 8); - - /* button row */ - hbuttonbox = gtk_hbutton_box_new (); - gtk_box_pack_start (GTK_BOX (main_vb), hbuttonbox, FALSE, FALSE, 0); - gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_SPREAD); - gtk_box_set_spacing (GTK_BOX (hbuttonbox), 30); + /* button row */ + hbuttonbox = gtk_hbutton_box_new(); + gtk_box_pack_start(GTK_BOX(main_vb), hbuttonbox, FALSE, FALSE, 0); + gtk_button_box_set_layout(GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_SPREAD); + gtk_box_set_spacing(GTK_BOX(hbuttonbox), 30); /*bt_unselect = gtk_button_new_with_label ("Unselect"); gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_unselect); gtk_tooltips_set_tip (tooltips, bt_unselect, "Unselect this conversation", NULL);*/ - bt_filter = gtk_button_new_from_stock(WIRESHARK_STOCK_PREPARE_FILTER); - gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_filter); - gtk_tooltips_set_tip (tooltips, bt_filter, "Prepare a display filter of the selected conversation", NULL); + bt_filter = gtk_button_new_from_stock(WIRESHARK_STOCK_PREPARE_FILTER); + gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_filter); + gtk_tooltips_set_tip(tooltips, bt_filter, "Prepare a display filter of the selected conversation", NULL); - bt_graph = gtk_button_new_from_stock(WIRESHARK_STOCK_VOIP_FLOW); + bt_graph = gtk_button_new_from_stock(WIRESHARK_STOCK_VOIP_FLOW); gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_graph); gtk_widget_show(bt_graph); g_signal_connect(bt_graph, "clicked", G_CALLBACK(on_graph_bt_clicked), NULL); - gtk_tooltips_set_tip (tooltips, bt_graph, "Show a flow graph of the selected calls.", NULL); + gtk_tooltips_set_tip(tooltips, bt_graph, "Show a flow graph of the selected calls.", NULL); #ifdef HAVE_LIBPORTAUDIO - bt_player = gtk_button_new_from_stock(WIRESHARK_STOCK_AUDIO_PLAYER); + bt_player = gtk_button_new_from_stock(WIRESHARK_STOCK_AUDIO_PLAYER); gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_player); gtk_widget_show(bt_player); g_signal_connect(bt_player, "clicked", G_CALLBACK(on_player_bt_clicked), NULL); - gtk_tooltips_set_tip (tooltips, bt_player, "Launch the RTP player to listen the selected calls.", NULL); + gtk_tooltips_set_tip(tooltips, bt_player, "Launch the RTP player to listen the selected calls.", NULL); #endif /* HAVE_LIBPORTAUDIO */ #if GTK_CHECK_VERSION(2,10,0) - bt_select_all = gtk_button_new_from_stock(GTK_STOCK_SELECT_ALL); + bt_select_all = gtk_button_new_from_stock(GTK_STOCK_SELECT_ALL); #else bt_select_all = gtk_button_new_with_label("Select All"); #endif - gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_select_all); + gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_select_all); GTK_WIDGET_SET_FLAGS(bt_select_all, GTK_CAN_DEFAULT); - gtk_tooltips_set_tip (tooltips, bt_select_all, "Select all the calls", NULL); + gtk_tooltips_set_tip(tooltips, bt_select_all, "Select all the calls", NULL); bt_close = gtk_button_new_from_stock(GTK_STOCK_CLOSE); - gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_close); + gtk_container_add(GTK_CONTAINER (hbuttonbox), bt_close); GTK_WIDGET_SET_FLAGS(bt_close, GTK_CAN_DEFAULT); - gtk_tooltips_set_tip (tooltips, bt_close, "Close this dialog", NULL); + gtk_tooltips_set_tip(tooltips, bt_close, "Close this dialog", NULL); - g_signal_connect(clist, "select_row", G_CALLBACK(voip_calls_on_select_row), NULL); - g_signal_connect(clist, "unselect_row", G_CALLBACK(voip_calls_on_unselect_row), NULL); /*g_signal_connect(bt_unselect, "clicked", G_CALLBACK(voip_calls_on_unselect), NULL);*/ g_signal_connect(bt_filter, "clicked", G_CALLBACK(voip_calls_on_filter), NULL); @@ -1025,14 +766,14 @@ static void voip_calls_dlg_create (void) /****************************************************************************/ -/* PUBLIC */ +/* PUBLIC */ /****************************************************************************/ /****************************************************************************/ -/* update the contents of the dialog box clist */ +/* update the contents of the list view */ /* list: pointer to list of voip_calls_info_t* */ - -void voip_calls_dlg_update(GList *list) +void +voip_calls_dlg_update(GList *list) { gchar label_text[256]; if (voip_calls_dlg != NULL) { @@ -1040,39 +781,33 @@ void voip_calls_dlg_update(GList *list) calls_ns = 0; g_snprintf(label_text, 256, - "Total: Calls: %d Start packets: %d Completed calls: %d Rejected calls: %d", + "Total: Calls: %u Start packets: %u Completed calls: %u Rejected calls: %u", g_list_length(voip_calls_get_info()->callsinfo_list), voip_calls_get_info()->start_packets, voip_calls_get_info()->completed_calls, voip_calls_get_info()->rejected_calls); - gtk_label_set_text(GTK_LABEL(status_label), label_text); + gtk_label_set_text(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)); + while (list) { + add_to_list_store((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.", + "Detected %u VoIP %s. Selected %u %s.", calls_nb, plurality(calls_nb, "Call", "Calls"), calls_ns, plurality(calls_ns, "Call", "Calls")); - gtk_label_set_text(GTK_LABEL(top_label), label_text); + gtk_label_set_text(GTK_LABEL(top_label), label_text); } - - last_list = list; } - /****************************************************************************/ /* draw function for tap listeners to keep the window up to date */ -void voip_calls_dlg_draw(void *ptr _U_) +void +voip_calls_dlg_draw(void *ptr _U_) { if (voip_calls_get_info()->redraw) { voip_calls_dlg_update(voip_calls_get_info()->callsinfo_list); @@ -1080,11 +815,13 @@ void voip_calls_dlg_draw(void *ptr _U_) } } +/****************************************************************************/ /* reset function for tap listeners to clear window, if necessary */ -void voip_calls_dlg_reset(void *ptr _U_) +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()); + voip_calls_reset(voip_calls_get_info()); /* close the graph window if open */ if (graph_analysis_data && graph_analysis_data->dlg.window != NULL) { @@ -1093,15 +830,11 @@ void voip_calls_dlg_reset(void *ptr _U_) } } +/****************************************************************************/ /* init function for tap */ -/* Made extern only for "Fax T38 Analysis..." */ -void +static void voip_calls_init_tap(const char *dummy _U_, void* userdata _U_) { - gint c; - gchar *data[NUM_COLS]; - gchar field[NUM_COLS][50]; - if (graph_analysis_data == NULL) { graph_analysis_data_init(); /* init the Graph Analysys */ @@ -1110,7 +843,7 @@ voip_calls_init_tap(const char *dummy _U_, void* userdata _U_) } /* Clean up memory used by calls tap */ - voip_calls_reset((voip_calls_tapinfo_t*) voip_calls_get_info()); + voip_calls_reset(voip_calls_get_info()); /* Register the tap listener */ sip_calls_init_tap(); @@ -1133,7 +866,6 @@ voip_calls_init_tap(const char *dummy _U_, void* userdata _U_) rtp_event_init_tap(); mgcp_calls_init_tap(); actrace_calls_init_tap(); - t38_init_tap(); skinny_calls_init_tap(); iax2_calls_init_tap(); @@ -1148,13 +880,7 @@ voip_calls_init_tap(const char *dummy _U_, void* userdata _U_) 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] = '\0'; - } - 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); gdk_window_raise(voip_calls_dlg->window); @@ -1164,20 +890,18 @@ voip_calls_init_tap(const char *dummy _U_, void* userdata _U_) /****************************************************************************/ /* entry point when called via the GTK menu */ -static void voip_calls_launch(GtkWidget *w _U_, gpointer data _U_) +static void +voip_calls_launch(GtkWidget *w _U_, gpointer data _U_) { - voip_calls_init_tap("",NULL); + voip_calls_init_tap("", NULL); } /****************************************************************************/ void register_tap_listener_voip_calls_dlg(void) { - register_stat_cmd_arg("voip,calls",voip_calls_init_tap,NULL); - /*register_stat_menu_item("_VoIP Calls", REGISTER_STAT_GROUP_TELEPHONY, - voip_calls_launch, NULL, NULL, NULL);*/ - register_stat_menu_item_stock("_VoIP Calls...", - REGISTER_STAT_GROUP_TELEPHONY, WIRESHARK_STOCK_TELEPHONE, - voip_calls_launch, NULL, NULL, NULL); - + register_stat_cmd_arg("voip,calls", voip_calls_init_tap, NULL); + register_stat_menu_item_stock("_VoIP Calls...", + REGISTER_STAT_GROUP_TELEPHONY, WIRESHARK_STOCK_TELEPHONE, + voip_calls_launch, NULL, NULL, NULL); } |