static gboolean finfo_window_refresh(struct FieldinfoWinData *DataPtr) { field_info *old_finfo = DataPtr->finfo; field_info *finfo; epan_dissect_t edt; const guint8 *data; GtkWidget *byte_view; gchar label_str[ITEM_LABEL_LENGTH]; /* always update byteviews */ if (DataPtr->bv && (byte_view = get_notebook_bv_ptr(DataPtr->bv))) { int pos_inside = DataPtr->pd_offset - DataPtr->start_offset - old_finfo->start; if (pos_inside < 0 || pos_inside >= old_finfo->length) pos_inside = -1; data = DataPtr->pd + DataPtr->start_offset + old_finfo->start; packet_hex_editor_print(byte_view, data, DataPtr->frame, pos_inside, DataPtr->pd_bitoffset, old_finfo->length); } if (DataPtr->app_bv && (byte_view = get_notebook_bv_ptr(DataPtr->app_bv))) { int pos_inside = DataPtr->pd_offset - DataPtr->start_offset - old_finfo->appendix_start; if (pos_inside < 0 || pos_inside >= old_finfo->appendix_length) pos_inside = -1; data = DataPtr->pd + DataPtr->start_offset + old_finfo->appendix_start; packet_hex_editor_print(byte_view, data, DataPtr->frame, pos_inside, DataPtr->pd_bitoffset, old_finfo->appendix_length); } /* redisect */ epan_dissect_init(&edt, DataPtr->epan, TRUE, TRUE); /* Makes any sense? if (old_finfo->hfinfo) proto_tree_prime_hfid(edt.tree, old_finfo->hfinfo->id); */ epan_dissect_run(&edt, &DataPtr->phdr, frame_tvbuff_new(DataPtr->frame, DataPtr->pd), DataPtr->frame, NULL); /* Try to find finfo which looks like old_finfo. * We might not found one, if protocol requires specific magic values, etc... */ if (!(finfo = proto_finfo_find(edt.tree, old_finfo))) { epan_dissect_cleanup(&edt); gtk_entry_set_text(GTK_ENTRY(DataPtr->repr), "[finfo not found, try with another value, or restore old. If you think it is bug, fill bugreport]"); return FALSE; } /* XXX, update fvalue_edit, e.g. when hexedit was changed */ if (finfo->rep == NULL) { proto_item_fill_label(finfo, label_str); gtk_entry_set_text(GTK_ENTRY(DataPtr->repr), label_str); } else gtk_entry_set_text(GTK_ENTRY(DataPtr->repr), finfo->rep->representation); epan_dissect_cleanup(&edt); return TRUE; }
/* Redraw a given byte view window. */ void redraw_packet_bytes(GtkWidget *nb, frame_data *fd, field_info *finfo) { GtkWidget *bv; const guint8 *data; guint len; bv = get_notebook_bv_ptr(nb); if (bv != NULL) { data = get_byte_view_data_and_length(bv, &len); if (data != NULL) packet_hex_print(bv, data, fd, finfo, len); } }