*
* $Id$
*
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
#include <gtk/gtk.h>
-#include "globals.h"
#include "epan/filesystem.h"
-#include "simple_dialog.h"
-#include "tap_menu.h"
-#include "dlg_utils.h"
-#include "ui_util.h"
-#include "main.h"
-#include "compat_macros.h"
-#include "sctp_stat.h"
-/*#include "sctp_assoc_analyse.h"*/
+#include "../globals.h"
+#include "../simple_dialog.h"
+
+#include "gtk/dlg_utils.h"
+#include "gtk/gui_utils.h"
+#include "gtk/main.h"
+#include "gtk/sctp_stat.h"
static GtkWidget *sctp_error_dlg=NULL;
static GtkWidget *clist = NULL;
static GList *last_list = NULL;
static sctp_error_info_t* selected_packet = NULL;/* current selection */
-/*static sctp_assoc_info_t* selected_assoc = NULL; */
-extern GtkWidget *main_display_filter_widget;
-
-
-#define NUM_COLS 3
-typedef struct column_arrows {
- GtkWidget *table;
- GtkWidget *ascend_pm;
- GtkWidget *descend_pm;
-} column_arrows;
+enum
+{
+ FRAME_COLUMN,
+ INFO_COLUMN,
+ TEXT_COLUMN,
+ N_COLUMN
+};
static void
sctp_error_dlg=NULL;
}
-static void add_to_clist(sctp_error_info_t* errinfo)
+static void
+sctp_error_on_select_row(GtkTreeSelection *sel, gpointer user_data _U_)
{
- gint added_row, i;
- gchar *data[NUM_COLS];
- gchar field[NUM_COLS][30];
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ if (gtk_tree_selection_get_selected (sel, &model, &iter)) {
+ gtk_tree_model_get(model, &iter,
+ FRAME_COLUMN, &(selected_packet->frame_number),
+ TEXT_COLUMN, &(selected_packet->chunk_info),
+ INFO_COLUMN, &(selected_packet->info_text),
+ -1);
+ }
+}
- for (i=0; i<NUM_COLS; i++)
- data[i]=&field[i][0];
+static
+GtkWidget *create_list(void)
+{
+ GtkListStore *list_store;
+ GtkWidget * list;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeView *list_view;
+ GtkTreeSelection *selection;
+
+ list_store = gtk_list_store_new(N_COLUMN,
+ G_TYPE_UINT, /* Frame number*/
+ G_TYPE_STRING, /* Chunk type*/
+ G_TYPE_STRING );/* Info */
+
+ /* Create a view */
+ list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
+
+ list_view = GTK_TREE_VIEW(list);
+
+#if GTK_CHECK_VERSION(2,6,0)
+ /* Speed up the list display */
+ gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
+#endif
- /*printf("errinfo=%s\n",errinfo->chunk_info);*/
+ gtk_tree_view_set_headers_clickable(list_view, TRUE);
+
+ /* 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
+ */
+ /* 1:st column */
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("Framenumber", renderer,
+ "text", FRAME_COLUMN,
+ NULL);
+
+ gtk_tree_view_column_set_sort_column_id(column, FRAME_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 (list_view, column);
+
+ /* 2:nd column... */
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("Chunk Types", renderer,
+ "text", TEXT_COLUMN,
+ NULL);
+ gtk_tree_view_column_set_sort_column_id(column, INFO_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, 200);
+ gtk_tree_view_append_column (list_view, column);
+
+ /* 3:d column... */
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("Info", renderer,
+ "text", INFO_COLUMN,
+ NULL);
+ gtk_tree_view_column_set_sort_column_id(column, TEXT_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, 200);
+ 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);
+ g_signal_connect(selection, "changed", G_CALLBACK(sctp_error_on_select_row), NULL);
+ return list;
+}
- g_snprintf(field[0], 20, "%u", errinfo->frame_number);
- g_snprintf(field[1], 20, "%s", errinfo->chunk_info);
- g_snprintf(field[2], 20, "%s", errinfo->info_text);
- added_row = gtk_clist_append(GTK_CLIST(clist), data);
+static void add_to_clist(sctp_error_info_t* errinfo)
+{
+ GtkListStore *list_store = NULL;
+ GtkTreeIter iter;
+
+ list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (clist))); /* Get store */
- /* set data pointer of last row to point to user data for that row */
- gtk_clist_set_row_data(GTK_CLIST(clist), added_row, errinfo);
+#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
+ FRAME_COLUMN, errinfo->frame_number,
+ TEXT_COLUMN, errinfo->chunk_info,
+ INFO_COLUMN, errinfo->info_text,
+ -1);
}
static void
sctp_error_on_unselect(GtkButton *button _U_, gpointer user_data _U_)
{
- gtk_clist_unselect_all(GTK_CLIST(clist));
+ gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(clist)));
}
-void sctp_error_dlg_update(GList *list)
+static void sctp_error_dlg_update(GList *list)
{
-GList *ilist=NULL;
-printf("dlg_update\n");
- if (sctp_error_dlg != NULL) {
- gtk_clist_clear(GTK_CLIST(clist));
-printf("vor ilist\n");
- ilist=list;
- if (ilist==NULL)
- printf("=NULL\n");
- printf("nach ilist\n");
+ GList *ilist=NULL;
+
+ if (sctp_error_dlg != NULL)
+ {
+ gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(clist))));
+ ilist=list;
while (ilist)
{
- printf("while\n");
add_to_clist((sctp_error_info_t*)(ilist->data));
ilist = g_list_next(ilist);
}
sctp_error_on_unselect(NULL, NULL);
}
-printf("vor last_list\n");
last_list = ilist;
}
-static void
-sctp_error_on_select_row(GtkCList *clist,
- gint row,
- gint column _U_,
- GdkEventButton *event _U_,
- gpointer user_data _U_)
-{
-selected_packet = gtk_clist_get_row_data(GTK_CLIST(clist), row);
-}
-
static void
static void
-sctp_error_on_close (GtkButton *button _U_, gpointer user_data _U_)
+sctp_error_on_close (GtkButton *button _U_, gpointer user_data _U_)
{
gtk_grab_remove(sctp_error_dlg);
gtk_widget_destroy(sctp_error_dlg);
GtkWidget *bt_frame;
GtkWidget *bt_close;
- gchar *titles[NUM_COLS] = {"Framenumber","Chunk Types", "Info"};
- column_arrows *col_arrows;
- GtkStyle *win_style;
- GtkWidget *column_lb;
- int i;
-
- sctp_error_dlg_w = window_new (GTK_WINDOW_TOPLEVEL, "Ethereal: SCTP Associations");
+ sctp_error_dlg_w = window_new (GTK_WINDOW_TOPLEVEL, "Wireshark: SCTP Associations");
gtk_window_set_position (GTK_WINDOW (sctp_error_dlg_w), GTK_WIN_POS_CENTER);
- SIGNAL_CONNECT(sctp_error_dlg_w, "destroy", dlg_destroy,NULL);
+ g_signal_connect(sctp_error_dlg_w, "destroy", G_CALLBACK(dlg_destroy), NULL);
/* Container for each row of widgets */
vbox1 = gtk_vbox_new(FALSE, 2);
- gtk_container_border_width(GTK_CONTAINER(vbox1), 8);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox1), 8);
gtk_container_add(GTK_CONTAINER(sctp_error_dlg_w), vbox1);
gtk_widget_show(vbox1);
-/* sctp_error_dlg_w = gtk_dialog_new();
- gtk_window_set_title (GTK_WINDOW (sctp_error_dlg_w), "Ethereal: SCTP Malformed Packets");
-
- dialog_vbox1 = GTK_DIALOG (sctp_error_dlg_w)->vbox;
- gtk_widget_show (dialog_vbox1);
-
- vbox1 = gtk_vbox_new (FALSE, 0);
- gtk_widget_show (vbox1);
- gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (vbox1), 8);*/
-
scrolledwindow1 = scrolled_window_new (NULL, NULL);
gtk_widget_show (scrolledwindow1);
gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
- clist = gtk_clist_new (NUM_COLS);
+ clist = create_list();
gtk_widget_show (clist);
gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist);
- WIDGET_SET_SIZE(clist, 500, 200);
-
- gtk_clist_set_column_width (GTK_CLIST (clist), 0, 100);
- gtk_clist_set_column_width (GTK_CLIST (clist), 1, 200);
- gtk_clist_set_column_width (GTK_CLIST (clist), 2, 200);
-
- gtk_clist_set_column_justification(GTK_CLIST(clist), 0, GTK_JUSTIFY_CENTER);
- gtk_clist_set_column_justification(GTK_CLIST(clist), 1, GTK_JUSTIFY_LEFT);
- gtk_clist_set_column_justification(GTK_CLIST(clist), 2, GTK_JUSTIFY_LEFT);
-
- gtk_clist_column_titles_show (GTK_CLIST (clist));
-
- gtk_clist_set_sort_column(GTK_CLIST(clist), 0);
- gtk_clist_set_sort_type(GTK_CLIST(clist), GTK_SORT_ASCENDING);
+ gtk_widget_set_size_request(clist, 500, 200);
gtk_widget_show(sctp_error_dlg_w);
- col_arrows = (column_arrows *) g_malloc(sizeof(column_arrows) * NUM_COLS);
- win_style = gtk_widget_get_style(scrolledwindow1);
-
- 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);
-
- gtk_clist_set_column_widget(GTK_CLIST(clist), i, col_arrows[i].table);
- gtk_widget_show(col_arrows[i].table);
- }
-
hbuttonbox2 = gtk_hbutton_box_new ();
gtk_widget_show (hbuttonbox2);
gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox2, FALSE, FALSE, 0);
- gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbuttonbox2), 5);
+ gtk_box_set_spacing (GTK_BOX (hbuttonbox2), 5);
gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox2), GTK_BUTTONBOX_SPREAD);
gtk_widget_show (bt_frame);
gtk_container_add (GTK_CONTAINER (hbuttonbox2), bt_frame);
- bt_close = BUTTON_NEW_FROM_STOCK(GTK_STOCK_CLOSE);
+ bt_close = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
gtk_widget_show (bt_close);
gtk_container_add (GTK_CONTAINER (hbuttonbox2), bt_close);
- SIGNAL_CONNECT(sctp_error_dlg_w, "destroy", dlg_destroy, NULL);
- SIGNAL_CONNECT(clist, "select_row", sctp_error_on_select_row, NULL);
- SIGNAL_CONNECT(bt_unselect, "clicked", sctp_error_on_unselect, NULL);
- SIGNAL_CONNECT(bt_frame, "clicked", sctp_error_on_frame, NULL);
- SIGNAL_CONNECT(bt_close, "clicked", sctp_error_on_close, NULL);
+ g_signal_connect(sctp_error_dlg_w, "destroy", G_CALLBACK(dlg_destroy), NULL);
+ g_signal_connect(bt_unselect, "clicked", G_CALLBACK(sctp_error_on_unselect), NULL);
+ g_signal_connect(bt_frame, "clicked", G_CALLBACK(sctp_error_on_frame), NULL);
+ g_signal_connect(bt_close, "clicked", G_CALLBACK(sctp_error_on_close), NULL);
sctp_error_dlg = sctp_error_dlg_w;
-
}
void sctp_error_dlg_show(sctp_assoc_info_t* assoc)
{
-GList *list;
+ GList *list;
-
- /* selected_assoc=(sctp_assoc_info_t*)get_selected_assoc(); */
list =assoc->error_info_list;
if (list != NULL)
{
- if (sctp_error_dlg != NULL) {
- /* There's already a dialog box; reactivate it. */
- reactivate_window(sctp_error_dlg);
- /* Another list since last call? */
- if (list != last_list) {
+ if (sctp_error_dlg != NULL) {
+ /* There's already a dialog box; reactivate it. */
+ reactivate_window(sctp_error_dlg);
+ /* Another list since last call? */
+ if (list != last_list) {
+ sctp_error_dlg_update(list);
+ }
+ }
+ else {
+ /* Create and show the dialog box */
+ gtk_sctperror_dlg();
sctp_error_dlg_update(list);
}
}
- else {
- /* Create and show the dialog box */
- gtk_sctperror_dlg();
- sctp_error_dlg_update(list);
- }
- }
else
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
"No errors found!");
}
-
-/*void sctp_error_start(GtkWidget *w _U_, gpointer data _U_)
-{
- if (sctp_stat_get_info()->is_registered==FALSE)
- register_tap_listener_sctp_stat();
- sctp_stat_scan();
- sctp_error_dlg_show(sctp_stat_get_info()->error_info_list);
-}*/
-
-/****************************************************************************/
-/*void
-register_tap_listener_sctp_error_dlg(void)
-{
- register_tap_menu_item("SCTP/Show All Malformed Packets...", REGISTER_TAP_GROUP_NONE,
- sctp_error_start, NULL, NULL, NULL);
-}*/