From aa2c87df8791a94f397ce219ca1c8481be626897 Mon Sep 17 00:00:00 2001 From: Balint Reczey Date: Mon, 29 Jun 2009 22:22:30 +0000 Subject: Added option to show not dissected packet data on a separate packet bytes pane. It makes offsets in the not dissected data easier to follow. svn path=/trunk/; revision=28885 --- epan/dissectors/packet-data.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'epan/dissectors/packet-data.c') diff --git a/epan/dissectors/packet-data.c b/epan/dissectors/packet-data.c index 27d49b3638..73e382fd59 100644 --- a/epan/dissectors/packet-data.c +++ b/epan/dissectors/packet-data.c @@ -29,6 +29,7 @@ #include #include +#include #include "packet-data.h" /* proto_data cannot be static because it's referenced in the @@ -38,9 +39,12 @@ int proto_data = -1; static int hf_data_data = -1; static int hf_data_len = -1; +static gboolean hf_pref_data_new_pane = FALSE; static gint ett_data = -1; +void proto_reg_handoff_data(void); + static void dissect_data(tvbuff_t *tvb, packet_info *pinfo _U_ , proto_tree *tree) { @@ -49,15 +53,26 @@ dissect_data(tvbuff_t *tvb, packet_info *pinfo _U_ , proto_tree *tree) if (tree) { bytes = tvb_length_remaining(tvb, 0); if (bytes > 0) { - proto_item *ti = proto_tree_add_protocol_format(tree, proto_data, tvb, + tvbuff_t *data_tvb; + proto_item *ti; + proto_tree *data_tree; + if (hf_pref_data_new_pane) { + guint8 *real_data = tvb_memdup(tvb, 0, bytes); + data_tvb = tvb_new_child_real_data(tvb,real_data,bytes,bytes); + tvb_set_free_cb(data_tvb, g_free); + add_new_data_source(pinfo, data_tvb, "Not dissected data bytes"); + } else { + data_tvb = tvb; + } + ti = proto_tree_add_protocol_format(tree, proto_data, tvb, 0, bytes, "Data (%d byte%s)", bytes, plurality(bytes, "", "s")); - proto_tree *data_tree = proto_item_add_subtree(ti, ett_data); + data_tree = proto_item_add_subtree(ti, ett_data); - proto_tree_add_item(data_tree, hf_data_data, tvb, 0, bytes, FALSE); + proto_tree_add_item(data_tree, hf_data_data, data_tvb, 0, bytes, FALSE); - ti = proto_tree_add_int(data_tree, hf_data_len, tvb, 0, 0, bytes); + ti = proto_tree_add_int(data_tree, hf_data_len, data_tvb, 0, 0, bytes); PROTO_ITEM_SET_GENERATED (ti); } } @@ -76,7 +91,9 @@ proto_register_data(void) static gint *ett[] = { &ett_data }; - + + module_t *module_data; + proto_data = proto_register_protocol ( "Data", /* name */ "Data", /* short name */ @@ -87,10 +104,21 @@ proto_register_data(void) proto_register_field_array(proto_data, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); - + + module_data = prefs_register_protocol( proto_data, proto_reg_handoff_data); + prefs_register_bool_preference(module_data, + "datapref.newpane", + "Show not dissected data on new Packet Bytes pane", + "Show not dissected data on new Packet Bytes pane", + &hf_pref_data_new_pane); /* * "Data" is used to dissect something whose normal dissector * is disabled, so it cannot itself be disabled. */ proto_set_cant_toggle(proto_data); } + +void +proto_reg_handoff_data(void) +{ +} -- cgit v1.2.3