aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjfoster <jfoster@f5534014-38df-0310-8fa8-9805f1628bb7>2001-03-23 14:44:04 +0000
committerjfoster <jfoster@f5534014-38df-0310-8fa8-9805f1628bb7>2001-03-23 14:44:04 +0000
commit2bd994141313d00dd56ee0c63eac0384e8a4de26 (patch)
tree3f409c6b10b05a765a7b836578421e65d7a7e231
parenta5849bedec32c75d9049979e3a8d5546b9a767f5 (diff)
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. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@3165 f5534014-38df-0310-8fa8-9805f1628bb7
-rw-r--r--epan/epan.c7
-rw-r--r--epan/packet.c7
-rw-r--r--epan/packet.h4
-rw-r--r--epan/proto.c19
-rw-r--r--epan/proto.h5
-rw-r--r--epan/tvbuff.c15
-rw-r--r--epan/tvbuff.h6
-rw-r--r--file.c50
-rw-r--r--gtk/gtkglobals.h4
-rw-r--r--gtk/main.c51
-rw-r--r--gtk/packet_win.c62
-rw-r--r--gtk/proto_draw.c271
-rw-r--r--gtk/proto_draw.h29
13 files changed, 432 insertions, 98 deletions
diff --git a/epan/epan.c b/epan/epan.c
index 7ebf350f12..d18f40eccf 100644
--- a/epan/epan.c
+++ b/epan/epan.c
@@ -1,6 +1,6 @@
/* epan.h
*
- * $Id: epan.c,v 1.6 2001/02/01 20:21:16 gram Exp $
+ * $Id: epan.c,v 1.7 2001/03/23 14:44:01 jfoster Exp $
*
* Ethereal Protocol Analyzer Library
*
@@ -77,6 +77,11 @@ epan_dissect_new(void* pseudo_header, const guint8* data, frame_data *fd, proto_
edt = g_new(epan_dissect_t, 1);
+ /* start with empty data source list */
+ if ( fd->data_src)
+ g_slist_free( fd->data_src);
+ fd->data_src = 0;
+
/* XXX - init tree */
edt->tree = tree;
diff --git a/epan/packet.c b/epan/packet.c
index 3fa6e4a56b..405e1398ad 100644
--- a/epan/packet.c
+++ b/epan/packet.c
@@ -1,7 +1,7 @@
/* packet.c
* Routines for packet disassembly
*
- * $Id: packet.c,v 1.22 2001/03/22 16:24:16 gram Exp $
+ * $Id: packet.c,v 1.23 2001/03/23 14:44:01 jfoster Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -1073,7 +1073,10 @@ dissect_packet(tvbuff_t **p_tvb, union wtap_pseudo_header *pseudo_header,
col_set_writable(fd, TRUE);
TRY {
- *p_tvb = tvb_new_real_data(pd, fd->cap_len, fd->pkt_len);
+ *p_tvb = tvb_new_real_data(pd, fd->cap_len, fd->pkt_len, "Frame");
+ /* Add this tvbuffer into the data_src list */
+ fd->data_src = g_slist_append( fd->data_src, *p_tvb);
+
pi.compat_top_tvb = *p_tvb;
}
CATCH(BoundsError) {
diff --git a/epan/packet.h b/epan/packet.h
index fd857c8be8..7a8882c4d0 100644
--- a/epan/packet.h
+++ b/epan/packet.h
@@ -1,7 +1,7 @@
/* packet.h
* Definitions for packet disassembly structures and routines
*
- * $Id: packet.h,v 1.23 2001/03/15 06:41:13 guy Exp $
+ * $Id: packet.h,v 1.24 2001/03/23 14:44:01 jfoster Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -100,6 +100,7 @@ typedef struct _frame_data {
struct _frame_data *next; /* Next element in list */
struct _frame_data *prev; /* Previous element in list */
GSList *pfd; /* Per frame proto data */
+ GSList *data_src; /* Frame data sources */
guint32 num; /* Frame number */
guint32 pkt_len; /* Packet length */
guint32 cap_len; /* Amount actually captured */
@@ -131,6 +132,7 @@ typedef enum {
AT_ATALK, /* Appletalk DDP */
AT_VINES, /* Banyan Vines */
AT_OSI, /* OSI NSAP */
+ AT_DLCI /* Frame Relay DLCI */
} address_type;
typedef struct _address {
diff --git a/epan/proto.c b/epan/proto.c
index 0f54f2c528..fc9a6b50a4 100644
--- a/epan/proto.c
+++ b/epan/proto.c
@@ -1,7 +1,7 @@
/* proto.c
* Routines for protocol tree
*
- * $Id: proto.c,v 1.14 2001/03/15 22:08:41 guy Exp $
+ * $Id: proto.c,v 1.15 2001/03/23 14:44:02 jfoster Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -1460,6 +1460,9 @@ proto_tree_add_pi(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start, gint
return pi;
}
+/* The default name for a NullTVB. This removed when all dissectors use tvbuffs */
+static gchar* null_tvb_ds_name = "Frame";
+
static field_info *
alloc_field_info(int hfindex, tvbuff_t *tvb, gint start, gint length)
{
@@ -1481,6 +1484,14 @@ alloc_field_info(int hfindex, tvbuff_t *tvb, gint start, gint length)
fi->value = fvalue_new(fi->hfinfo->type);
+ /* add the data source name */
+ /* This has the hack to return a default name for NullTVB. This */
+ /* hack can be removed when all dissectors use tvbuffs */
+ if ( tvb)
+ fi->ds_name = tvb_get_name(tvb);
+ else
+ fi->ds_name = null_tvb_ds_name;
+
return fi;
}
@@ -2595,6 +2606,7 @@ proto_get_finfo_ptr_array(proto_tree *tree, int id)
typedef struct {
guint offset;
field_info *finfo;
+ gchar *name;
} offset_search_t;
static gboolean
@@ -2604,7 +2616,7 @@ check_for_offset(GNode *node, gpointer data)
offset_search_t *offsearch = data;
/* !fi == the top most container node which holds nothing */
- if (fi && fi->visible) {
+ if (fi && fi->visible && !strcmp( offsearch->name,fi->ds_name)) {
if (offsearch->offset >= fi->start &&
offsearch->offset < (fi->start + fi->length)) {
@@ -2624,12 +2636,13 @@ check_for_offset(GNode *node, gpointer data)
* siblings of each node myself. When I have more time I'll do that.
* (yeah right) */
field_info*
-proto_find_field_from_offset(proto_tree *tree, guint offset)
+proto_find_field_from_offset(proto_tree *tree, guint offset, char* ds_name)
{
offset_search_t offsearch;
offsearch.offset = offset;
offsearch.finfo = NULL;
+ offsearch.name = ds_name;
g_node_traverse((GNode*)tree, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
check_for_offset, &offsearch);
diff --git a/epan/proto.h b/epan/proto.h
index 6aa31830f9..d5d16b45c9 100644
--- a/epan/proto.h
+++ b/epan/proto.h
@@ -1,7 +1,7 @@
/* proto.h
* Definitions for protocol display
*
- * $Id: proto.h,v 1.8 2001/03/02 23:10:11 gram Exp $
+ * $Id: proto.h,v 1.9 2001/03/23 14:44:02 jfoster Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -121,6 +121,7 @@ typedef struct field_info {
char *representation; /* for GUI tree */
int visible;
fvalue_t *value;
+ gchar *ds_name; /* data source name */
} field_info;
@@ -558,6 +559,6 @@ char*
proto_alloc_dfilter_string(field_info *finfo, guint8 *pd);
field_info*
-proto_find_field_from_offset(proto_tree *tree, guint offset);
+proto_find_field_from_offset(proto_tree *tree, guint offset, gchar *ds_name);
#endif /* proto.h */
diff --git a/epan/tvbuff.c b/epan/tvbuff.c
index d2152bc679..1d6f3f2407 100644
--- a/epan/tvbuff.c
+++ b/epan/tvbuff.c
@@ -9,7 +9,7 @@
* the data of a backing tvbuff, or can be a composite of
* other tvbuffs.
*
- * $Id: tvbuff.c,v 1.15 2001/03/13 21:34:27 gram Exp $
+ * $Id: tvbuff.c,v 1.16 2001/03/23 14:44:02 jfoster Exp $
*
* Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org>
*
@@ -69,6 +69,7 @@ struct tvbuff {
tvbuff_type type;
gboolean initialized;
guint usage_count;
+ gchar* ds_name; /* data source name */
/* The tvbuffs in which this tvbuff is a member
* (that is, a backing tvbuff for a TVBUFF_SUBSET
@@ -319,7 +320,7 @@ tvb_set_real_data(tvbuff_t* tvb, const guint8* data, guint length, gint reported
}
tvbuff_t*
-tvb_new_real_data(const guint8* data, guint length, gint reported_length)
+tvb_new_real_data(const guint8* data, guint length, gint reported_length, const gchar* ds_name)
{
tvbuff_t *tvb;
@@ -329,6 +330,9 @@ tvb_new_real_data(const guint8* data, guint length, gint reported_length)
tvb_set_real_data(tvb, data, length, reported_length);
+ /* set the data source name */
+ tvb->ds_name = g_strdup( ds_name);
+
CLEANUP_POP;
return tvb;
@@ -497,6 +501,7 @@ tvb_new_subset(tvbuff_t *backing, gint backing_offset, gint backing_length, gint
tvb_set_subset(tvb, backing, backing_offset, backing_length, reported_length);
+ tvb->ds_name = backing->ds_name;
CLEANUP_POP;
return tvb;
@@ -1568,3 +1573,9 @@ tvb_bytes_to_str(tvbuff_t *tvb, gint offset, gint len)
{
return bytes_to_str(tvb_get_ptr(tvb, offset, len), len);
}
+
+gchar*
+tvb_get_name(tvbuff_t* tvb)
+{
+ return tvb->ds_name;
+}
diff --git a/epan/tvbuff.h b/epan/tvbuff.h
index 21f224fbb4..0c043dda64 100644
--- a/epan/tvbuff.h
+++ b/epan/tvbuff.h
@@ -9,7 +9,7 @@
* the data of a backing tvbuff, or can be a composite of
* other tvbuffs.
*
- * $Id: tvbuff.h,v 1.11 2001/03/13 21:34:27 gram Exp $
+ * $Id: tvbuff.h,v 1.12 2001/03/23 14:44:02 jfoster Exp $
*
* Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org>
*
@@ -139,7 +139,7 @@ void tvb_set_child_real_data_tvbuff(tvbuff_t* parent, tvbuff_t* child);
void tvb_set_real_data(tvbuff_t*, const guint8* data, guint length, gint reported_length);
/* Combination of tvb_new() and tvb_set_real_data(). Can throw ReportedBoundsError. */
-tvbuff_t* tvb_new_real_data(const guint8* data, guint length, gint reported_length);
+tvbuff_t* tvb_new_real_data(const guint8* data, guint length, gint reported_length, const gchar *name);
/* Define the subset of the backing buffer to use.
@@ -363,6 +363,8 @@ gint tvb_strncaseeql(tvbuff_t *tvb, gint offset, const guint8 *str, gint size);
*/
gchar *tvb_bytes_to_str(tvbuff_t *tvb, gint offset, gint len);
+gchar *tvb_get_name(tvbuff_t *tvb);
+
/************** END OF ACCESSORS ****************/
/* Sets pd and offset so that tvbuff's can be used with code
diff --git a/file.c b/file.c
index 2cf10d547b..2d9406f3e3 100644
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
/* file.c
* File I/O routines
*
- * $Id: file.c,v 1.232 2001/02/11 09:28:15 guy Exp $
+ * $Id: file.c,v 1.233 2001/03/23 14:43:59 jfoster Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -89,7 +89,7 @@
#include "globals.h"
#include "gtk/colors.h"
-extern GtkWidget *packet_list, *info_bar, *byte_view, *tree_view;
+extern GtkWidget *packet_list, *info_bar, *byte_nb_ptr, *tree_view;
extern guint file_ctx;
gboolean auto_scroll_live = FALSE;
@@ -771,6 +771,7 @@ read_packet(capture_file *cf, int offset)
fdata->next = NULL;
fdata->prev = NULL;
fdata->pfd = NULL;
+ fdata->data_src = NULL;
fdata->pkt_len = phdr->len;
fdata->cap_len = phdr->caplen;
fdata->file_off = offset;
@@ -990,6 +991,10 @@ rescan_packets(capture_file *cf, const char *action, gboolean refilter,
g_slist_free(fdata->pfd);
}
fdata->pfd = NULL;
+ if (fdata->data_src) { /* release data source list */
+ g_slist_free(fdata->data_src);
+ }
+ fdata->data_src = NULL;
}
wtap_seek_read (cf->wth, fdata->file_off, &cf->pseudo_header,
@@ -1017,6 +1022,10 @@ rescan_packets(capture_file *cf, const char *action, gboolean refilter,
g_slist_free(fdata->pfd);
}
fdata->pfd = NULL;
+ if (fdata->data_src) {
+ g_slist_free(fdata->data_src);
+ }
+ fdata->data_src = NULL;
}
}
@@ -1222,8 +1231,7 @@ print_packets(capture_file *cf, print_args_t *print_args)
if (print_args->print_hex) {
/* Print the full packet data as hex. */
- print_hex_data(cf->print_fh, print_args->format, cf->pd,
- fdata->cap_len, fdata->flags.encoding);
+ print_hex_data(cf->print_fh, print_args->format, fdata);
}
/* Print a blank line if we print anything after this. */
@@ -1364,12 +1372,25 @@ static void
clear_tree_and_hex_views(void)
{
/* Clear the hex dump. */
- gtk_text_freeze(GTK_TEXT(byte_view));
- gtk_text_set_point(GTK_TEXT(byte_view), 0);
- gtk_text_forward_delete(GTK_TEXT(byte_view),
- gtk_text_get_length(GTK_TEXT(byte_view)));
- gtk_text_thaw(GTK_TEXT(byte_view));
+ GtkWidget *byte_view;
+ int i;
+
+/* Get the current tab scroll window, then get the text widget */
+/* from the E_BYTE_VIEW_TEXT_INFO_KEY data field */
+
+ i = gtk_notebook_get_current_page( GTK_NOTEBOOK(byte_nb_ptr));
+
+ if ( i >= 0){
+ byte_view = gtk_notebook_get_nth_page( GTK_NOTEBOOK(byte_nb_ptr), i);
+ byte_view = gtk_object_get_data(GTK_OBJECT(byte_view), E_BYTE_VIEW_TEXT_INFO_KEY);
+
+ gtk_text_freeze(GTK_TEXT(byte_view));
+ gtk_text_set_point(GTK_TEXT(byte_view), 0);
+ gtk_text_forward_delete(GTK_TEXT(byte_view),
+ gtk_text_get_length(GTK_TEXT(byte_view)));
+ gtk_text_thaw(GTK_TEXT(byte_view));
+ }
/* Remove all nodes in ctree. This is how it's done in testgtk.c in GTK+ */
gtk_clist_clear ( GTK_CLIST(tree_view) );
@@ -1516,6 +1537,8 @@ void
select_packet(capture_file *cf, int row)
{
frame_data *fdata;
+ tvbuff_t *bv_tvb;
+ int i;
/* Get the frame data struct pointer for this frame */
fdata = (frame_data *) gtk_clist_get_row_data(GTK_CLIST(packet_list), row);
@@ -1569,8 +1592,15 @@ select_packet(capture_file *cf, int row)
/* Display the GUI protocol tree and hex dump. */
clear_tree_and_hex_views();
+
+ i = 0;
+ while((bv_tvb = g_slist_nth_data ( cf->current_frame->data_src, i++))){
+ add_byte_view( tvb_get_name( bv_tvb), tvb_get_ptr(bv_tvb, 0, -1), tvb_length(bv_tvb));
+ }
+
proto_tree_draw(cf->protocol_tree, tree_view);
- packet_hex_print(GTK_TEXT(byte_view), cf->pd, cf->current_frame, NULL);
+
+ set_notebook_page( byte_nb_ptr, 0);
/* A packet is selected. */
set_menus_for_selected_packet(TRUE);
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);