summaryrefslogtreecommitdiff
path: root/epan/wslua
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2012-05-14 00:49:05 +0000
committerGuy Harris <guy@alum.mit.edu>2012-05-14 00:49:05 +0000
commit14b616c35d40cce1ee05592f15e548183f1fb235 (patch)
tree917e02f5b08e86246f2b18c717a6818ab430d77d /epan/wslua
parent723b213c8909521bba4d0492b2110545898a9378 (diff)
downloadwireshark-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-xepan/wslua/make-init-lua.pl31
-rw-r--r--epan/wslua/template-init.lua2
-rw-r--r--epan/wslua/wslua_tree.c97
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 }
};