#include <epan/tvbuff.h>
#include <epan/packet.h>
#include <epan/emem.h>
+#include <epan/expert.h>
#include "packet-range.h"
#include "print.h"
/* Open fake protocol wrapper */
fputs("<proto name=\"fake-field-wrapper\">\n", pdata->fh);
- /* Indent to increased level before writint out field */
+ /* Indent to increased level before writing out field */
pdata->level++;
for (i = -1; i < pdata->level; i++) {
fputs(" ", pdata->fh);
print_escaped_xml(pdata->fh, label_ptr);
fprintf(pdata->fh, "\" size=\"%d", fi->length);
- fprintf(pdata->fh, "\" pos=\"%d", fi->start);
+ if (node->parent && node->parent->finfo && (fi->start < node->parent->finfo->start)) {
+ fprintf(pdata->fh, "\" pos=\"%d", node->parent->finfo->start + fi->start);
+ } else {
+ fprintf(pdata->fh, "\" pos=\"%d", fi->start);
+ }
fputs("\" value=\"", pdata->fh);
write_pdml_field_hex_value(pdata, fi);
/* Write out field with data */
fputs("<field name=\"data\" value=\"", pdata->fh);
write_pdml_field_hex_value(pdata, fi);
- fputs("\"/>\n", pdata->fh);
+ fputs("\">\n", pdata->fh);
}
/* Normal protocols and fields */
else {
- if (fi->hfinfo->type == FT_PROTOCOL) {
+ if (fi->hfinfo->type == FT_PROTOCOL && fi->hfinfo->id != proto_expert) {
fputs("<proto name=\"", pdata->fh);
}
else {
fprintf(pdata->fh, "\" hide=\"yes");
fprintf(pdata->fh, "\" size=\"%d", fi->length);
- fprintf(pdata->fh, "\" pos=\"%d", fi->start);
+ if (node->parent && node->parent->finfo && (fi->start < node->parent->finfo->start)) {
+ fprintf(pdata->fh, "\" pos=\"%d", node->parent->finfo->start + fi->start);
+ } else {
+ fprintf(pdata->fh, "\" pos=\"%d", fi->start);
+ }
/* fprintf(pdata->fh, "\" id=\"%d", fi->hfinfo->id);*/
/* show, value, and unmaskedvalue attributes */
fputs(" ", pdata->fh);
}
/* Close off current element */
- if (fi->hfinfo->id != proto_data) { /* Data protocol uses simple tags */
+ /* Data and expert "protocols" use simple tags */
+ if (fi->hfinfo->id != proto_data && fi->hfinfo->id != proto_expert) {
if (fi->hfinfo->type == FT_PROTOCOL) {
fputs("</proto>\n", pdata->fh);
}
else {
fputs("</field>\n", pdata->fh);
}
+ } else {
+ fputs("</field>\n", pdata->fh);
}
}