diff options
author | Anders Broman <anders.broman@ericsson.com> | 2011-03-22 06:17:20 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2011-03-22 06:17:20 +0000 |
commit | 694a48cdc8703fd75c719975c9693de9ebd8f6fd (patch) | |
tree | bc3a8b6f8b6ef25ef8d5a809de0f6f1b2429d521 | |
parent | 23e5eb42babf2e8ef9bc3f80f5d6ab9ebda566b6 (diff) | |
download | wireshark-694a48cdc8703fd75c719975c9693de9ebd8f6fd.tar.gz wireshark-694a48cdc8703fd75c719975c9693de9ebd8f6fd.tar.bz2 wireshark-694a48cdc8703fd75c719975c9693de9ebd8f6fd.zip |
Remove the Exper info dialogue.
(Leave the fies for a while).
svn path=/trunk/; revision=36235
-rw-r--r-- | gtk/Makefile.common | 2 | ||||
-rw-r--r-- | gtk/expert_comp_dlg.c | 421 |
2 files changed, 420 insertions, 3 deletions
diff --git a/gtk/Makefile.common b/gtk/Makefile.common index 00ef90ccd1..f056ed98c2 100644 --- a/gtk/Makefile.common +++ b/gtk/Makefile.common @@ -172,7 +172,6 @@ WIRESHARK_TAP_SRC = \ dcerpc_stat.c \ diameter_stat.c \ expert_comp_dlg.c \ - expert_dlg.c \ fc_stat.c \ flow_graph.c \ funnel_stat.c \ @@ -249,7 +248,6 @@ noinst_HEADERS = \ drag_and_drop.h \ expert_comp_dlg.h \ expert_comp_table.h \ - expert_dlg.h \ expert_indicators.h \ export_object.h \ file_dlg.h \ diff --git a/gtk/expert_comp_dlg.c b/gtk/expert_comp_dlg.c index b890a1dca5..0e80ba28f4 100644 --- a/gtk/expert_comp_dlg.c +++ b/gtk/expert_comp_dlg.c @@ -36,6 +36,7 @@ #include <epan/packet_info.h> #include <epan/tap.h> #include <epan/stat_cmd_args.h> +#include <epan/prefs.h> #include "../simple_dialog.h" #include "../stat_menu.h" @@ -49,6 +50,20 @@ #include "gtk/stock_icons.h" #include "gtk/main.h" +#include "gtk/main_proto_draw.h" + + +enum +{ + NO_COLUMN, + SEVERITY_COLUMN, + GROUP_COLUMN, + PROTOCOL_COLUMN, + SUMMARY_COLUMN, + FOREGROUND_COLOR_COL, + BACKGROUND_COLOR_COL, + N_COLUMNS +}; /* used to keep track of the statistics for an entire program interface */ typedef struct _expert_comp_dlg_t { @@ -69,9 +84,114 @@ typedef struct _expert_comp_dlg_t { guint32 error_events; } expert_comp_dlg_t; +typedef struct expert_tapdata_s { + GtkWidget *win; + GtkWidget *scrolled_window; + GtkTreeView *tree_view; + GtkWidget *label; + guint32 disp_events; + guint32 chat_events; + guint32 note_events; + guint32 warn_events; + guint32 error_events; + int severity_report_level; + + GArray *ei_array; /* expert info items */ + guint first; + guint last; + GStringChunk* text; /* summary text */ +} expert_tapdata_t; + static GtkWidget *expert_comp_dlg_w = NULL; static void +select_row_cb(GtkTreeSelection *selection, gpointer *user_data _U_) +{ + /*guint num = GPOINTER_TO_UINT(gtk_clist_get_row_data(clist, row));*/ + + /*cf_goto_frame(&cfile, num);*/ + + GtkTreeIter iter; + GtkTreeModel *model; + guint fnumber; + + if (selection==NULL) + return; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)){ + gtk_tree_model_get (model, &iter, NO_COLUMN, &fnumber, -1); + cf_goto_frame(&cfile, fnumber); + } + +} + +/* reset of display only, e.g. for filtering */ +static void expert_dlg_display_reset(expert_tapdata_t * etd) +{ + etd->disp_events = 0; + gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(etd->tree_view)))); + + gtk_window_set_title(GTK_WINDOW(etd->win), "Wireshark: ? Expert Infos"); + if(etd->label) { + gtk_label_set_text(GTK_LABEL(etd->label), "Please wait ..."); + } +} + +/* complete reset, e.g. capture file closed */ +static void +expert_dlg_reset(void *tapdata) +{ + expert_tapdata_t * etd = tapdata; + + etd->chat_events = 0; + etd->note_events = 0; + etd->warn_events = 0; + etd->error_events = 0; + etd->last = 0; + etd->first = 0; + /* g_string_chunk_clear() is introduced in glib 2.14 */ + g_string_chunk_free(etd->text); + etd->text = g_string_chunk_new(100); + g_array_set_size(etd->ei_array, 0); + + expert_dlg_display_reset(etd); +} + +static int +expert_dlg_packet(void *tapdata, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *pointer) +{ + expert_info_t *ei; + expert_tapdata_t *etd = tapdata; + + g_array_append_val(etd->ei_array, *(expert_info_t *)pointer); + etd->last = etd->ei_array->len; + ei = &g_array_index(etd->ei_array, expert_info_t, etd->last -1); /* ugly */ + ei->protocol = g_string_chunk_insert_const(etd->text, ei->protocol); + ei->summary = g_string_chunk_insert_const(etd->text, ei->summary); + + switch(ei->severity) { + case(PI_CHAT): + etd->chat_events++; + break; + case(PI_NOTE): + etd->note_events++; + break; + case(PI_WARN): + etd->warn_events++; + break; + case(PI_ERROR): + etd->error_events++; + break; + default: + g_assert_not_reached(); + } + if(ei->severity < etd->severity_report_level) { + return 0; /* draw not required */ + } else { + return 1; /* draw required */ + } +} +static void error_set_title(expert_comp_dlg_t *ss) { char *title; @@ -208,6 +328,306 @@ win_destroy_cb(GtkWindow *win _U_, gpointer data) } static void +expert_dlg_destroy_cb(GtkWindow *win _U_, gpointer data) +{ + expert_tapdata_t *etd=(expert_tapdata_t *)data; + + protect_thread_critical_region(); + remove_tap_listener(etd); + unprotect_thread_critical_region(); + + /*free_srt_table_data(&etd->afp_srt_table);*/ + g_array_free(etd->ei_array, TRUE); + g_string_chunk_free(etd->text); + g_free(etd); +} + +static expert_tapdata_t * expert_dlg_new_table(void) +{ + expert_tapdata_t * etd; + etd=g_malloc0(sizeof(expert_tapdata_t)); + + etd->ei_array = g_array_sized_new(FALSE, FALSE, sizeof(expert_info_t), 1000); + etd->text = g_string_chunk_new(100); + etd->severity_report_level = PI_CHAT; + return etd; +} + +static void +expert_dlg_init_table(expert_tapdata_t * etd, GtkWidget *vbox) +{ + GtkListStore *store; + GtkWidget *tree; + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + GtkTreeSortable *sortable; + GtkTreeSelection *selection; + + /* Create the store */ + store = gtk_list_store_new(N_COLUMNS, /* Total number of columns */ + G_TYPE_UINT, /* No */ + G_TYPE_POINTER, /* Severity */ + G_TYPE_POINTER, /* Group */ + G_TYPE_POINTER, /* Protocol */ + G_TYPE_POINTER, /* Summary */ + G_TYPE_STRING, /* forground */ + G_TYPE_STRING); /* Background */ + + /* Create a view */ + tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); + etd->tree_view = GTK_TREE_VIEW(tree); + sortable = GTK_TREE_SORTABLE(store); + +#if GTK_CHECK_VERSION(2,6,0) + /* Speed up the list display */ + gtk_tree_view_set_fixed_height_mode(etd->tree_view, TRUE); +#endif + + /* Setup the sortable columns */ + gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW (tree), FALSE); + + /* The view now holds a reference. We can get rid of our own reference */ + g_object_unref (G_OBJECT (store)); + + /* Let the font be the default one to have the same look as the rest of the tabs + * Bug https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=4388 + * gtk_widget_modify_font(GTK_WIDGET (etd->tree_view), user_font_get_regular()); + */ + + /* Create a cell renderer */ + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, "ypad", 0, NULL); + g_object_set(renderer, "xalign", 1.0, NULL); + + /* Create the first column, associating the "text" attribute of the + * cell_renderer to the first column of the model */ + /* No */ + column = gtk_tree_view_column_new_with_attributes ("No", renderer, + "text", NO_COLUMN, + "foreground", FOREGROUND_COLOR_COL, + "background", BACKGROUND_COLOR_COL, + NULL); + gtk_tree_view_column_set_sort_column_id(column, NO_COLUMN); + 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_append_column (etd->tree_view, column); + + /* Severity */ + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, "ypad", 0, NULL); + + column = gtk_tree_view_column_new_with_attributes ("Severity", renderer, + "foreground", FOREGROUND_COLOR_COL, + "background", BACKGROUND_COLOR_COL, + NULL); + + gtk_tree_view_column_set_cell_data_func(column, renderer, str_ptr_data_func, + GINT_TO_POINTER(SEVERITY_COLUMN), NULL); + + gtk_tree_sortable_set_sort_func(sortable, SEVERITY_COLUMN, str_ptr_sort_func, + GINT_TO_POINTER(SEVERITY_COLUMN), NULL); + + gtk_tree_view_column_set_sort_column_id(column, SEVERITY_COLUMN); + 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); + /* Add the column to the view. */ + gtk_tree_view_append_column (etd->tree_view, column); + + /* Group */ + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, "ypad", 0, NULL); + column = gtk_tree_view_column_new_with_attributes ("Group", renderer, + "foreground", FOREGROUND_COLOR_COL, + "background", BACKGROUND_COLOR_COL, + NULL); + + gtk_tree_view_column_set_cell_data_func(column, renderer, str_ptr_data_func, + GINT_TO_POINTER(GROUP_COLUMN), NULL); + + gtk_tree_sortable_set_sort_func(sortable, GROUP_COLUMN, str_ptr_sort_func, + GINT_TO_POINTER(GROUP_COLUMN), NULL); + + gtk_tree_view_column_set_sort_column_id(column, GROUP_COLUMN); + 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); + /* Add the column to the view. */ + gtk_tree_view_append_column (etd->tree_view, column); + + /* Protocol. */ + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, "ypad", 0, NULL); + column = gtk_tree_view_column_new_with_attributes ("Protocol", renderer, + "foreground", FOREGROUND_COLOR_COL, + "background", BACKGROUND_COLOR_COL, + NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer, str_ptr_data_func, + GINT_TO_POINTER(PROTOCOL_COLUMN), NULL); + + gtk_tree_sortable_set_sort_func(sortable, PROTOCOL_COLUMN, str_ptr_sort_func, + GINT_TO_POINTER(PROTOCOL_COLUMN), NULL); + + gtk_tree_view_column_set_sort_column_id(column, PROTOCOL_COLUMN); + 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_append_column (etd->tree_view, column); + + /* Summary. */ + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, "ypad", 0, NULL); + column = gtk_tree_view_column_new_with_attributes ("Summary", renderer, + "foreground", FOREGROUND_COLOR_COL, + "background", BACKGROUND_COLOR_COL, + NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer, str_ptr_data_func, + GINT_TO_POINTER(SUMMARY_COLUMN), NULL); + + gtk_tree_sortable_set_sort_func(sortable, SUMMARY_COLUMN, str_ptr_sort_func, + GINT_TO_POINTER(SUMMARY_COLUMN), NULL); + + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 90); + gtk_tree_view_column_set_sort_column_id(column, SUMMARY_COLUMN); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_append_column (etd->tree_view, column); + + + gtk_tree_view_set_search_column (etd->tree_view, SUMMARY_COLUMN); /* Allow searching the summary */ + gtk_tree_view_set_reorderable (etd->tree_view, TRUE); /* Allow user to reorder data with drag n drop */ + + /* Now enable the sorting of each column */ + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(etd->tree_view), TRUE); + gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(etd->tree_view), TRUE); + + /* Setup the selection handler */ + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(etd->tree_view)); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); + + g_signal_connect (G_OBJECT (selection), "changed", /* select_row */ + G_CALLBACK (select_row_cb), + NULL); + + etd->scrolled_window=scrolled_window_new(NULL, NULL); + gtk_container_add(GTK_CONTAINER(etd->scrolled_window), GTK_WIDGET (etd->tree_view)); + + gtk_box_pack_start(GTK_BOX(vbox), etd->scrolled_window, TRUE, TRUE, 0); +} + +static void +expert_dlg_draw(void *data) +{ + expert_tapdata_t *etd = data; + expert_info_t *ei; + gchar *title; + const char *entries[2]; /**< column entries */ + GtkListStore *list_store; + GtkTreeIter iter; + gchar *color_str = NULL; + guint packet_no = 0; + const gchar *group_str; + const gchar *severity_str; + + + if(etd->label) { + if(etd->last - etd->first) { + title = g_strdup_printf("Adding: %u new messages",etd->last - etd->first); + gtk_label_set_text(GTK_LABEL(etd->label), title); + g_free(title); + } + } + + /* append new events (remove from new list, append to displayed list and clist) */ + while(etd->first < etd->last){ + ei = &g_array_index(etd->ei_array, expert_info_t, etd->first); + etd->first++; + + if(ei->severity < etd->severity_report_level) { + continue; + } + etd->disp_events++; + + /* packet number */ + if(ei->packet_num) { + packet_no = ei->packet_num; + } + + /* match_strval return a static string or NULL + severity */ + severity_str = match_strval(ei->severity, expert_severity_vals); + /* group */ + group_str = match_strval(ei->group, expert_group_vals); + + /* protocol */ + if(ei->protocol) { + entries[0] = ei->protocol; + } else { + entries[0] = "-"; + } + + /* summary */ + entries[1] = ei->summary; + + /* set rows background color depending on severity */ + switch(ei->severity) { + case(PI_CHAT): + color_str = expert_color_chat_str; + break; + case(PI_NOTE): + color_str = expert_color_note_str; + break; + case(PI_WARN): + color_str = expert_color_warn_str; + break; + case(PI_ERROR): + color_str = expert_color_error_str; + break; + default: + g_assert_not_reached(); + } + + list_store = GTK_LIST_STORE(gtk_tree_view_get_model(etd->tree_view)); /* Get store */ + + /* Creates a new row at position. iter will be changed to point to this new row. + * If position is larger than the number of rows on the list, then the new row will be appended to the list. + * The row will be filled with the values given to this function. + * : + * should generally be preferred when inserting rows in a sorted list store. + */ +#if GTK_CHECK_VERSION(2,6,0) + gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT, +#else + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, +#endif + NO_COLUMN, packet_no, + SEVERITY_COLUMN, severity_str, + GROUP_COLUMN, group_str, + PROTOCOL_COLUMN, entries[0], + SUMMARY_COLUMN, entries[1], + FOREGROUND_COLOR_COL, expert_color_foreground_str, + BACKGROUND_COLOR_COL, color_str, + -1); + } + + if(etd->label) { + title = g_strdup_printf("Errors: %u Warnings: %u Notes: %u Chats: %u", + etd->error_events, etd->warn_events, + etd->note_events, etd->chat_events); + gtk_label_set_text(GTK_LABEL(etd->label), title); + g_free(title); + } + + title = g_strdup_printf("Wireshark: %u Expert Info%s", + etd->disp_events, + plurality(etd->disp_events, "", "s")); + gtk_window_set_title(GTK_WINDOW(etd->win), title); + g_free(title); +} + +static void expert_comp_init(const char *optarg _U_, void* userdata _U_) { expert_comp_dlg_t *ss; @@ -360,7 +780,6 @@ expert_comp_init(const char *optarg _U_, void* userdata _U_) expert_comp_draw(ss); } - void expert_comp_dlg_launch(void) { |