diff options
author | Guy Harris <guy@alum.mit.edu> | 2012-05-14 00:49:05 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2012-05-14 00:49:05 +0000 |
commit | 14b616c35d40cce1ee05592f15e548183f1fb235 (patch) | |
tree | 917e02f5b08e86246f2b18c717a6818ab430d77d /epan/wslua | |
parent | 723b213c8909521bba4d0492b2110545898a9378 (diff) | |
download | wireshark-14b616c35d40cce1ee05592f15e548183f1fb235.tar.gz |
Get rid of remaining Booleans-as-encoding-arguments in
proto_tree_add_item() calls.
Add new "add_packet_field" method to the TreeItem class, taking a
protocol field (*not* a protocol), TvbRange, and encoding value as
arguments.
Add the ENC_ values to init.lua. Make them all hex #defines so
make-init-lua.pl can easily extract them.
Export tvb_unicode_strsize() for use by Lua (and elsewhere as desired).
Note that it handles UTF-16 and UTF-8, and fix the comment to note that
its count of hexadectets *does* include the null terminator (that's what
the code does).
svn path=/trunk/; revision=42621
Diffstat (limited to 'epan/wslua')
-rwxr-xr-x | epan/wslua/make-init-lua.pl | 31 | ||||
-rw-r--r-- | epan/wslua/template-init.lua | 2 | ||||
-rw-r--r-- | epan/wslua/wslua_tree.c | 97 |
3 files changed, 113 insertions, 17 deletions
diff --git a/epan/wslua/make-init-lua.pl b/epan/wslua/make-init-lua.pl index 73c2bdabfb..d22e503445 100755 --- a/epan/wslua/make-init-lua.pl +++ b/epan/wslua/make-init-lua.pl @@ -35,6 +35,7 @@ die "'$WSROOT' is not a directory" unless -d $WSROOT; my $wtap_encaps_table = ''; my $ft_types_table = ''; my $bases_table = ''; +my $encodings = ''; my $expert_pi = ''; my $menu_groups = ''; @@ -42,6 +43,7 @@ my %replacements = %{{ WTAP_ENCAPS => \$wtap_encaps_table, FT_TYPES => \$ft_types_table, BASES => \$bases_table, + ENCODINGS => \$encodings, EXPERT => \$expert_pi, MENU_GROUPS => \$menu_groups, }}; @@ -58,7 +60,9 @@ $template .= $_ while(<TEMPLATE>); close TEMPLATE; # -# make wiretap encapusulation table +# Extract values from wiretap/wtap.h: +# +# WTAP_ENCAP_ values # $wtap_encaps_table = "-- Wiretap encapsulations\nwtap = {\n"; @@ -74,7 +78,9 @@ while(<WTAP_H>) { $wtap_encaps_table =~ s/,\n$/\n}\n/msi; # -# enum fttype +# Extract values from epan/ftypes/ftypes.h: +# +# values from enum fttype # $ft_types_table = " -- Field Types\nftypes = {\n"; @@ -92,13 +98,15 @@ close FTYPES_H; $ft_types_table =~ s/,\n$/\n}\n/msi; - - # -# enum base +# Extract values from epan/proto.h: +# +# values from enum base +# #defines for encodings and expert group and severity levels # $bases_table = "-- Display Bases\n base = {\n"; +$encodings = "-- Encodings\n"; $expert_pi = "-- Expert flags and facilities\n"; my $base_num = 0; @@ -114,11 +122,19 @@ while(<PROTO_H>) { my ($name, $value) = ($1, hex($2)); $expert_pi .= "$name = $value\n"; } + + if ( /^.define\s+(ENC_[A-Z0-9_]+)\s+((0x)?[0-9A-Fa-f]+)/ ) { + my ($name, $value) = ($1, hex($2)); + $encodings .= "$name = $value\n"; + } } close PROTO_H; -# register_stat_group_t - +# +# Extract values from stat_menu.h: +# +# MENU_X_X values for register_stat_group_t +# $menu_groups .= "-- menu groups for register_menu\n"; my $menu_i = 0; @@ -135,6 +151,7 @@ close STAT_MENU; $bases_table .= "}\n\n"; +$encodings .= "\n\n"; $expert_pi .= "\n\n"; for my $key (keys %replacements) { diff --git a/epan/wslua/template-init.lua b/epan/wslua/template-init.lua index 75d74a6653..184c73aa66 100644 --- a/epan/wslua/template-init.lua +++ b/epan/wslua/template-init.lua @@ -64,6 +64,8 @@ end -- %BASES% +-- %ENCODINGS% + -- %EXPERT% -- %MENU_GROUPS% diff --git a/epan/wslua/wslua_tree.c b/epan/wslua/wslua_tree.c index 26b2b42ce6..dee65c997d 100644 --- a/epan/wslua/wslua_tree.c +++ b/epan/wslua/wslua_tree.c @@ -53,6 +53,82 @@ WSLUA_CLASS_DEFINE(TreeItem,NOP,NOP); /* TreeItems represent information in the packet-details pane. A root TreeItem is passed to dissectors as first argument. */ +WSLUA_METHOD TreeItem_add_packet_field(lua_State *L) { + /* + Adds an child item to a given item, returning the child. + tree_item:add_packet_field([proto_field], [tvbrange], [encoding], ...) + */ + TvbRange tvbr; + ProtoField field; + int hfid; + int ett; + ftenum_t type; + TreeItem tree_item = shiftTreeItem(L,1); + guint encoding; + proto_item* item = NULL; + + if (!tree_item) { + return luaL_error(L,"not a TreeItem!"); + } + if (tree_item->expired) { + luaL_error(L,"expired TreeItem"); + return 0; + } + + if (! ( field = shiftProtoField(L,1) ) ) { + luaL_error(L,"TreeField:add_packet_field not passed a ProtoField"); + return 0; + } + hfid = field->hfid; + type = field->type; + ett = field->ett; + + tvbr = shiftTvbRange(L,1); + if (!tvbr) { + /* No TvbRange specified */ + tvbr = ep_alloc(sizeof(struct _wslua_tvbrange)); + tvbr->tvb = ep_alloc(sizeof(struct _wslua_tvb)); + tvbr->tvb->ws_tvb = lua_tvb; + tvbr->offset = 0; + tvbr->len = 0; + } + + encoding = (guint)luaL_checknumber(L,1); + lua_remove(L,1); + if (type == FT_STRINGZ) { + switch (encoding & ENC_CHARENCODING_MASK) { + + case ENC_UTF_16: + case ENC_UCS_2: + /* tvb_unicode_strsize() returns a count of 16-bit + values; we need a count of bytes */ + tvbr->len = (tvb_unicode_strsize (tvbr->tvb->ws_tvb, tvbr->offset)) * 2; + break; + + default: + tvbr->len = tvb_strsize (tvbr->tvb->ws_tvb, tvbr->offset); + break; + } + } + item = proto_tree_add_item(tree_item->tree, hfid, tvbr->tvb->ws_tvb, tvbr->offset, tvbr->len, encoding); + + while(lua_gettop(L)) { + const gchar* s; + s = lua_tostring(L,1); + if (s) proto_item_append_text(item, " %s", s); + lua_remove(L,1); + } + + tree_item = g_malloc(sizeof(struct _wslua_treeitem)); + tree_item->item = item; + tree_item->tree = proto_item_add_subtree(item,ett > 0 ? ett : wslua_ett); + tree_item->expired = FALSE; + + PUSH_TREEITEM(L,tree_item); + + return 1; +} + static int TreeItem_add_item_any(lua_State *L, gboolean little_endian) { TvbRange tvbr; Proto proto; @@ -97,7 +173,7 @@ static int TreeItem_add_item_any(lua_State *L, gboolean little_endian) { if (lua_gettop(L)) { switch(type) { case FT_PROTOCOL: - item = proto_tree_add_item(tree_item->tree,hfid,tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len,FALSE); + item = proto_tree_add_item(tree_item->tree,hfid,tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len,ENC_NA); lua_pushnumber(L,0); lua_insert(L,1); break; @@ -160,7 +236,7 @@ static int TreeItem_add_item_any(lua_State *L, gboolean little_endian) { } else { if (type == FT_STRINGZ) tvbr->len = tvb_strsize (tvbr->tvb->ws_tvb, tvbr->offset); - item = proto_tree_add_item(tree_item->tree, hfid, tvbr->tvb->ws_tvb, tvbr->offset, tvbr->len, little_endian); + item = proto_tree_add_item(tree_item->tree, hfid, tvbr->tvb->ws_tvb, tvbr->offset, tvbr->len, little_endian ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN); } if ( lua_gettop(L) ) { @@ -352,15 +428,16 @@ static int TreeItem_gc(lua_State* L) { } static const luaL_reg TreeItem_methods[] = { - {"add", TreeItem_add}, - {"add_le", TreeItem_add_le}, - {"set_text", TreeItem_set_text}, - {"append_text", TreeItem_append_text}, - {"set_expert_flags", TreeItem_set_expert_flags}, - {"add_expert_info", TreeItem_add_expert_info}, - {"set_generated", TreeItem_set_generated}, + {"add_packet_field", TreeItem_add_packet_field}, + {"add", TreeItem_add}, + {"add_le", TreeItem_add_le}, + {"set_text", TreeItem_set_text}, + {"append_text", TreeItem_append_text}, + {"set_expert_flags", TreeItem_set_expert_flags}, + {"add_expert_info", TreeItem_add_expert_info}, + {"set_generated", TreeItem_set_generated}, {"set_hidden", TreeItem_set_hidden}, - {"set_len", TreeItem_set_len}, + {"set_len", TreeItem_set_len}, { NULL, NULL } }; |