aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2011-03-22 06:17:20 +0000
committerAnders Broman <anders.broman@ericsson.com>2011-03-22 06:17:20 +0000
commit694a48cdc8703fd75c719975c9693de9ebd8f6fd (patch)
treebc3a8b6f8b6ef25ef8d5a809de0f6f1b2429d521
parent23e5eb42babf2e8ef9bc3f80f5d6ab9ebda566b6 (diff)
downloadwireshark-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.common2
-rw-r--r--gtk/expert_comp_dlg.c421
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)
{