diff options
author | Jeff Foster <jfoste@woodward.com> | 2001-03-23 14:44:04 +0000 |
---|---|---|
committer | Jeff Foster <jfoste@woodward.com> | 2001-03-23 14:44:04 +0000 |
commit | 395b68ea19c7309f32d663776e1b3da37bff0a5b (patch) | |
tree | 3f409c6b10b05a765a7b836578421e65d7a7e231 /gtk | |
parent | c5791fac0cd877c895db31fc1ac4bb92a0c2c225 (diff) | |
download | wireshark-395b68ea19c7309f32d663776e1b3da37bff0a5b.tar.gz wireshark-395b68ea19c7309f32d663776e1b3da37bff0a5b.tar.bz2 wireshark-395b68ea19c7309f32d663776e1b3da37bff0a5b.zip |
Changes required to support multiple named data sources.
Tvbuffers changed to added the data source name,
GUI and printing code changed to support these changes
and display the multiple hex views.
svn path=/trunk/; revision=3165
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkglobals.h | 4 | ||||
-rw-r--r-- | gtk/main.c | 51 | ||||
-rw-r--r-- | gtk/packet_win.c | 62 | ||||
-rw-r--r-- | gtk/proto_draw.c | 271 | ||||
-rw-r--r-- | gtk/proto_draw.h | 29 |
5 files changed, 342 insertions, 75 deletions
diff --git a/gtk/gtkglobals.h b/gtk/gtkglobals.h index 684cf5603e..028a866112 100644 --- a/gtk/gtkglobals.h +++ b/gtk/gtkglobals.h @@ -1,7 +1,7 @@ /* gtkglobals.h * GTK-related Global defines, etc. * - * $Id: gtkglobals.h,v 1.12 2001/03/02 23:10:12 gram Exp $ + * $Id: gtkglobals.h,v 1.13 2001/03/23 14:44:04 jfoster Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -31,7 +31,7 @@ #endif extern GtkWidget *top_level, *packet_list, *tree_view, - *byte_view, *info_bar; + *byte_nb_ptr, *info_bar; extern GdkFont *m_r_font, *m_b_font; extern guint m_font_height, m_font_width; diff --git a/gtk/main.c b/gtk/main.c index bdf08f9670..c90de092c9 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1,6 +1,6 @@ /* main.c * - * $Id: main.c,v 1.182 2001/03/02 23:10:12 gram Exp $ + * $Id: main.c,v 1.183 2001/03/23 14:44:04 jfoster Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -8,6 +8,8 @@ * * Richard Sharpe, 13-Feb-1999, added support for initializing structures * needed by dissect routines + * Jeff Foster, 2001/03/12, added support tabbed hex display windowss + * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -135,7 +137,7 @@ packet_info pi; capture_file cfile; -GtkWidget *top_level, *packet_list, *tree_view, *byte_view, +GtkWidget *top_level, *packet_list, *tree_view, *byte_nb_ptr, *info_bar, *tv_scrollw, *pkt_scrollw; static GtkWidget *bv_scrollw; GdkFont *m_r_font, *m_b_font; @@ -414,26 +416,44 @@ static void packet_list_select_cb(GtkWidget *w, gint row, gint col, gpointer evt) { blank_packetinfo(); + +/* Remove the hex display tabbed pages */ + while( (gtk_notebook_get_nth_page( GTK_NOTEBOOK(byte_nb_ptr), 0))) + gtk_notebook_remove_page( GTK_NOTEBOOK(byte_nb_ptr), 0); + select_packet(&cfile, row); } + static void packet_list_unselect_cb(GtkWidget *w, gint row, gint col, gpointer evt) { + unselect_packet(&cfile); } + static void tree_view_select_row_cb(GtkCTree *ctree, GList *node, gint column, gpointer user_data) { field_info *finfo; gchar *help_str = NULL; gboolean has_blurb = FALSE; - guint length = 0; + guint length = 0, byte_len; + GtkWidget *byte_view; + guint8 *byte_data; g_assert(node); finfo = gtk_ctree_node_get_row_data( ctree, GTK_CTREE_NODE(node) ); if (!finfo) return; + set_notebook_page( byte_nb_ptr, find_notebook_page( byte_nb_ptr, finfo->ds_name)); + + byte_view = gtk_object_get_data(GTK_OBJECT(byte_nb_ptr), E_BYTE_VIEW_TEXT_INFO_KEY); + byte_data = gtk_object_get_data(GTK_OBJECT(byte_view), E_BYTE_VIEW_DATA_PTR_KEY); + byte_len = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(byte_view), E_BYTE_VIEW_DATA_LEN_KEY)); + + g_assert(byte_data); + finfo_selected = finfo; set_menus_for_selected_tree_row(TRUE); @@ -456,18 +476,28 @@ tree_view_select_row_cb(GtkCTree *ctree, GList *node, gint column, gpointer user g_free(help_str); } - packet_hex_print(GTK_TEXT(byte_view), cfile.pd, cfile.current_frame, - finfo); + packet_hex_print(GTK_TEXT(byte_view), byte_data, cfile.current_frame, + finfo, byte_len); } static void tree_view_unselect_row_cb(GtkCTree *ctree, GList *node, gint column, gpointer user_data) { + GtkWidget *byte_view; + guint8 *data; + gint len; + field_info* fi; + + fi = (field_info*)user_data; + + len = get_byte_view_and_data( byte_nb_ptr, &byte_view, &data); + + if ( len < 0) return; gtk_statusbar_pop(GTK_STATUSBAR(info_bar), help_ctx); finfo_selected = NULL; set_menus_for_selected_tree_row(FALSE); - packet_hex_print(GTK_TEXT(byte_view), cfile.pd, cfile.current_frame, - NULL); + packet_hex_print(GTK_TEXT(byte_view), data, cfile.current_frame, + NULL, len); } void collapse_all_cb(GtkWidget *widget, gpointer data) { @@ -1576,9 +1606,13 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) gtk_widget_show(tree_view); /* Byte view. */ - create_byte_view(bv_size, l_pane, &byte_view, &bv_scrollw, + create_byte_view(bv_size, l_pane, &byte_nb_ptr, &bv_scrollw, prefs->gui_scrollbar_on_right); + gtk_signal_connect(GTK_OBJECT(byte_nb_ptr), "button_press_event", + GTK_SIGNAL_FUNC(popup_menu_handler), + gtk_object_get_data(GTK_OBJECT(popup_menu_object), PM_HEXDUMP_KEY)); + /* Filter/info box */ stat_hbox = gtk_hbox_new(FALSE, 1); gtk_container_border_width(GTK_CONTAINER(stat_hbox), 0); @@ -1631,4 +1665,3 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) gtk_widget_show(top_level); } - diff --git a/gtk/packet_win.c b/gtk/packet_win.c index 09a649c49c..af4092a7d5 100644 --- a/gtk/packet_win.c +++ b/gtk/packet_win.c @@ -3,7 +3,7 @@ * * Copyright 2000, Jeffrey C. Foster <jfoste@woodward.com> * - * $Id: packet_win.c,v 1.18 2001/02/11 09:28:17 guy Exp $ + * $Id: packet_win.c,v 1.19 2001/03/23 14:44:04 jfoster Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -77,7 +77,7 @@ struct PacketWinData { GtkWidget *tv_scrollw; GtkWidget *tree_view; GtkWidget *bv_scrollw; - GtkWidget *byte_view; + GtkWidget *bv_nb_ptr; field_info *finfo_selected; epan_dissect_t *edt; }; @@ -132,9 +132,12 @@ static void create_new_window ( char *Title, gint tv_size, gint bv_size){ GtkWidget *main_w, *main_vbox, *pane, - *tree_view, *byte_view, *tv_scrollw, - *bv_scrollw; + *tree_view, *tv_scrollw, + *bv_scrollw, + *bv_nb_ptr; struct PacketWinData *DataPtr; + int i; + tvbuff_t* bv_tvb; main_w = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -159,7 +162,7 @@ create_new_window ( char *Title, gint tv_size, gint bv_size){ gtk_widget_show(tree_view); /* Byte view */ - create_byte_view(bv_size, pane, &byte_view, &bv_scrollw, + create_byte_view(bv_size, pane, &bv_nb_ptr, &bv_scrollw, prefs.gui_scrollbar_on_right); /* Allocate data structure to represent this window. */ @@ -177,7 +180,7 @@ create_new_window ( char *Title, gint tv_size, gint bv_size){ DataPtr->main = main_w; DataPtr->tv_scrollw = tv_scrollw; DataPtr->tree_view = tree_view; - DataPtr->byte_view = byte_view; + DataPtr->bv_nb_ptr = bv_nb_ptr; DataPtr->bv_scrollw = bv_scrollw; detail_windows = g_list_append(detail_windows, DataPtr); @@ -193,8 +196,14 @@ create_new_window ( char *Title, gint tv_size, gint bv_size){ /* draw the protocol tree & print hex data */ proto_tree_draw(DataPtr->protocol_tree, tree_view); - packet_hex_print(GTK_TEXT(byte_view), DataPtr->pd, DataPtr->frame, NULL); - + + i=0; /* do all the hex views */ + while((bv_tvb = g_slist_nth_data ( DataPtr->frame->data_src, i++))){ + add_byte_tab( DataPtr->bv_nb_ptr, tvb_get_name( bv_tvb), + tvb_get_ptr(bv_tvb, 0, -1), tvb_length(bv_tvb)); + + } + DataPtr->finfo_selected = NULL; gtk_widget_show(main_w); } @@ -218,6 +227,9 @@ new_tree_view_select_row_cb(GtkCTree *ctree, GList *node, gint column, /* called when a tree row is selected in the popup packet window */ field_info *finfo; + GtkWidget *byte_view; + guint8 *data; + int len, i; struct PacketWinData *DataPtr = (struct PacketWinData*)user_data; @@ -225,10 +237,20 @@ new_tree_view_select_row_cb(GtkCTree *ctree, GList *node, gint column, finfo = gtk_ctree_node_get_row_data( ctree, GTK_CTREE_NODE(node) ); if (!finfo) return; - DataPtr->finfo_selected = finfo; + i = find_notebook_page( DataPtr->bv_nb_ptr, finfo->ds_name); + set_notebook_page ( DataPtr->bv_nb_ptr, i); + len = get_byte_view_and_data( DataPtr->bv_nb_ptr, &byte_view, &data); + + if ( !byte_view) /* exit it no hex window to write in */ + return; + if ( len < 0){ + data = DataPtr->pd; + len = DataPtr->frame->cap_len; + } - packet_hex_print(GTK_TEXT(DataPtr->byte_view), DataPtr->pd, - DataPtr->frame, finfo); + DataPtr->finfo_selected = finfo; + packet_hex_print(GTK_TEXT(byte_view), data, + DataPtr->frame, finfo, len); } @@ -238,13 +260,22 @@ new_tree_view_unselect_row_cb(GtkCTree *ctree, GList *node, gint column, /* called when a tree row is unselected in the popup packet window */ - + guint8* data; + int len; + GtkWidget* byte_view; struct PacketWinData *DataPtr = (struct PacketWinData*)user_data; DataPtr->finfo_selected = NULL; - packet_hex_print(GTK_TEXT(DataPtr->byte_view), DataPtr->pd, - DataPtr->frame, NULL); + + len = get_byte_view_and_data( DataPtr->bv_nb_ptr, &byte_view, &data); + + if ( !byte_view) /* exit it no hex window to write in */ + return; + + g_assert( len >= 0); + packet_hex_reprint(GTK_TEXT(byte_view)); + } /* Functions called from elsewhere to act on all popup packet windows. */ @@ -271,8 +302,7 @@ redraw_hex_dump_cb(gpointer data, gpointer user_data) { struct PacketWinData *DataPtr = (struct PacketWinData *)data; - redraw_hex_dump(DataPtr->byte_view, DataPtr->pd, - DataPtr->frame, DataPtr->finfo_selected); + redraw_hex_dump(DataPtr->bv_nb_ptr, DataPtr->frame, DataPtr->finfo_selected); } /* Redraw the hex dump part of all the popup packet windows. */ diff --git a/gtk/proto_draw.c b/gtk/proto_draw.c index 6908c1c920..87b8640cc2 100644 --- a/gtk/proto_draw.c +++ b/gtk/proto_draw.c @@ -1,12 +1,14 @@ /* proto_draw.c * Routines for GTK+ packet display * - * $Id: proto_draw.c,v 1.28 2001/03/07 19:33:24 gram Exp $ + * $Id: proto_draw.c,v 1.29 2001/03/23 14:44:04 jfoster Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> * Copyright 1998 Gerald Combs * + * Jeff Foster, 2001/03/12, added support for displaying named + * data sources as tabbed hex windows * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -56,32 +58,115 @@ #define BYTE_VIEW_WIDTH 16 #define BYTE_VIEW_SEP 8 + +GtkWidget *byte_nb_ptr; + static void proto_tree_draw_node(GNode *node, gpointer data); + +GtkWidget* +get_notebook_bv_ptr( GtkWidget *nb_ptr){ + +/* Get the current text window for the notebook */ + return gtk_object_get_data(GTK_OBJECT(nb_ptr), E_BYTE_VIEW_TEXT_INFO_KEY); +} + + +int get_byte_view_data( GtkWidget *byte_view_notebook, guint8 **data_ptr) { + +/* get the data pointer and data length for a hex window */ +/* return the length of the data or -1 on error */ + + GtkWidget *byte_view = get_notebook_bv_ptr( byte_view_notebook); + + if ( !byte_view) + return -1; + if ((*data_ptr = gtk_object_get_data(GTK_OBJECT(byte_view), E_BYTE_VIEW_DATA_PTR_KEY))) + return GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(byte_view), + E_BYTE_VIEW_DATA_LEN_KEY)); + return -1; +} + + +int get_byte_view_and_data( GtkWidget *byte_view_notebook, GtkWidget **byte_view, guint8 **data_ptr) { + +/* Get both byte_view widget pointer and the data pointer */ +/* return the data length or -1 if error */ + + *byte_view = get_notebook_bv_ptr( byte_view_notebook); + if ( *byte_view) + return get_byte_view_data( byte_view_notebook, data_ptr); + return -1; +} + + +void +set_notebook_page( GtkWidget *nb_ptr, int num){ + +/* Set the current text window for the notebook and set the */ +/* text window pointer storage */ + + GtkWidget* child; + + gtk_notebook_set_page ( GTK_NOTEBOOK( nb_ptr), num); + + child = gtk_notebook_get_nth_page( GTK_NOTEBOOK(nb_ptr), num); + child = gtk_object_get_data(GTK_OBJECT(child), E_BYTE_VIEW_TEXT_INFO_KEY); + gtk_object_set_data(GTK_OBJECT(nb_ptr), E_BYTE_VIEW_TEXT_INFO_KEY, child); +} + + +int find_notebook_page( GtkWidget *nb_ptr, gchar *label){ + +/* find the notebook page number for this label */ + + int i = -1; + gchar *ptr; + GtkWidget* child; + + while(( child = gtk_notebook_get_nth_page(GTK_NOTEBOOK(nb_ptr), ++i))){ + child = gtk_notebook_get_tab_label(GTK_NOTEBOOK(nb_ptr), child); + gtk_notebook_get_tab_label(GTK_NOTEBOOK(nb_ptr), child); + gtk_label_get(GTK_LABEL(child), &ptr); + if (!strcmp( label, ptr)) + return i; + } + return -1; +} + + /* Redraw a given byte view window. */ void -redraw_hex_dump(GtkWidget *bv, guint8 *pd, frame_data *fd, field_info *finfo) +redraw_hex_dump(GtkWidget *nb, frame_data *fd, field_info *finfo) { - packet_hex_print(GTK_TEXT(bv), pd, fd, finfo); + GtkWidget* bv; + guint8* data; + int len; + + len = get_byte_view_and_data( byte_nb_ptr, &bv, &data); + if ( bv) + packet_hex_print(GTK_TEXT(bv), data, fd, finfo, len); } void redraw_hex_dump_all(void) { + if (cfile.current_frame != NULL) - redraw_hex_dump(byte_view, cfile.pd, cfile.current_frame, finfo_selected); + redraw_hex_dump( byte_nb_ptr, cfile.current_frame, finfo_selected); + redraw_hex_dump_packet_wins(); } - + static void expand_tree(GtkCTree *ctree, GtkCTreeNode *node, gpointer user_data) { field_info *finfo; gboolean *val; - finfo = gtk_ctree_node_get_row_data( ctree, node ); + finfo = gtk_ctree_node_get_row_data( ctree, node); g_assert(finfo); val = &tree_is_expanded[finfo->tree_type]; @@ -94,7 +179,7 @@ collapse_tree(GtkCTree *ctree, GtkCTreeNode *node, gpointer user_data) field_info *finfo; gboolean *val; - finfo = gtk_ctree_node_get_row_data( ctree, node ); + finfo = gtk_ctree_node_get_row_data( ctree, node); g_assert(finfo); val = &tree_is_expanded[finfo->tree_type]; @@ -122,6 +207,7 @@ byte_view_select(GtkWidget *widget, GdkEventButton *event, gpointer data) GtkText *bv = GTK_TEXT(widget); int row, column; int byte; + gchar *name; /* The column of the first hex digit in the first half */ const int digits_start_1 = 6; @@ -181,9 +267,11 @@ byte_view_select(GtkWidget *widget, GdkEventButton *event, gpointer data) /* Add the number of bytes from the previous rows. */ byte += row * 16; + /* Get the data source name */ + name = gtk_object_get_data(GTK_OBJECT(widget), E_BYTE_VIEW_NAME_KEY); /* Find the finfo that corresponds to our byte. */ - finfo = proto_find_field_from_offset(cfile.protocol_tree, byte); + finfo = proto_find_field_from_offset(cfile.protocol_tree, byte, name); if (!finfo) { return FALSE; @@ -239,14 +327,50 @@ byte_view_button_press_cb(GtkWidget *widget, GdkEvent *event, gpointer data) return FALSE; } + + void -create_byte_view(gint bv_size, GtkWidget *pane, GtkWidget **byte_view_p, +create_byte_view(gint bv_size, GtkWidget *pane, GtkWidget **byte_nb_p, GtkWidget **bv_scrollw_p, int pos) { - GtkWidget *byte_view, *byte_scrollw; + GtkWidget *byte_scrollw, *byte_nb; + + byte_nb = gtk_notebook_new(); + gtk_notebook_set_tab_pos ( GTK_NOTEBOOK(byte_nb), GTK_POS_BOTTOM); + + gtk_paned_pack2(GTK_PANED(pane), byte_nb, FALSE, FALSE); + gtk_widget_show(byte_nb); /* Byte view. Create a scrolled window for the text. */ byte_scrollw = gtk_scrolled_window_new(NULL, NULL); + *byte_nb_p = byte_nb; + *bv_scrollw_p = byte_scrollw; +} + + +void +byte_view_realize_cb( GtkWidget *bv, gpointer data){ + + guint8* byte_data = gtk_object_get_data(GTK_OBJECT(bv), E_BYTE_VIEW_DATA_PTR_KEY); + int byte_len = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(bv), E_BYTE_VIEW_DATA_LEN_KEY)); + + packet_hex_print(GTK_TEXT(bv), byte_data, cfile.current_frame, NULL, byte_len); + +} + + +GtkWidget *add_byte_tab( GtkWidget *byte_nb, const char *name, const guint8 *data, int len) +{ + GtkWidget *byte_view, *byte_scrollw, *label; + gchar *name_ptr; + + /* Byte view. Create a scrolled window for the text. */ + byte_scrollw = gtk_scrolled_window_new(NULL, NULL); + /* Add scrolled pane to tabbed window */ + label = gtk_label_new (name); + gtk_notebook_append_page (GTK_NOTEBOOK(byte_nb), byte_scrollw, label); + + /* Byte view. Create a scrolled window for the text. */ gtk_paned_pack2(GTK_PANED(pane), byte_scrollw, FALSE, FALSE); gtk_widget_set_usize(byte_scrollw, -1, bv_size); @@ -257,7 +381,7 @@ create_byte_view(gint bv_size, GtkWidget *pane, GtkWidget **byte_view_p, gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(byte_scrollw), /* Horizontal */GTK_POLICY_NEVER, /* Vertical*/ GTK_POLICY_ALWAYS); - set_scrollbar_placement_scrollw(byte_scrollw, pos); + set_scrollbar_placement_scrollw(byte_scrollw, prefs.gui_scrollbar_on_right); remember_scrolled_window(byte_scrollw); gtk_widget_show(byte_scrollw); @@ -265,36 +389,50 @@ create_byte_view(gint bv_size, GtkWidget *pane, GtkWidget **byte_view_p, gtk_text_set_editable(GTK_TEXT(byte_view), FALSE); gtk_text_set_word_wrap(GTK_TEXT(byte_view), FALSE); gtk_text_set_line_wrap(GTK_TEXT(byte_view), FALSE); + gtk_object_set_data(GTK_OBJECT(byte_view), E_BYTE_VIEW_DATA_PTR_KEY, data); + gtk_object_set_data(GTK_OBJECT(byte_view), E_BYTE_VIEW_DATA_LEN_KEY, GINT_TO_POINTER(len)); + gtk_label_get(GTK_LABEL(label), &name_ptr); + gtk_object_set_data(GTK_OBJECT(byte_view), E_BYTE_VIEW_NAME_KEY, name_ptr); gtk_container_add(GTK_CONTAINER(byte_scrollw), byte_view); - gtk_widget_show(byte_view); + + gtk_signal_connect(GTK_OBJECT(byte_view), "show", + GTK_SIGNAL_FUNC(byte_view_realize_cb), NULL); gtk_signal_connect(GTK_OBJECT(byte_view), "button_press_event", GTK_SIGNAL_FUNC(byte_view_button_press_cb), gtk_object_get_data(GTK_OBJECT(popup_menu_object), PM_HEXDUMP_KEY)); + gtk_widget_show(byte_view); - *byte_view_p = byte_view; - *bv_scrollw_p = byte_scrollw; + gtk_object_set_data(GTK_OBJECT(byte_scrollw), E_BYTE_VIEW_TEXT_INFO_KEY, + byte_view); + +/* no tabs if this is the first page */ + if ( !(gtk_notebook_page_num(GTK_NOTEBOOK(byte_nb), byte_scrollw))) + gtk_notebook_set_show_tabs ( GTK_NOTEBOOK(byte_nb), FALSE); + else + gtk_notebook_set_show_tabs ( GTK_NOTEBOOK(byte_nb), TRUE); + + return byte_view; +} + + +int add_byte_view(const char *name, const guint8 *data, int len){ + + add_byte_tab( byte_nb_ptr, name, data,len); + + return 0; } + void -packet_hex_print(GtkText *bv, guint8 *pd, frame_data *fd, field_info *finfo) +packet_hex_print_common(GtkText *bv, guint8 *pd, int len, int bstart, int bend, int encoding) { gint i = 0, j, k, cur; guchar line[128], hexchars[] = "0123456789abcdef", c = '\0'; GdkFont *cur_font, *new_font; - gint bstart, blen; - gint bend = -1; GdkColor *fg, *bg; gboolean reverse, newreverse; - if (finfo != NULL) { - bstart = finfo->start; - blen = finfo->length; - } else { - bstart = -1; - blen = -1; - } - /* Freeze the text for faster display */ gtk_text_freeze(bv); @@ -307,11 +445,7 @@ packet_hex_print(GtkText *bv, guint8 *pd, frame_data *fd, field_info *finfo) gtk_adjustment_set_value(bv->vadj, 0.0); gtk_text_forward_delete(bv, gtk_text_get_length(bv)); - if (bstart >= 0 && blen >= 0) { - bend = bstart + blen; - } - - while (i < fd->cap_len) { + while (i < len) { /* Print the line number */ sprintf(line, "%04x ", i); @@ -327,7 +461,7 @@ packet_hex_print(GtkText *bv, guint8 *pd, frame_data *fd, field_info *finfo) cur = 0; /* Print the hex bit */ while (i < k) { - if (i < fd->cap_len) { + if (i < len) { line[cur++] = hexchars[(pd[i] & 0xf0) >> 4]; line[cur++] = hexchars[pd[i] & 0x0f]; } else { @@ -374,11 +508,11 @@ packet_hex_print(GtkText *bv, guint8 *pd, frame_data *fd, field_info *finfo) fg = reverse ? &WHITE : &BLACK; bg = reverse ? &BLACK : &WHITE; while (i < k) { - if (i < fd->cap_len) { - if (fd->flags.encoding == CHAR_ASCII) { + if (i < len) { + if (encoding == CHAR_ASCII) { c = pd[i]; } - else if (fd->flags.encoding == CHAR_EBCDIC) { + else if (encoding == CHAR_EBCDIC) { c = EBCDIC_to_ASCII1(pd[i]); } else { @@ -428,7 +562,7 @@ packet_hex_print(GtkText *bv, guint8 *pd, frame_data *fd, field_info *finfo) cur = 0; /* Print the hex bit */ while (i < k) { - if (i < fd->cap_len) { + if (i < len) { line[cur++] = hexchars[(pd[i] & 0xf0) >> 4]; line[cur++] = hexchars[pd[i] & 0x0f]; } else { @@ -454,11 +588,11 @@ packet_hex_print(GtkText *bv, guint8 *pd, frame_data *fd, field_info *finfo) /* Print the ASCII bit */ cur_font = (i >= bstart && i < bend) ? m_b_font : m_r_font; while (i < k) { - if (i < fd->cap_len) { - if (fd->flags.encoding == CHAR_ASCII) { + if (i < len) { + if (encoding == CHAR_ASCII) { c = pd[i]; } - else if (fd->flags.encoding == CHAR_EBCDIC) { + else if (encoding == CHAR_EBCDIC) { c = EBCDIC_to_ASCII1(pd[i]); } else { @@ -488,17 +622,66 @@ packet_hex_print(GtkText *bv, guint8 *pd, frame_data *fd, field_info *finfo) /* scroll text into position */ gtk_text_thaw(bv); /* must thaw before adjusting scroll bars */ if ( bstart > 0 ) { - int linenum; + int lineheight, linenum; float scrollval; linenum = bstart / BYTE_VIEW_WIDTH; - scrollval = MIN(linenum * m_font_height, - bv->vadj->upper - bv->vadj->page_size); + /* This is the lineheight that the GtkText widget uses when drawing text. */ + lineheight = m_b_font->ascent + m_b_font->descent; + scrollval = MIN(linenum * lineheight,bv->vadj->upper - bv->vadj->page_size); gtk_adjustment_set_value(bv->vadj, scrollval); } } +void +packet_hex_print(GtkText *bv, guint8 *pd, frame_data *fd, field_info *finfo, int len){ + + /* do the initial printing and save the information needed */ + /* to redraw the display if preferences change. */ + + int bstart, bend = -1, blen; + + if (finfo != NULL) { + bstart = finfo->start; + blen = finfo->length; + } else { + bstart = -1; + blen = -1; + } + if (bstart >= 0 && blen >= 0) { + bend = bstart + blen; + } + + /* save the information needed to redraw the text */ + /* should we save the fd & finfo pointers instead ?? */ + gtk_object_set_data(GTK_OBJECT(bv), E_BYTE_VIEW_START_KEY, GINT_TO_POINTER(bend)); + gtk_object_set_data(GTK_OBJECT(bv), E_BYTE_VIEW_END_KEY, GINT_TO_POINTER(bstart)); + gtk_object_set_data(GTK_OBJECT(bv), E_BYTE_VIEW_ENCODE_KEY, GINT_TO_POINTER(fd->flags.encoding)); + + packet_hex_print_common( bv, pd, len, bstart, bend, fd->flags.encoding); + +} + +void +packet_hex_reprint(GtkText *bv){ + + /* redraw the text using the saved information, */ + /* usually called if the preferences haved changed. */ + + int start, end, len, encoding; + guint8 *data; + + start = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(bv), E_BYTE_VIEW_START_KEY)); + end = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(bv), E_BYTE_VIEW_END_KEY)); + len = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(bv), E_BYTE_VIEW_DATA_LEN_KEY)); + data = gtk_object_get_data(GTK_OBJECT(bv), E_BYTE_VIEW_DATA_PTR_KEY); + encoding = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(bv), E_BYTE_VIEW_ENCODE_KEY)); + + packet_hex_print_common( bv, data, len, start, end, encoding); +} + + /* List of all protocol tree widgets, so we can globally set the selection mode, line style, expander style, and font of all of them. */ static GList *ptree_widgets; @@ -635,7 +818,7 @@ create_tree_view(gint tv_size, e_prefs *prefs, GtkWidget *pane, /* Tree view */ tv_scrollw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(tv_scrollw), - GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); set_scrollbar_placement_scrollw(tv_scrollw, pos); remember_scrolled_window(tv_scrollw); gtk_paned_pack1(GTK_PANED(pane), tv_scrollw, TRUE, TRUE); @@ -714,9 +897,13 @@ proto_tree_draw_node(GNode *node, gpointer data) gchar *label_ptr; GtkCTreeNode *parent; gboolean is_leaf, is_expanded; + int i; if (!fi->visible) return; + i= find_notebook_page( byte_nb_ptr, fi->ds_name); + if ( i < 0) return; /* no notebook pages ?? */ + set_notebook_page( byte_nb_ptr, i); /* was a free format label produced? */ if (fi->representation) { diff --git a/gtk/proto_draw.h b/gtk/proto_draw.h index 033f88d27f..371ca75627 100644 --- a/gtk/proto_draw.h +++ b/gtk/proto_draw.h @@ -1,7 +1,7 @@ /* gtkpacket.h * Definitions for GTK+ packet display structures and routines * - * $Id: proto_draw.h,v 1.10 2000/09/09 10:26:58 guy Exp $ + * $Id: proto_draw.h,v 1.11 2001/03/23 14:44:04 jfoster Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -26,15 +26,32 @@ #ifndef __GTKPACKET_H__ #define __GTKPACKET_H__ +#define E_BYTE_VIEW_TEXT_INFO_KEY "byte_view_win" +#define E_BYTE_VIEW_DATA_PTR_KEY "byte_view_data" +#define E_BYTE_VIEW_DATA_LEN_KEY "byte_view_len" +#define E_BYTE_VIEW_START_KEY "byte_view_start" +#define E_BYTE_VIEW_END_KEY "byte_view_end" +#define E_BYTE_VIEW_ENCODE_KEY "byte_view_encode" +#define E_BYTE_VIEW_NAME_KEY "byte_view_name" + +GtkWidget *add_byte_tab( GtkWidget *byte_nb, const char *name, const guint8 *data, int len); +int add_byte_view( const char *name, const guint8 *data, int len); + +void set_notebook_page( GtkWidget *nb_ptr, int num); +int find_notebook_page( GtkWidget *nb_ptr, gchar *label); + + +GtkWidget *get_byte_view( GtkWidget *byte_view_notebook); +int get_byte_view_data( GtkWidget *byte_view_notebook, guint8 **data_ptr); +int get_byte_view_and_data( GtkWidget *byte_view_notebook, GtkWidget **byte_view, guint8 **data_ptr); + +void redraw_hex_dump(GtkWidget *nb, frame_data *fd, field_info *finfo); -void redraw_hex_dump(GtkWidget *bv, guint8 *pd, frame_data *fd, - field_info *finfo); void redraw_hex_dump_all(void); void create_byte_view(gint bv_size, GtkWidget *pane, GtkWidget **byte_view_p, GtkWidget **bv_scrollw_p, int pos); -void packet_hex_print(GtkText *, guint8 *, frame_data *, field_info *); - -#define E_TREEINFO_FIELD_INFO_KEY "tree_info_finfo" +void packet_hex_print(GtkText *, guint8 *, frame_data *, field_info *, int); +void packet_hex_reprint(GtkText *); void create_tree_view(gint tv_size, e_prefs *prefs, GtkWidget *pane, GtkWidget **tv_scrollw_p, GtkWidget **tree_view_p, int pos); |