static char * fi_get_string(field_info *fi) { gchar label_str[ITEM_LABEL_LENGTH]; gchar *label_ptr; if (!fi->rep) { label_ptr = label_str; proto_item_fill_label(fi, label_str); } else label_ptr = fi->rep->representation; if (FI_GET_FLAG(fi, FI_GENERATED)) { if (FI_GET_FLAG(fi, FI_HIDDEN)) label_ptr = g_strdup_printf("<[%s]>", label_ptr); else label_ptr = g_strdup_printf("[%s]", label_ptr); } else if (FI_GET_FLAG(fi, FI_HIDDEN)) label_ptr = g_strdup_printf("<%s>", label_ptr); else label_ptr = g_strdup(label_ptr); return label_ptr; }
unsigned FieldInformation::flag(unsigned mask) { if (fi_) { return FI_GET_FLAG(fi_, mask); } return 0; }
/* WSLUA_ATTRIBUTE FieldInfo_generated RO Whether this field was marked as generated (boolean) */ static int FieldInfo_get_generated(lua_State* L) { /* Whether this field was marked as generated. */ FieldInfo fi = checkFieldInfo(L,1); lua_pushboolean(L,FI_GET_FLAG(fi->ws_fi, FI_GENERATED)); return 1; }
bool FieldInformation::isLink() const { if (fi_ && fi_->hfinfo) { if((fi_->hfinfo->type == FT_FRAMENUM) || (FI_GET_FLAG(fi_, FI_URL) && IS_FT_STRING(fi_->hfinfo->type))) { return true; } } return false; }
/* set's the PI_ flags to a protocol item * (and its parent items till the toplevel) */ static void expert_set_item_flags(proto_item *pi, const int group, const guint severity) { if (pi != NULL && PITEM_FINFO(pi) != NULL && (severity >= FI_GET_FLAG(PITEM_FINFO(pi), PI_SEVERITY_MASK))) { FI_REPLACE_FLAGS(PITEM_FINFO(pi), PI_GROUP_MASK, group); FI_REPLACE_FLAGS(PITEM_FINFO(pi), PI_SEVERITY_MASK, severity); /* propagate till toplevel item */ pi = proto_item_get_parent(pi); expert_set_item_flags(pi, group, severity); } }
void ProtoTree::itemDoubleClick(QTreeWidgetItem *item, int column) { Q_UNUSED(column); field_info *fi; fi = item->data(0, Qt::UserRole).value<field_info *>(); if(fi->hfinfo->type == FT_FRAMENUM) { emit goToFrame(fi->value.value.uinteger); } if(FI_GET_FLAG(fi, FI_URL) && IS_FT_STRING(fi->hfinfo->type)) { gchar *url; url = fvalue_to_string_repr(&fi->value, FTREPR_DISPLAY, NULL); if(url){ // browser_open_url(url); QDesktopServices::openUrl(QUrl(url)); g_free(url); } } }
static void finfo_integer_common(struct FieldinfoWinData *DataPtr, guint64 u_val) { const field_info *finfo = DataPtr->finfo; const header_field_info *hfinfo = finfo->hfinfo; /* XXX, appendix? */ unsigned int finfo_offset = DataPtr->start_offset + finfo->start; int finfo_length = finfo->length; if (finfo_offset <= DataPtr->frame->cap_len && finfo_offset + finfo_length <= DataPtr->frame->cap_len) { guint32 u_mask = hfinfo->bitmask; while (finfo_length--) { guint8 *ptr = (FI_GET_FLAG(finfo, FI_LITTLE_ENDIAN)) ? &(DataPtr->pd[finfo_offset++]) : &(DataPtr->pd[finfo_offset + finfo_length]); if (u_mask) { guint8 n_val = *ptr; int i; for (i = 0; i < 8; i++) { if (u_mask & 1) { if (u_val & 1) n_val |= (1 << i); else n_val &= ~(1 << i); } u_mask >>= 1; u_val >>= 1; } *ptr = n_val; if (!u_mask) break; } else { *ptr = u_val & 0xff; u_val >>= 8; } }
/* Fill a single protocol tree item with its string value and set its color. */ static void proto_tree_draw_node(proto_node *node, gpointer data) { field_info *fi = PNODE_FINFO(node); gchar label_str[ITEM_LABEL_LENGTH]; gchar *label_ptr; gboolean is_branch; /* dissection with an invisible proto tree? */ g_assert(fi); if (PROTO_ITEM_IS_HIDDEN(node) && !prefs.display_hidden_proto_items) return; // Fill in our label /* was a free format label produced? */ if (fi->rep) { label_ptr = fi->rep->representation; } else { /* no, make a generic label */ label_ptr = label_str; proto_item_fill_label(fi, label_str); } if (node->first_child != NULL) { is_branch = TRUE; g_assert(fi->tree_type >= 0 && fi->tree_type < num_tree_types); } else { is_branch = FALSE; } if (PROTO_ITEM_IS_GENERATED(node)) { if (PROTO_ITEM_IS_HIDDEN(node)) { label_ptr = g_strdup_printf("<[%s]>", label_ptr); } else { label_ptr = g_strdup_printf("[%s]", label_ptr); } } else if (PROTO_ITEM_IS_HIDDEN(node)) { label_ptr = g_strdup_printf("<%s>", label_ptr); } QTreeWidgetItem *parentItem = (QTreeWidgetItem *)data; QTreeWidgetItem *item; ProtoTree *proto_tree = qobject_cast<ProtoTree *>(parentItem->treeWidget()); item = new QTreeWidgetItem(parentItem, 0); // Set our colors. QPalette pal = QApplication::palette(); if (fi && fi->hfinfo) { if(fi->hfinfo->type == FT_PROTOCOL) { item->setData(0, Qt::BackgroundRole, pal.alternateBase()); } if((fi->hfinfo->type == FT_FRAMENUM) || (FI_GET_FLAG(fi, FI_URL) && IS_FT_STRING(fi->hfinfo->type))) { QFont font = item->font(0); item->setData(0, Qt::ForegroundRole, pal.link()); font.setUnderline(true); item->setData(0, Qt::FontRole, font); if (fi->hfinfo->type == FT_FRAMENUM) { proto_tree->emitRelatedFrame(fi->value.value.uinteger); } } } // XXX - Add routines to get our severity colors. if(FI_GET_FLAG(fi, PI_SEVERITY_MASK)) { switch(FI_GET_FLAG(fi, PI_SEVERITY_MASK)) { case(PI_COMMENT): item->setData(0, Qt::BackgroundRole, expert_color_comment); break; case(PI_CHAT): item->setData(0, Qt::BackgroundRole, expert_color_chat); break; case(PI_NOTE): item->setData(0, Qt::BackgroundRole, expert_color_note); break; case(PI_WARN): item->setData(0, Qt::BackgroundRole, expert_color_warn); break; case(PI_ERROR): item->setData(0, Qt::BackgroundRole, expert_color_error); break; default: g_assert_not_reached(); } item->setData(0, Qt::ForegroundRole, expert_color_foreground); } item->setText(0, label_ptr); item->setData(0, Qt::UserRole, qVariantFromValue(fi)); if (PROTO_ITEM_IS_GENERATED(node) || PROTO_ITEM_IS_HIDDEN(node)) { g_free(label_ptr); } if (is_branch) { if (tree_expanded(fi->tree_type)) { item->setExpanded(true); } else { item->setExpanded(false); } proto_tree_children_foreach(node, proto_tree_draw_node, item); } }
static void expert_set_info_vformat(packet_info *pinfo, proto_item *pi, int group, int severity, int hf_index, gboolean use_vaformat, const char *format, va_list ap) { char formatted[ITEM_LABEL_LENGTH]; int tap; expert_info_t *ei; proto_tree *tree; proto_item *ti; if (pinfo == NULL && pi && pi->tree_data) { pinfo = PTREE_DATA(pi)->pinfo; } /* if this packet isn't loaded because of a read filter, don't output anything */ if (pinfo == NULL || pinfo->num == 0) { return; } if (severity > highest_severity) { highest_severity = severity; } /* XXX: can we get rid of these checks and make them programming errors instead now? */ if (pi != NULL && PITEM_FINFO(pi) != NULL) { expert_set_item_flags(pi, group, severity); } if ((pi == NULL) || (PITEM_FINFO(pi) == NULL) || ((guint)severity >= FI_GET_FLAG(PITEM_FINFO(pi), PI_SEVERITY_MASK))) { col_add_str(pinfo->cinfo, COL_EXPERT, val_to_str(severity, expert_severity_vals, "Unknown (%u)")); } if (use_vaformat) { g_vsnprintf(formatted, ITEM_LABEL_LENGTH, format, ap); } else { g_strlcpy(formatted, format, ITEM_LABEL_LENGTH); } tree = expert_create_tree(pi, group, severity, formatted); if (hf_index == -1) { /* If no filterable expert info, just add the message */ ti = proto_tree_add_string(tree, hf_expert_msg, NULL, 0, 0, formatted); PROTO_ITEM_SET_GENERATED(ti); } else { /* If filterable expert info, hide the "generic" form of the message, and generate the formatted filterable expert info */ ti = proto_tree_add_none_format(tree, hf_index, NULL, 0, 0, "%s", formatted); PROTO_ITEM_SET_GENERATED(ti); ti = proto_tree_add_string(tree, hf_expert_msg, NULL, 0, 0, formatted); PROTO_ITEM_SET_HIDDEN(ti); } ti = proto_tree_add_uint_format_value(tree, hf_expert_severity, NULL, 0, 0, severity, "%s", val_to_str_const(severity, expert_severity_vals, "Unknown")); PROTO_ITEM_SET_GENERATED(ti); ti = proto_tree_add_uint_format_value(tree, hf_expert_group, NULL, 0, 0, group, "%s", val_to_str_const(group, expert_group_vals, "Unknown")); PROTO_ITEM_SET_GENERATED(ti); tap = have_tap_listener(expert_tap); if (!tap) return; ei = wmem_new(wmem_packet_scope(), expert_info_t); ei->packet_num = pinfo->num; ei->group = group; ei->severity = severity; ei->hf_index = hf_index; ei->protocol = pinfo->current_proto; ei->summary = wmem_strdup(wmem_packet_scope(), formatted); /* if we have a proto_item (not a faked item), set expert attributes to it */ if (pi != NULL && PITEM_FINFO(pi) != NULL) { ei->pitem = pi; } /* XXX: remove this because we don't have an internal-only function now? */ else { ei->pitem = NULL; } tap_queue_packet(expert_tap, pinfo, ei); }
/* WSLUA_ATTRIBUTE FieldInfo_big_endian RO Whether this field is big-endian encoded (boolean). @since 1.99.8 */ static int FieldInfo_get_big_endian(lua_State* L) { FieldInfo fi = checkFieldInfo(L,1); lua_pushboolean(L,FI_GET_FLAG(fi->ws_fi, FI_BIG_ENDIAN)); return 1; }
/* WSLUA_ATTRIBUTE FieldInfo_is_url RO Whether this field was marked as being a URL (boolean). @since 1.99.8 */ static int FieldInfo_get_is_url(lua_State* L) { FieldInfo fi = checkFieldInfo(L,1); lua_pushboolean(L,FI_GET_FLAG(fi->ws_fi, FI_URL)); return 1; }
/* WSLUA_ATTRIBUTE FieldInfo_hidden RO Whether this field was marked as hidden (boolean). @since 1.99.8 */ static int FieldInfo_get_hidden(lua_State* L) { FieldInfo fi = checkFieldInfo(L,1); lua_pushboolean(L,FI_GET_FLAG(fi->ws_fi, FI_HIDDEN)); return 1; }
void ByteViewTab::protoTreeItemChanged(QTreeWidgetItem *current) { if (current && cap_file_) { field_info *fi; fi = current->data(0, Qt::UserRole).value<field_info *>(); int i = 0; ByteViewText *byte_view_text = qobject_cast<ByteViewText*>(widget(i)); while (byte_view_text) { if (byte_view_text->hasDataSource(fi->ds_tvb)) { QTreeWidgetItem *parent = current->parent(); field_info *parent_fi = NULL; int f_start = -1, f_end = -1, f_len = -1; guint32 bmask = 0x00; int fa_start = -1, fa_end = -1, fa_len = -1; int p_start = -1, p_end = -1, p_len = -1; guint len = tvb_length(fi->ds_tvb); // Find and highlight the protocol bytes while (parent && parent->parent()) { parent = parent->parent(); } if (parent) { parent_fi = parent->data(0, Qt::UserRole).value<field_info *>(); } if (parent_fi && parent_fi->ds_tvb == fi->ds_tvb) { p_start = parent_fi->start; p_len = parent_fi->length; } if (cap_file_->search_in_progress && (cap_file_->hex || (cap_file_->string && cap_file_->packet_data))) { /* In the hex view, only highlight the target bytes or string. The entire field can then be displayed by clicking on any of the bytes in the field. */ if (cap_file_->hex) { f_len = (int)strlen(cap_file_->sfilter)/2; } else { f_len = (int)strlen(cap_file_->sfilter); } f_start = cap_file_->search_pos - (f_len-1); } else { f_start = fi->start; f_len = fi->length; } /* bmask = finfo->hfinfo->bitmask << finfo->hfinfo->bitshift; */ /* (value & mask) >> shift */ if (fi->hfinfo) bmask = fi->hfinfo->bitmask; fa_start = fi->appendix_start; fa_len = fi->appendix_length; if (!FI_GET_FLAG(fi, FI_LITTLE_ENDIAN) && !FI_GET_FLAG(fi, FI_BIG_ENDIAN)) { /* unknown endianess - disable mask */ bmask = 0x00; } if (bmask == 0x00) { int bito = FI_GET_BITS_OFFSET(fi); int bitc = FI_GET_BITS_SIZE(fi); int bitt = bito + bitc; /* construct mask using bito & bitc */ /* XXX, mask has only 32 bit, later we can store bito&bitc, and use them (which should be faster) */ if (bitt > 0 && bitt < 32) { bmask = ((1 << bitc) - 1) << ((8-bitt) & 7); } } if (p_start >= 0 && p_len > 0 && (guint)p_start < len) { p_end = p_start + p_len; } if (f_start >= 0 && f_len > 0 && (guint)f_start < len) { f_end = f_start + f_len; } if (fa_start >= 0 && fa_len > 0 && (guint)fa_start < len) { fa_end = fa_start + fa_len; } if (f_end == -1 && fa_end != -1) { f_start = fa_start; bmask = 0x00; f_end = fa_end; fa_start = fa_end = -1; } /* don't exceed the end of available data */ if (p_end != -1 && (guint)p_end > len) p_end = len; if (f_end != -1 && (guint)f_end > len) f_end = len; if (fa_end != -1 && (guint)fa_end > len) fa_end = len; // Protocol byte_view_text->setProtocolHighlight(p_start, p_end); // Field bytes byte_view_text->setFieldHighlight(f_start, f_end); // Appendix (trailer) bytes byte_view_text->setFieldAppendixHighlight(fa_start, fa_end); byte_view_text->renderBytes(); setCurrentIndex(i); } byte_view_text = qobject_cast<ByteViewText*>(widget(++i)); } } }
static void expert_set_info_vformat(packet_info *pinfo, proto_item *pi, int group, int severity, const char *format, va_list ap) { char formatted[ITEM_LABEL_LENGTH]; int tap; expert_info_t *ei; proto_tree *tree; proto_item *ti; if (pinfo == NULL && pi && pi->tree_data) { pinfo = PTREE_DATA(pi)->pinfo; } /* if this packet isn't loaded because of a read filter, don't output anything */ if (pinfo == NULL || PINFO_FD_NUM(pinfo) == 0) { return; } if (severity > highest_severity) { highest_severity = severity; } if (pi != NULL && PITEM_FINFO(pi) != NULL) { expert_set_item_flags(pi, group, severity); } if ((pi == NULL) || (PITEM_FINFO(pi) == NULL) || ((guint)severity >= FI_GET_FLAG(PITEM_FINFO(pi), PI_SEVERITY_MASK))) { col_add_str(pinfo->cinfo, COL_EXPERT, val_to_str(severity, expert_severity_vals, "Unknown (%u)")); } g_vsnprintf(formatted, ITEM_LABEL_LENGTH, format, ap); tree = expert_create_tree(pi, group, severity, formatted); ti = proto_tree_add_string(tree, hf_expert_msg, NULL, 0, 0, formatted); PROTO_ITEM_SET_GENERATED(ti); ti = proto_tree_add_uint_format_value(tree, hf_expert_severity, NULL, 0, 0, severity, "%s", val_to_str_const(severity, expert_severity_vals, "Unknown")); PROTO_ITEM_SET_GENERATED(ti); ti = proto_tree_add_uint_format_value(tree, hf_expert_group, NULL, 0, 0, group, "%s", val_to_str_const(group, expert_group_vals, "Unknown")); PROTO_ITEM_SET_GENERATED(ti); tap = have_tap_listener(expert_tap); if (!tap) return; ei = ep_new(expert_info_t); ei->packet_num = PINFO_FD_NUM(pinfo); ei->group = group; ei->severity = severity; ei->protocol = pinfo->current_proto; ei->summary = ep_strdup(formatted); /* if we have a proto_item (not a faked item), set expert attributes to it */ if (pi != NULL && PITEM_FINFO(pi) != NULL) { ei->pitem = pi; } else { ei->pitem = NULL; } tap_queue_packet(expert_tap, pinfo, ei); }