forked from osmocom/wireshark
GTK: Remove packet editor
Removes limited experimental feature for deprecated UI. Change-Id: Ib3ccfae89dd2a674ebbde346a442fa1cf6587f26 Reviewed-on: https://code.wireshark.org/review/24563 Petri-Dish: João Valverde <j@v6e.pt> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
parent
e7b12d8550
commit
8fa4a440a8
|
@ -45,7 +45,6 @@ else()
|
||||||
endif()
|
endif()
|
||||||
option(ENABLE_QT5 "Use Qt5 instead of Qt4 to build wireshark" ON)
|
option(ENABLE_QT5 "Use Qt5 instead of Qt4 to build wireshark" ON)
|
||||||
option(ENABLE_PCAP "Enable libpcap support (required for capturing)" ON)
|
option(ENABLE_PCAP "Enable libpcap support (required for capturing)" ON)
|
||||||
option(WANT_PACKET_EDITOR "Enable packet editor (experimental)" ON)
|
|
||||||
#
|
#
|
||||||
# AirPcap support is available only on Windows. It might be nice to have it
|
# AirPcap support is available only on Windows. It might be nice to have it
|
||||||
# check whether the AirPcap SDK is available, and turn AirPcap support on
|
# check whether the AirPcap SDK is available, and turn AirPcap support on
|
||||||
|
|
11
cfile.h
11
cfile.h
|
@ -43,14 +43,6 @@ typedef enum {
|
||||||
SD_BACKWARD
|
SD_BACKWARD
|
||||||
} search_direction;
|
} search_direction;
|
||||||
|
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
/* XXX, where this struct should go? */
|
|
||||||
typedef struct {
|
|
||||||
struct wtap_pkthdr phdr; /**< Modified packet header */
|
|
||||||
char *pd; /**< Modified packet data */
|
|
||||||
} modified_frame_data;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct _capture_file {
|
typedef struct _capture_file {
|
||||||
epan_t *epan;
|
epan_t *epan;
|
||||||
file_state state; /* Current state of capture file */
|
file_state state; /* Current state of capture file */
|
||||||
|
@ -108,9 +100,6 @@ typedef struct _capture_file {
|
||||||
gint current_row; /* Row number for current frame */
|
gint current_row; /* Row number for current frame */
|
||||||
epan_dissect_t *edt; /* Protocol dissection for currently selected packet */
|
epan_dissect_t *edt; /* Protocol dissection for currently selected packet */
|
||||||
field_info *finfo_selected; /* Field info for currently selected field */
|
field_info *finfo_selected; /* Field info for currently selected field */
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
GTree *edited_frames; /* BST with modified frames */
|
|
||||||
#endif
|
|
||||||
gpointer window; /* Top-level window associated with file */
|
gpointer window; /* Top-level window associated with file */
|
||||||
GTree *frames_user_comments; /* BST with user comments for frames (key = frame_data) */
|
GTree *frames_user_comments; /* BST with user comments for frames (key = frame_data) */
|
||||||
gulong computed_elapsed; /* Elapsed time to load the file (in msec). */
|
gulong computed_elapsed; /* Elapsed time to load the file (in msec). */
|
||||||
|
|
|
@ -381,9 +381,6 @@
|
||||||
/* Define if we have QtWinExtras */
|
/* Define if we have QtWinExtras */
|
||||||
/* #cmakedefine QT_WINEXTRAS_LIB 1 */
|
/* #cmakedefine QT_WINEXTRAS_LIB 1 */
|
||||||
|
|
||||||
/* Support for packet editor */
|
|
||||||
#cmakedefine WANT_PACKET_EDITOR 1
|
|
||||||
|
|
||||||
/* Define to 1 if your processor stores words with the most significant byte
|
/* Define to 1 if your processor stores words with the most significant byte
|
||||||
first (like Motorola and SPARC, unlike Intel and VAX). */
|
first (like Motorola and SPARC, unlike Intel and VAX). */
|
||||||
#cmakedefine WORDS_BIGENDIAN 1
|
#cmakedefine WORDS_BIGENDIAN 1
|
||||||
|
|
|
@ -1098,14 +1098,6 @@ AC_ARG_ENABLE(wireshark,
|
||||||
enable_wireshark=$enableval,enable_wireshark=yes)
|
enable_wireshark=$enableval,enable_wireshark=yes)
|
||||||
AM_CONDITIONAL(BUILDING_WIRESHARK, test x$enable_wireshark = xyes)
|
AM_CONDITIONAL(BUILDING_WIRESHARK, test x$enable_wireshark = xyes)
|
||||||
|
|
||||||
AC_ARG_ENABLE(packet-editor,
|
|
||||||
AC_HELP_STRING( [--enable-packet-editor],
|
|
||||||
[add support for packet editor in Wireshark @<:@default=yes@:>@]),
|
|
||||||
enable_packet_editor=$enableval,enable_packet_editor=yes)
|
|
||||||
if test x$enable_packet_editor = xyes; then
|
|
||||||
AC_DEFINE(WANT_PACKET_EDITOR, 1, [Support for packet editor])
|
|
||||||
fi
|
|
||||||
|
|
||||||
GLIB_MIN_VERSION=2.22.0
|
GLIB_MIN_VERSION=2.22.0
|
||||||
AC_SUBST(GLIB_MIN_VERSION)
|
AC_SUBST(GLIB_MIN_VERSION)
|
||||||
# GLib checks; we require GLib $GLIB_MIN_VERSION or later, and require gmodule
|
# GLib checks; we require GLib $GLIB_MIN_VERSION or later, and require gmodule
|
||||||
|
|
|
@ -59,6 +59,7 @@ since version 2.4.0:
|
||||||
* Add Flow Graph functionality to TShark using -z
|
* Add Flow Graph functionality to TShark using -z
|
||||||
* Capinfos now prints SHA256 hashes in addition to RIPEMD160 and SHA1. MD5 output
|
* Capinfos now prints SHA256 hashes in addition to RIPEMD160 and SHA1. MD5 output
|
||||||
has been removed.
|
has been removed.
|
||||||
|
* Packet editor has been removed (GTK only experimental feature).
|
||||||
|
|
||||||
//=== Removed Dissectors
|
//=== Removed Dissectors
|
||||||
|
|
||||||
|
|
67
file.c
67
file.c
|
@ -413,12 +413,6 @@ cf_close(capture_file *cf)
|
||||||
free_frame_data_sequence(cf->frames);
|
free_frame_data_sequence(cf->frames);
|
||||||
cf->frames = NULL;
|
cf->frames = NULL;
|
||||||
}
|
}
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
if (cf->edited_frames) {
|
|
||||||
g_tree_destroy(cf->edited_frames);
|
|
||||||
cf->edited_frames = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (cf->frames_user_comments) {
|
if (cf->frames_user_comments) {
|
||||||
g_tree_destroy(cf->frames_user_comments);
|
g_tree_destroy(cf->frames_user_comments);
|
||||||
cf->frames_user_comments = NULL;
|
cf->frames_user_comments = NULL;
|
||||||
|
@ -1497,23 +1491,6 @@ cf_read_record_r(capture_file *cf, const frame_data *fdata,
|
||||||
int err;
|
int err;
|
||||||
gchar *err_info;
|
gchar *err_info;
|
||||||
|
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
/* if fdata->file_off == -1 it means packet was edited, and we must find data inside edited_frames tree */
|
|
||||||
if (G_UNLIKELY(fdata->file_off == -1)) {
|
|
||||||
const modified_frame_data *frame = (const modified_frame_data *) g_tree_lookup(cf->edited_frames, GINT_TO_POINTER(fdata->num));
|
|
||||||
|
|
||||||
if (!frame) {
|
|
||||||
simple_error_message_box("fdata->file_off == -1, but can't find modified frame.");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*phdr = frame->phdr;
|
|
||||||
ws_buffer_assure_space(buf, frame->phdr.caplen);
|
|
||||||
memcpy(ws_buffer_start_ptr(buf), frame->pd, frame->phdr.caplen);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!wtap_seek_read(cf->wth, fdata->file_off, phdr, buf, &err, &err_info)) {
|
if (!wtap_seek_read(cf->wth, fdata->file_off, phdr, buf, &err, &err_info)) {
|
||||||
cfile_read_failure_alert_box(cf->filename, err, err_info);
|
cfile_read_failure_alert_box(cf->filename, err, err_info);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -3953,50 +3930,6 @@ cf_add_ip_name_from_string(capture_file *cf, const char *addr, const char *name)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
static gint
|
|
||||||
g_direct_compare_func(gconstpointer a, gconstpointer b, gpointer user_data _U_)
|
|
||||||
{
|
|
||||||
if (a > b)
|
|
||||||
return 1;
|
|
||||||
else if (a < b)
|
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
modified_frame_data_free(gpointer data)
|
|
||||||
{
|
|
||||||
modified_frame_data *mfd = (modified_frame_data *)data;
|
|
||||||
|
|
||||||
g_free(mfd->pd);
|
|
||||||
g_free(mfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Give a frame new, edited data.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
cf_set_frame_edited(capture_file *cf, frame_data *fd,
|
|
||||||
struct wtap_pkthdr *phdr, guint8 *pd)
|
|
||||||
{
|
|
||||||
modified_frame_data *mfd = (modified_frame_data *)g_malloc(sizeof(modified_frame_data));
|
|
||||||
|
|
||||||
mfd->phdr = *phdr;
|
|
||||||
mfd->pd = (char *)pd;
|
|
||||||
|
|
||||||
if (cf->edited_frames == NULL)
|
|
||||||
cf->edited_frames = g_tree_new_full(g_direct_compare_func, NULL, NULL,
|
|
||||||
modified_frame_data_free);
|
|
||||||
g_tree_insert(cf->edited_frames, GINT_TO_POINTER(fd->num), mfd);
|
|
||||||
fd->file_off = -1;
|
|
||||||
|
|
||||||
/* Mark the file as having unsaved changes */
|
|
||||||
cf->unsaved_changes = TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
wtap_dumper *pdh;
|
wtap_dumper *pdh;
|
||||||
const char *fname;
|
const char *fname;
|
||||||
|
|
12
file.h
12
file.h
|
@ -718,18 +718,6 @@ guint32 cf_comment_types(capture_file *cf);
|
||||||
*/
|
*/
|
||||||
gboolean cf_add_ip_name_from_string(capture_file *cf, const char *addr, const char *name);
|
gboolean cf_add_ip_name_from_string(capture_file *cf, const char *addr, const char *name);
|
||||||
|
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
/**
|
|
||||||
* Give a frame new, edited data.
|
|
||||||
*
|
|
||||||
* @param cf the capture file
|
|
||||||
* @param fd frame_data structure for the frame
|
|
||||||
* @param phdr the struct wtap_pkthdr for the frame
|
|
||||||
* @param pd the raw packet data for the frame
|
|
||||||
*/
|
|
||||||
void cf_set_frame_edited(capture_file *cf, frame_data *fd, struct wtap_pkthdr *phdr, guint8 *pd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
|
@ -208,11 +208,7 @@ frame_tvbuff_new(const frame_data *fd, const guint8 *buf)
|
||||||
frame_tvb = (struct tvb_frame *) tvb;
|
frame_tvb = (struct tvb_frame *) tvb;
|
||||||
|
|
||||||
/* XXX, wtap_can_seek() */
|
/* XXX, wtap_can_seek() */
|
||||||
if (cfile.wth && cfile.wth->random_fh
|
if (cfile.wth && cfile.wth->random_fh) {
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
&& fd->file_off != -1 /* generic clone for modified packets */
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
frame_tvb->wth = cfile.wth;
|
frame_tvb->wth = cfile.wth;
|
||||||
frame_tvb->file_off = fd->file_off;
|
frame_tvb->file_off = fd->file_off;
|
||||||
frame_tvb->offset = 0;
|
frame_tvb->offset = 0;
|
||||||
|
@ -313,11 +309,7 @@ file_tvbuff_new(const frame_data *fd, const guint8 *buf)
|
||||||
frame_tvb = (struct tvb_frame *) tvb;
|
frame_tvb = (struct tvb_frame *) tvb;
|
||||||
|
|
||||||
/* XXX, wtap_can_seek() */
|
/* XXX, wtap_can_seek() */
|
||||||
if (cfile.wth && cfile.wth->random_fh
|
if (cfile.wth && cfile.wth->random_fh) {
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
&& fd->file_off != -1 /* generic clone for modified packets */
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
frame_tvb->wth = cfile.wth;
|
frame_tvb->wth = cfile.wth;
|
||||||
frame_tvb->file_off = fd->file_off;
|
frame_tvb->file_off = fd->file_off;
|
||||||
frame_tvb->offset = 0;
|
frame_tvb->offset = 0;
|
||||||
|
|
|
@ -98,9 +98,6 @@ static void bytes_view_adjustment_set(BytesView *);
|
||||||
static void
|
static void
|
||||||
bytes_view_init(BytesView *bv)
|
bytes_view_init(BytesView *bv)
|
||||||
{
|
{
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
gtk_widget_set_can_focus(GTK_WIDGET(bv), TRUE);
|
|
||||||
#endif
|
|
||||||
bv->context = NULL;
|
bv->context = NULL;
|
||||||
|
|
||||||
bv->encoding = PACKET_CHAR_ENC_CHAR_ASCII;
|
bv->encoding = PACKET_CHAR_ENC_CHAR_ASCII;
|
||||||
|
|
|
@ -171,14 +171,6 @@ new_window_cb_ref(GtkWidget *widget)
|
||||||
new_packet_window(widget, TRUE, FALSE);
|
new_packet_window(widget, TRUE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
static void
|
|
||||||
edit_window_cb(GtkWidget *widget _U_)
|
|
||||||
{
|
|
||||||
new_packet_window(widget, FALSE, TRUE);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
colorize_conversation_cb(conversation_filter_t* color_filter, int action_num)
|
colorize_conversation_cb(conversation_filter_t* color_filter, int action_num)
|
||||||
{
|
{
|
||||||
|
@ -816,9 +808,6 @@ static const char *ui_desc_menubar =
|
||||||
" <separator/>\n"
|
" <separator/>\n"
|
||||||
" <menuitem name='TimeShift' action='/Edit/TimeShift'/>\n"
|
" <menuitem name='TimeShift' action='/Edit/TimeShift'/>\n"
|
||||||
" <separator/>\n"
|
" <separator/>\n"
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
" <menuitem name='EditPacket' action='/Edit/EditPacket'/>\n"
|
|
||||||
#endif
|
|
||||||
" <menuitem name='AddEditPktComment' action='/Edit/AddEditPktComment'/>\n"
|
" <menuitem name='AddEditPktComment' action='/Edit/AddEditPktComment'/>\n"
|
||||||
" <menuitem name='AddEditCaptureComment' action='/Edit/AddEditCaptureComment'/>\n"
|
" <menuitem name='AddEditCaptureComment' action='/Edit/AddEditCaptureComment'/>\n"
|
||||||
" <separator/>\n"
|
" <separator/>\n"
|
||||||
|
@ -1326,9 +1315,6 @@ static const GtkActionEntry main_menu_bar_entries[] = {
|
||||||
|
|
||||||
{ "/Edit/ConfigurationProfiles", NULL, "_Configuration Profiles...", "<shift><control>A", NULL, G_CALLBACK(profile_dialog_cb) },
|
{ "/Edit/ConfigurationProfiles", NULL, "_Configuration Profiles...", "<shift><control>A", NULL, G_CALLBACK(profile_dialog_cb) },
|
||||||
{ "/Edit/Preferences", GTK_STOCK_PREFERENCES, "_Preferences...", "<shift><control>P", NULL, G_CALLBACK(menus_prefs_cb) },
|
{ "/Edit/Preferences", GTK_STOCK_PREFERENCES, "_Preferences...", "<shift><control>P", NULL, G_CALLBACK(menus_prefs_cb) },
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
{ "/Edit/EditPacket", NULL, "_Edit Packet", NULL, NULL, G_CALLBACK(edit_window_cb) },
|
|
||||||
#endif
|
|
||||||
{ "/Edit/AddEditPktComment", WIRESHARK_STOCK_EDIT, "Packet Comment...", "<alt><control>C", NULL, G_CALLBACK(edit_packet_comment_dlg) },
|
{ "/Edit/AddEditPktComment", WIRESHARK_STOCK_EDIT, "Packet Comment...", "<alt><control>C", NULL, G_CALLBACK(edit_packet_comment_dlg) },
|
||||||
{ "/Edit/AddEditCaptureComment", NULL, "Capture Comment...", "<shift><alt><control>C", NULL, G_CALLBACK(edit_capture_comment_dlg_launch) },
|
{ "/Edit/AddEditCaptureComment", NULL, "Capture Comment...", "<shift><alt><control>C", NULL, G_CALLBACK(edit_capture_comment_dlg_launch) },
|
||||||
|
|
||||||
|
@ -2122,9 +2108,6 @@ static const char *ui_desc_packet_list_menu_popup =
|
||||||
" <menuitem name='IgnorePacket' action='/IgnorePacket'/>\n"
|
" <menuitem name='IgnorePacket' action='/IgnorePacket'/>\n"
|
||||||
" <menuitem name='SetTimeReference' action='/Set Time Reference'/>\n"
|
" <menuitem name='SetTimeReference' action='/Set Time Reference'/>\n"
|
||||||
" <menuitem name='TimeShift' action='/TimeShift'/>\n"
|
" <menuitem name='TimeShift' action='/TimeShift'/>\n"
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
" <menuitem name='EditPacket' action='/Edit/EditPacket'/>\n"
|
|
||||||
#endif
|
|
||||||
" <menuitem name='AddEditPktComment' action='/Edit/AddEditPktComment'/>\n"
|
" <menuitem name='AddEditPktComment' action='/Edit/AddEditPktComment'/>\n"
|
||||||
" <separator/>\n"
|
" <separator/>\n"
|
||||||
" <menuitem name='ManuallyResolveAddress' action='/ManuallyResolveAddress'/>\n"
|
" <menuitem name='ManuallyResolveAddress' action='/ManuallyResolveAddress'/>\n"
|
||||||
|
@ -2207,9 +2190,6 @@ static const GtkActionEntry packet_list_menu_popup_action_entries[] = {
|
||||||
{ "/Set Time Reference", WIRESHARK_STOCK_TIME, "Set Time Reference (toggle)", NULL, NULL, G_CALLBACK(packet_list_menu_set_ref_time_cb) },
|
{ "/Set Time Reference", WIRESHARK_STOCK_TIME, "Set Time Reference (toggle)", NULL, NULL, G_CALLBACK(packet_list_menu_set_ref_time_cb) },
|
||||||
{ "/TimeShift", WIRESHARK_STOCK_TIME, "Time Shift...", NULL, NULL, G_CALLBACK(time_shift_cb) },
|
{ "/TimeShift", WIRESHARK_STOCK_TIME, "Time Shift...", NULL, NULL, G_CALLBACK(time_shift_cb) },
|
||||||
{ "/ManuallyResolveAddress", NULL, "Manually Resolve Address", NULL, NULL, G_CALLBACK(manual_addr_resolv_dlg) },
|
{ "/ManuallyResolveAddress", NULL, "Manually Resolve Address", NULL, NULL, G_CALLBACK(manual_addr_resolv_dlg) },
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
{ "/Edit/EditPacket", NULL, "_Edit Packet", NULL, NULL, G_CALLBACK(edit_window_cb) },
|
|
||||||
#endif
|
|
||||||
{ "/Edit/AddEditPktComment", WIRESHARK_STOCK_EDIT, "Packet Comment...", NULL, NULL, G_CALLBACK(edit_packet_comment_dlg) },
|
{ "/Edit/AddEditPktComment", WIRESHARK_STOCK_EDIT, "Packet Comment...", NULL, NULL, G_CALLBACK(edit_packet_comment_dlg) },
|
||||||
|
|
||||||
{ "/Conversation Filter", NULL, "Conversation Filter", NULL, NULL, NULL },
|
{ "/Conversation Filter", NULL, "Conversation Filter", NULL, NULL, NULL },
|
||||||
|
@ -2307,9 +2287,6 @@ static const char *ui_desc_tree_view_menu_popup =
|
||||||
" </menu>\n"
|
" </menu>\n"
|
||||||
" </menu>\n"
|
" </menu>\n"
|
||||||
" <menuitem name='ExportSelectedPacketBytes' action='/ExportSelectedPacketBytes'/>\n"
|
" <menuitem name='ExportSelectedPacketBytes' action='/ExportSelectedPacketBytes'/>\n"
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
" <menuitem name='EditPacket' action='/Edit/EditPacket'/>\n"
|
|
||||||
#endif
|
|
||||||
" <separator/>\n"
|
" <separator/>\n"
|
||||||
" <menuitem name='WikiProtocolPage' action='/WikiProtocolPage'/>\n"
|
" <menuitem name='WikiProtocolPage' action='/WikiProtocolPage'/>\n"
|
||||||
" <menuitem name='FilterFieldReference' action='/FilterFieldReference'/>\n"
|
" <menuitem name='FilterFieldReference' action='/FilterFieldReference'/>\n"
|
||||||
|
@ -2365,9 +2342,6 @@ static const GtkActionEntry tree_view_menu_popup_action_entries[] = {
|
||||||
{ "/Copy/Bytes/BinaryStream", NULL, "Binary Stream", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_bin_strm_cb) },
|
{ "/Copy/Bytes/BinaryStream", NULL, "Binary Stream", NULL, NULL, G_CALLBACK(packet_list_menu_copy_bytes_bin_strm_cb) },
|
||||||
|
|
||||||
{ "/ExportSelectedPacketBytes", NULL, "Export Selected Packet Bytes...", NULL, NULL, G_CALLBACK(savehex_cb) },
|
{ "/ExportSelectedPacketBytes", NULL, "Export Selected Packet Bytes...", NULL, NULL, G_CALLBACK(savehex_cb) },
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
{ "/Edit/EditPacket", NULL, "_Edit Packet", NULL, NULL, G_CALLBACK(edit_window_cb) },
|
|
||||||
#endif
|
|
||||||
{ "/WikiProtocolPage", WIRESHARK_STOCK_WIKI, "Wiki Protocol Page", NULL, NULL, G_CALLBACK(selected_ptree_info_cb) },
|
{ "/WikiProtocolPage", WIRESHARK_STOCK_WIKI, "Wiki Protocol Page", NULL, NULL, G_CALLBACK(selected_ptree_info_cb) },
|
||||||
{ "/FilterFieldReference", WIRESHARK_STOCK_INTERNET, "Filter Field Reference", NULL, NULL, G_CALLBACK(selected_ptree_ref_cb) },
|
{ "/FilterFieldReference", WIRESHARK_STOCK_INTERNET, "Filter Field Reference", NULL, NULL, G_CALLBACK(selected_ptree_ref_cb) },
|
||||||
{ "/ProtocolHelp", NULL, "Protocol Help", NULL, NULL, NULL },
|
{ "/ProtocolHelp", NULL, "Protocol Help", NULL, NULL, NULL },
|
||||||
|
@ -4550,12 +4524,6 @@ set_menus_for_selected_packet(capture_file *cf)
|
||||||
|
|
||||||
set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/IgnorePacket",
|
set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/IgnorePacket",
|
||||||
frame_selected);
|
frame_selected);
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/EditPacket",
|
|
||||||
prefs.gui_packet_editor ? frame_selected : FALSE);
|
|
||||||
set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/EditPacket",
|
|
||||||
prefs.gui_packet_editor ? frame_selected : FALSE);
|
|
||||||
#endif /* WANT_PACKET_EDITOR */
|
|
||||||
set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/AddEditPktComment",
|
set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/AddEditPktComment",
|
||||||
frame_selected && wtap_dump_can_write(cf->linktypes, WTAP_COMMENT_PER_PACKET));
|
frame_selected && wtap_dump_can_write(cf->linktypes, WTAP_COMMENT_PER_PACKET));
|
||||||
set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/AddEditCaptureComment",
|
set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/AddEditCaptureComment",
|
||||||
|
@ -5177,10 +5145,6 @@ set_menus_for_selected_tree_row(capture_file *cf)
|
||||||
cf->finfo_selected->tree_type != -1);
|
cf->finfo_selected->tree_type != -1);
|
||||||
set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/CollapseSubtrees",
|
set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/CollapseSubtrees",
|
||||||
cf->finfo_selected->tree_type != -1);
|
cf->finfo_selected->tree_type != -1);
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/EditPacket",
|
|
||||||
prefs.gui_packet_editor ? TRUE : FALSE);
|
|
||||||
#endif
|
|
||||||
set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/WikiProtocolPage",
|
set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/WikiProtocolPage",
|
||||||
(id == -1) ? FALSE : TRUE);
|
(id == -1) ? FALSE : TRUE);
|
||||||
set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FilterFieldReference",
|
set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FilterFieldReference",
|
||||||
|
|
|
@ -87,38 +87,6 @@ struct PacketWinData {
|
||||||
int pd_bitoffset;
|
int pd_bitoffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
struct FieldinfoWinData {
|
|
||||||
epan_t *epan;
|
|
||||||
frame_data *frame; /* The frame being displayed */
|
|
||||||
struct wtap_pkthdr phdr; /* Packet header */
|
|
||||||
guint8 *pd; /* Packet data */
|
|
||||||
int start_offset;
|
|
||||||
|
|
||||||
field_info *finfo;
|
|
||||||
/* fvalue */
|
|
||||||
GtkWidget *edit;
|
|
||||||
GtkWidget *repr;
|
|
||||||
/* byteviews */
|
|
||||||
GtkWidget *bv;
|
|
||||||
GtkWidget *app_bv;
|
|
||||||
|
|
||||||
int pd_offset;
|
|
||||||
int pd_bitoffset;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CommonWinData {
|
|
||||||
frame_data *frame; /* The frame being displayed */
|
|
||||||
guint8 *pd; /* Data for packet */
|
|
||||||
|
|
||||||
int pd_offset;
|
|
||||||
int pd_bitoffset;
|
|
||||||
int val;
|
|
||||||
};
|
|
||||||
|
|
||||||
static gboolean edit_pkt_common_key_pressed_cb(GdkEventKey *event, struct CommonWinData *DataPtr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* List of all the packet-detail windows popped up. */
|
/* List of all the packet-detail windows popped up. */
|
||||||
static GList *detail_windows;
|
static GList *detail_windows;
|
||||||
|
|
||||||
|
@ -199,708 +167,6 @@ redissect_packet_window(gpointer object, gpointer user_data _U_)
|
||||||
g_free(title);
|
g_free(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
static field_info *
|
|
||||||
proto_finfo_find(proto_tree *tree, field_info *old_finfo)
|
|
||||||
{
|
|
||||||
proto_node *node;
|
|
||||||
|
|
||||||
for (node = tree->first_child; node != NULL; node = node->next) {
|
|
||||||
field_info *cur = PNODE_FINFO(node);
|
|
||||||
|
|
||||||
if (!cur)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* check everything, if it doesn't work report to me */
|
|
||||||
if (cur->hfinfo == old_finfo->hfinfo &&
|
|
||||||
cur->start == old_finfo->start && cur->length == old_finfo->length &&
|
|
||||||
cur->appendix_start == old_finfo->appendix_start && cur->appendix_length == old_finfo->appendix_length &&
|
|
||||||
cur->tree_type == old_finfo->tree_type && cur->flags == old_finfo->flags)
|
|
||||||
{
|
|
||||||
return cur;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((cur = proto_finfo_find((proto_tree *)node, old_finfo)))
|
|
||||||
return cur;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
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, cfile.epan, TRUE, TRUE);
|
|
||||||
/* Makes any sense?
|
|
||||||
if (old_finfo->hfinfo)
|
|
||||||
proto_tree_prime_with_hfid(edt.tree, old_finfo->hfinfo->id);
|
|
||||||
*/
|
|
||||||
epan_dissect_run(&edt, cfile.cd_t, &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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
|
||||||
guint64 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finfo_window_refresh(DataPtr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
finfo_string_changed(GtkEditable *editable, gpointer user_data)
|
|
||||||
{
|
|
||||||
struct FieldinfoWinData *DataPtr = (struct FieldinfoWinData *) user_data;
|
|
||||||
|
|
||||||
/* XXX, appendix? */
|
|
||||||
const field_info *finfo = DataPtr->finfo;
|
|
||||||
unsigned int finfo_offset = DataPtr->start_offset + finfo->start;
|
|
||||||
int finfo_length = finfo->length;
|
|
||||||
int finfo_type = (finfo->hfinfo) ? finfo->hfinfo->type : FT_NONE;
|
|
||||||
|
|
||||||
const gchar *val = gtk_entry_get_text(GTK_ENTRY(editable));
|
|
||||||
|
|
||||||
if (finfo_offset <= DataPtr->frame->cap_len && finfo_offset + finfo_length <= DataPtr->frame->cap_len) {
|
|
||||||
/* strncpy */
|
|
||||||
while (finfo_length && *val) {
|
|
||||||
DataPtr->pd[finfo_offset++] = *val;
|
|
||||||
finfo_length--;
|
|
||||||
val++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* When FT_STRINGZ is there free space for NUL? */
|
|
||||||
if (finfo_type == FT_STRINGZ && finfo_length) {
|
|
||||||
DataPtr->pd[finfo_offset++] = '\0';
|
|
||||||
finfo_length--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX, string shorter than previous one. Warn user (red background?), for now fill with NULs */
|
|
||||||
while (finfo_length > 0) {
|
|
||||||
DataPtr->pd[finfo_offset++] = '\0';
|
|
||||||
finfo_length--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finfo_window_refresh(DataPtr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
finfo_boolean_changed(GtkToggleButton *togglebutton, gpointer user_data)
|
|
||||||
{
|
|
||||||
struct FieldinfoWinData *DataPtr = (struct FieldinfoWinData *) user_data;
|
|
||||||
|
|
||||||
gboolean val = gtk_toggle_button_get_active(togglebutton);
|
|
||||||
|
|
||||||
finfo_integer_common(DataPtr, val ? G_MAXUINT64 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
finfo_integer_changed(GtkSpinButton *spinbutton, gpointer user_data)
|
|
||||||
{
|
|
||||||
struct FieldinfoWinData *DataPtr = (struct FieldinfoWinData *) user_data;
|
|
||||||
|
|
||||||
const field_info *finfo = DataPtr->finfo;
|
|
||||||
const header_field_info *hfinfo = finfo->hfinfo;
|
|
||||||
int finfo_type = (hfinfo) ? hfinfo->type : FT_NONE;
|
|
||||||
|
|
||||||
gdouble val = gtk_spin_button_get_value(spinbutton);
|
|
||||||
guint64 u_val;
|
|
||||||
|
|
||||||
if (finfo_type == FT_INT8 || finfo_type == FT_INT16 || finfo_type == FT_INT24 || finfo_type == FT_INT32 || finfo_type == FT_INT64)
|
|
||||||
u_val = (guint64) ((gint64) val);
|
|
||||||
|
|
||||||
else if (finfo_type == FT_UINT8 || finfo_type == FT_UINT16 || finfo_type == FT_UINT24 || finfo_type == FT_UINT32 || finfo_type == FT_UINT64)
|
|
||||||
u_val = (guint64) val;
|
|
||||||
else {
|
|
||||||
g_assert_not_reached();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hfinfo->bitmask)
|
|
||||||
u_val <<= hfinfo_bitshift(hfinfo);
|
|
||||||
|
|
||||||
finfo_integer_common(DataPtr, u_val);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
finfo_ipv4_changed(GtkSpinButton *spinbutton, gpointer user_data)
|
|
||||||
{
|
|
||||||
struct FieldinfoWinData *DataPtr = (struct FieldinfoWinData *) user_data;
|
|
||||||
|
|
||||||
gdouble val = gtk_spin_button_get_value(spinbutton);
|
|
||||||
|
|
||||||
finfo_integer_common(DataPtr, (guint32) val);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
finfo_bv_key_pressed_cb(GtkWidget *bv _U_, GdkEventKey *event, gpointer user_data)
|
|
||||||
{
|
|
||||||
struct FieldinfoWinData *DataPtr = (struct FieldinfoWinData *)user_data;
|
|
||||||
const field_info *finfo = DataPtr->finfo;
|
|
||||||
struct CommonWinData data;
|
|
||||||
gboolean have_appendix;
|
|
||||||
gboolean ret;
|
|
||||||
|
|
||||||
/* save */
|
|
||||||
data.frame = DataPtr->frame;
|
|
||||||
data.pd = DataPtr->pd;
|
|
||||||
data.pd_offset = DataPtr->pd_offset;
|
|
||||||
data.pd_bitoffset = DataPtr->pd_bitoffset;
|
|
||||||
|
|
||||||
ret = edit_pkt_common_key_pressed_cb(event, &data);
|
|
||||||
|
|
||||||
/* restore */
|
|
||||||
DataPtr->pd_offset = data.pd_offset;
|
|
||||||
DataPtr->pd_bitoffset = data.pd_bitoffset;
|
|
||||||
|
|
||||||
/* XXX, assuming finfo->appendix_start >= finfo->start, and if appendix exists, main exists also.
|
|
||||||
* easy to fix if needed */
|
|
||||||
have_appendix = (finfo->appendix_start >= 0 && finfo->appendix_length > 0);
|
|
||||||
|
|
||||||
if ((DataPtr->pd_offset >= DataPtr->start_offset + finfo->start && DataPtr->pd_offset < DataPtr->start_offset + finfo->start + finfo->length) ||
|
|
||||||
(have_appendix && DataPtr->pd_offset >= DataPtr->start_offset + finfo->appendix_start && DataPtr->pd_offset < DataPtr->start_offset + finfo->appendix_start + finfo->appendix_length))
|
|
||||||
{ /* pd_offset ok */ }
|
|
||||||
else
|
|
||||||
if (have_appendix && DataPtr->pd_offset >= DataPtr->start_offset + finfo->appendix_start + finfo->appendix_length) {
|
|
||||||
DataPtr->pd_offset = DataPtr->start_offset + finfo->start;
|
|
||||||
DataPtr->pd_bitoffset = 0; /* first bit */
|
|
||||||
|
|
||||||
} else if (DataPtr->pd_offset >= DataPtr->start_offset + finfo->start + finfo->length) {
|
|
||||||
if (have_appendix)
|
|
||||||
DataPtr->pd_offset = DataPtr->start_offset + finfo->appendix_start;
|
|
||||||
else
|
|
||||||
DataPtr->pd_offset = DataPtr->start_offset + finfo->start;
|
|
||||||
DataPtr->pd_bitoffset = 0; /* first bit */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if (DataPtr->pd_offset < DataPtr->start_offset + finfo->start) {
|
|
||||||
if (have_appendix)
|
|
||||||
DataPtr->pd_offset = DataPtr->start_offset + finfo->appendix_start + finfo->appendix_length-1;
|
|
||||||
else
|
|
||||||
DataPtr->pd_offset = DataPtr->start_offset + finfo->start + finfo->length-1;
|
|
||||||
/* XXX, last bit/octect? */
|
|
||||||
|
|
||||||
} else if (have_appendix && DataPtr->pd_offset < DataPtr->start_offset + finfo->appendix_start) {
|
|
||||||
DataPtr->pd_offset = DataPtr->start_offset + finfo->start + finfo->length-1;
|
|
||||||
/* XXX, last bit/octect? */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret)
|
|
||||||
finfo_window_refresh(DataPtr);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint
|
|
||||||
finfo_ipv4_input(GtkSpinButton *spinbutton, gpointer arg1, gpointer user_data _U_)
|
|
||||||
{
|
|
||||||
const gchar *addr_str = gtk_entry_get_text(GTK_ENTRY(spinbutton));
|
|
||||||
gdouble *out_val = (gdouble *) arg1;
|
|
||||||
guint32 addr;
|
|
||||||
#if 0
|
|
||||||
/* XXX, get_host_ipaddr() support hostname resolution */
|
|
||||||
if (!get_host_ipaddr(addr_str, &addr))
|
|
||||||
return GTK_INPUT_ERROR;
|
|
||||||
addr = GUINT32_FROM_BE(addr);
|
|
||||||
#else
|
|
||||||
unsigned int a0, a1, a2, a3;
|
|
||||||
|
|
||||||
if (sscanf(addr_str, "%u.%u.%u.%u", &a0, &a1, &a2, &a3) != 4)
|
|
||||||
return GTK_INPUT_ERROR;
|
|
||||||
|
|
||||||
if (a0 > 255 || a1 > 255 || a2 > 255 || a3 > 255)
|
|
||||||
return GTK_INPUT_ERROR;
|
|
||||||
|
|
||||||
addr = a0 << 24 | a1 << 16 | a2 << 8 | a3;
|
|
||||||
#endif
|
|
||||||
*out_val = (gdouble) addr;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
finfo_ipv4_output(GtkSpinButton *spinbutton, gpointer user_data _U_)
|
|
||||||
{
|
|
||||||
GtkAdjustment *adj;
|
|
||||||
guint32 value;
|
|
||||||
address addr;
|
|
||||||
char* addr_str;
|
|
||||||
|
|
||||||
adj = gtk_spin_button_get_adjustment(spinbutton);
|
|
||||||
value = (guint32) gtk_adjustment_get_value(adj);
|
|
||||||
value = GUINT32_TO_BE(value);
|
|
||||||
set_address(&addr, AT_IPv4, 4, &value);
|
|
||||||
addr_str = (char*)address_to_str(NULL, &addr);
|
|
||||||
gtk_entry_set_text(GTK_ENTRY(spinbutton), addr_str);
|
|
||||||
wmem_free(NULL, addr_str);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint
|
|
||||||
new_finfo_window(GtkWidget *w, struct FieldinfoWinData *DataPtr)
|
|
||||||
{
|
|
||||||
field_info *finfo = DataPtr->finfo;
|
|
||||||
const header_field_info *hfinfo = finfo->hfinfo;
|
|
||||||
int finfo_type = (hfinfo) ? hfinfo->type : FT_NONE;
|
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION(3, 10, 0)
|
|
||||||
GtkWidget *dialog = gtk_dialog_new_with_buttons("Editing finfo: ....",
|
|
||||||
GTK_WINDOW(w),
|
|
||||||
(GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
|
|
||||||
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
|
|
||||||
GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
|
|
||||||
NULL);
|
|
||||||
#else
|
|
||||||
GtkWidget *dialog = gtk_dialog_new_with_buttons("Editing finfo: ....",
|
|
||||||
GTK_WINDOW(w),
|
|
||||||
(GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
|
|
||||||
"_OK", GTK_RESPONSE_ACCEPT,
|
|
||||||
"_Cancel", GTK_RESPONSE_REJECT,
|
|
||||||
NULL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GtkWidget *dialog_vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
|
|
||||||
GtkWidget *fvalue_edit;
|
|
||||||
GtkWidget *native_repr;
|
|
||||||
GtkWidget *bv_nb_ptr;
|
|
||||||
GtkWidget *frame, *frame_vbox;
|
|
||||||
|
|
||||||
gint result;
|
|
||||||
|
|
||||||
if (!FI_GET_FLAG(finfo, FI_LITTLE_ENDIAN) && !FI_GET_FLAG(finfo, FI_BIG_ENDIAN)) {
|
|
||||||
fvalue_edit = gtk_entry_new();
|
|
||||||
gtk_entry_set_text(GTK_ENTRY(fvalue_edit), "<not added by proto_tree_add_item()>");
|
|
||||||
gtk_editable_set_editable(GTK_EDITABLE(fvalue_edit), FALSE);
|
|
||||||
gtk_widget_set_sensitive(fvalue_edit, FALSE);
|
|
||||||
|
|
||||||
} /* else if (XXX) {
|
|
||||||
fvalue_edit = gtk_entry_new();
|
|
||||||
gtk_entry_set_text(GTK_ENTRY(fvalue_edit), "<ERROR: Value stored in finfo doesn't match value from tvb>");
|
|
||||||
gtk_editable_set_editable(GTK_EDITABLE(fvalue_edit), FALSE);
|
|
||||||
gtk_widget_set_sensitive(fvalue_edit, FALSE);
|
|
||||||
|
|
||||||
} */ else if (finfo_type == FT_INT8 || finfo_type == FT_INT16 || finfo_type == FT_INT24 || finfo_type == FT_INT32 ||
|
|
||||||
finfo_type == FT_UINT8 || finfo_type == FT_UINT16 || finfo_type == FT_UINT24 || finfo_type == FT_UINT32)
|
|
||||||
{
|
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
GtkAdjustment *adj;
|
|
||||||
#else
|
|
||||||
GtkObject *adj;
|
|
||||||
#endif
|
|
||||||
int bitcount = 0;
|
|
||||||
|
|
||||||
if (finfo_type == FT_INT8 || finfo_type == FT_UINT8)
|
|
||||||
bitcount = 8;
|
|
||||||
if (finfo_type == FT_INT16 || finfo_type == FT_UINT16)
|
|
||||||
bitcount = 16;
|
|
||||||
if (finfo_type == FT_INT24 || finfo_type == FT_UINT24)
|
|
||||||
bitcount = 24;
|
|
||||||
if (finfo_type == FT_INT32 || finfo_type == FT_UINT32)
|
|
||||||
bitcount = 32;
|
|
||||||
/* if (finfo_type == FT_INT64 || finfo_type == FT_UINT64)
|
|
||||||
bitcount = 64; */
|
|
||||||
|
|
||||||
if (finfo->length * 8 < bitcount)
|
|
||||||
bitcount = finfo->length / 8;
|
|
||||||
|
|
||||||
if (hfinfo->bitmask)
|
|
||||||
bitcount -= hfinfo_bitshift(hfinfo);
|
|
||||||
|
|
||||||
/* XXX, hfinfo->bitmask: Can we configure GTK_ADJUSTMENT to do custom step? (value-changed signal?) */
|
|
||||||
|
|
||||||
/* XXX, I'm little worried about these casts from (unsigned) integer to double... */
|
|
||||||
|
|
||||||
if (finfo_type == FT_INT8 || finfo_type == FT_INT16 || finfo_type == FT_INT24 || finfo_type == FT_INT32 /* || finfo_type == FT_INT64 */)
|
|
||||||
adj = gtk_adjustment_new((double) fvalue_get_sinteger(&finfo->value), (double) -(G_GINT64_CONSTANT(1) << (bitcount-1)), (double) ((G_GINT64_CONSTANT(1) << (bitcount-1))-1), 1.0, 10.0, 0);
|
|
||||||
else if (finfo_type == FT_UINT8 || finfo_type == FT_UINT16 || finfo_type == FT_UINT24 || finfo_type == FT_UINT32 /* || finfo_type == FT_UINT64 */ )
|
|
||||||
adj = gtk_adjustment_new((double) fvalue_get_uinteger(&finfo->value), 0.0, (double) ((G_GUINT64_CONSTANT(1) << bitcount)-1), 1.0, 10.0, 0);
|
|
||||||
else {
|
|
||||||
g_assert_not_reached();
|
|
||||||
goto not_supported;
|
|
||||||
}
|
|
||||||
|
|
||||||
fvalue_edit = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1.0, 0);
|
|
||||||
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(fvalue_edit), TRUE);
|
|
||||||
g_signal_connect(fvalue_edit, "value-changed", G_CALLBACK(finfo_integer_changed), DataPtr);
|
|
||||||
|
|
||||||
} else if (finfo_type == FT_STRING || finfo_type == FT_STRINGZ || finfo_type == FT_STRINGZPAD) {
|
|
||||||
fvalue_edit = gtk_entry_new();
|
|
||||||
gtk_entry_set_max_length(GTK_ENTRY(fvalue_edit), finfo->length);
|
|
||||||
gtk_entry_set_text(GTK_ENTRY(fvalue_edit), (const gchar*) fvalue_get(&finfo->value));
|
|
||||||
g_signal_connect(fvalue_edit, "changed", G_CALLBACK(finfo_string_changed), DataPtr);
|
|
||||||
|
|
||||||
} else if (finfo_type == FT_BOOLEAN) {
|
|
||||||
fvalue_edit = gtk_check_button_new();
|
|
||||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fvalue_edit), (fvalue_get_uinteger64(&finfo->value) != 0));
|
|
||||||
g_signal_connect(fvalue_edit, "toggled", G_CALLBACK(finfo_boolean_changed), DataPtr);
|
|
||||||
|
|
||||||
} else if (finfo_type == FT_IPv4) {
|
|
||||||
guint32 ipv4 = fvalue_get_uinteger(&finfo->value);
|
|
||||||
#if GTK_CHECK_VERSION(3,0,0)
|
|
||||||
GtkAdjustment *adj;
|
|
||||||
#else
|
|
||||||
GtkObject *adj;
|
|
||||||
#endif
|
|
||||||
adj = gtk_adjustment_new((double) (GUINT32_FROM_BE(ipv4)), 0.0, 4294967295.0 /* (2^32)-1 */, 1.0, 256.0, 0);
|
|
||||||
|
|
||||||
/* XXX, create four gtk_spin_button_new which takes 0..255 */
|
|
||||||
fvalue_edit = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1.0, 0);
|
|
||||||
gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(fvalue_edit), GTK_UPDATE_IF_VALID);
|
|
||||||
g_signal_connect(fvalue_edit, "value-changed", G_CALLBACK(finfo_ipv4_changed), DataPtr);
|
|
||||||
g_signal_connect(fvalue_edit, "input", G_CALLBACK(finfo_ipv4_input), NULL);
|
|
||||||
g_signal_connect(fvalue_edit, "output", G_CALLBACK(finfo_ipv4_output), NULL);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
not_supported:
|
|
||||||
/* List of unsupported FT_*:
|
|
||||||
FT_NONE, FT_PROTOCOL,
|
|
||||||
FT_BYTES, FT_UINT_BYTES,
|
|
||||||
FT_INT64, FT_UINT64, ; should work with FT_INT[8,16,24,32] code
|
|
||||||
FT_FLOAT, FT_DOUBLE,
|
|
||||||
FT_IPXNET, FT_IPv6, FT_ETHER,
|
|
||||||
FT_GUID, FT_OID, FT_SYSTEM_ID,
|
|
||||||
FT_UINT_STRING,
|
|
||||||
FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
|
|
||||||
FT_VINES, FT_FCWWN,
|
|
||||||
*/
|
|
||||||
fvalue_edit = gtk_entry_new();
|
|
||||||
gtk_entry_set_text(GTK_ENTRY(fvalue_edit), "<not supported>");
|
|
||||||
gtk_editable_set_editable(GTK_EDITABLE(fvalue_edit), FALSE);
|
|
||||||
gtk_widget_set_sensitive(fvalue_edit, FALSE);
|
|
||||||
}
|
|
||||||
gtk_box_pack_start(GTK_BOX(dialog_vbox), fvalue_edit, FALSE, FALSE, 0);
|
|
||||||
gtk_widget_show(fvalue_edit);
|
|
||||||
|
|
||||||
DataPtr->edit = fvalue_edit;
|
|
||||||
|
|
||||||
native_repr = gtk_entry_new();
|
|
||||||
gtk_editable_set_editable(GTK_EDITABLE(native_repr), FALSE);
|
|
||||||
gtk_widget_set_sensitive(native_repr, FALSE);
|
|
||||||
gtk_box_pack_start(GTK_BOX(dialog_vbox), native_repr, FALSE, FALSE, 0);
|
|
||||||
gtk_widget_show(native_repr);
|
|
||||||
|
|
||||||
DataPtr->repr = native_repr;
|
|
||||||
|
|
||||||
frame = gtk_frame_new("Hex edit");
|
|
||||||
frame_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, TRUE);
|
|
||||||
|
|
||||||
/* raw hex edit */
|
|
||||||
if (finfo->start >= 0 && finfo->length > 0) {
|
|
||||||
GtkWidget *byte_view;
|
|
||||||
/* Byte view */
|
|
||||||
bv_nb_ptr = byte_view_new();
|
|
||||||
gtk_box_pack_start(GTK_BOX(frame_vbox), bv_nb_ptr, TRUE, TRUE, 0);
|
|
||||||
gtk_widget_set_size_request(bv_nb_ptr, -1, BV_SIZE);
|
|
||||||
gtk_widget_show(bv_nb_ptr);
|
|
||||||
|
|
||||||
if ((byte_view = get_notebook_bv_ptr(bv_nb_ptr)))
|
|
||||||
g_signal_connect(byte_view, "key-press-event", G_CALLBACK(finfo_bv_key_pressed_cb), DataPtr);
|
|
||||||
DataPtr->bv = bv_nb_ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (finfo->appendix_start >= 0 && finfo->appendix_length > 0) {
|
|
||||||
GtkWidget *byte_view;
|
|
||||||
/* Appendix byte view */
|
|
||||||
bv_nb_ptr = byte_view_new();
|
|
||||||
gtk_box_pack_start(GTK_BOX(frame_vbox), bv_nb_ptr, TRUE, TRUE, 0);
|
|
||||||
gtk_widget_set_size_request(bv_nb_ptr, -1, BV_SIZE);
|
|
||||||
gtk_widget_show(bv_nb_ptr);
|
|
||||||
|
|
||||||
if ((byte_view = get_notebook_bv_ptr(bv_nb_ptr)))
|
|
||||||
g_signal_connect(byte_view, "key-press-event", G_CALLBACK(finfo_bv_key_pressed_cb), DataPtr);
|
|
||||||
DataPtr->app_bv = bv_nb_ptr;
|
|
||||||
}
|
|
||||||
gtk_container_add(GTK_CONTAINER(frame), frame_vbox);
|
|
||||||
gtk_widget_show(frame_vbox); gtk_widget_show(frame);
|
|
||||||
gtk_container_add(GTK_CONTAINER(dialog_vbox), frame);
|
|
||||||
|
|
||||||
gtk_window_set_default_size(GTK_WINDOW(dialog), DEF_WIDTH, -1);
|
|
||||||
finfo_window_refresh(DataPtr);
|
|
||||||
result = gtk_dialog_run(GTK_DIALOG(dialog));
|
|
||||||
gtk_widget_destroy(dialog);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
edit_pkt_tree_row_activated_cb(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column _U_, gpointer user_data)
|
|
||||||
{
|
|
||||||
struct PacketWinData *DataPtr = (struct PacketWinData*)user_data;
|
|
||||||
GtkTreeModel *model;
|
|
||||||
GtkTreeIter iter;
|
|
||||||
field_info *finfo;
|
|
||||||
|
|
||||||
model = gtk_tree_view_get_model(tree_view);
|
|
||||||
if (!gtk_tree_model_get_iter(model, &iter, path))
|
|
||||||
return;
|
|
||||||
|
|
||||||
gtk_tree_model_get(model, &iter, 1, &finfo, -1);
|
|
||||||
if (!finfo)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!FI_GET_FLAG(finfo, FI_GENERATED) &&
|
|
||||||
finfo->ds_tvb && finfo->ds_tvb->real_data >= DataPtr->pd && finfo->ds_tvb->real_data <= DataPtr->pd + DataPtr->frame->cap_len)
|
|
||||||
{
|
|
||||||
struct FieldinfoWinData data;
|
|
||||||
|
|
||||||
data.epan = cfile.epan;
|
|
||||||
data.frame = DataPtr->frame;
|
|
||||||
data.phdr = DataPtr->phdr;
|
|
||||||
data.pd = (guint8 *) g_memdup(DataPtr->pd, DataPtr->frame->cap_len);
|
|
||||||
data.start_offset = (int) (finfo->ds_tvb->real_data - DataPtr->pd);
|
|
||||||
|
|
||||||
data.finfo = finfo;
|
|
||||||
data.app_bv = data.bv = NULL;
|
|
||||||
data.repr = data.edit = NULL;
|
|
||||||
|
|
||||||
data.pd_offset = data.start_offset + finfo->start;
|
|
||||||
data.pd_bitoffset = 0;
|
|
||||||
|
|
||||||
if (new_finfo_window(DataPtr->main, &data) == GTK_RESPONSE_ACCEPT) {
|
|
||||||
/* DataPtr->phdr = data.phdr; */
|
|
||||||
memcpy(DataPtr->pd, data.pd, DataPtr->frame->cap_len);
|
|
||||||
|
|
||||||
proto_tree_draw(NULL, DataPtr->tree_view);
|
|
||||||
epan_dissect_cleanup(&(DataPtr->edt));
|
|
||||||
epan_dissect_init(&(DataPtr->edt), cfile.epan, TRUE, TRUE);
|
|
||||||
epan_dissect_run(&(DataPtr->edt), cfile.cd_t, &DataPtr->phdr, frame_tvbuff_new(DataPtr->frame, DataPtr->pd), DataPtr->frame, NULL);
|
|
||||||
add_byte_views(&(DataPtr->edt), DataPtr->tree_view, DataPtr->bv_nb_ptr);
|
|
||||||
proto_tree_draw(DataPtr->edt.tree, DataPtr->tree_view);
|
|
||||||
}
|
|
||||||
g_free(data.pd);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/* XXX, simple_dialog() is shown on top of main_window, instead of edit_window. */
|
|
||||||
simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, "Item can't be edited. FI_GENERATED or tvb not subset of packet data (uncompressed?)");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
edit_pkt_common_key_pressed_cb(GdkEventKey *event, struct CommonWinData *DataPtr)
|
|
||||||
{
|
|
||||||
int val = -1;
|
|
||||||
|
|
||||||
switch (recent.gui_bytes_view) {
|
|
||||||
case BYTES_HEX:
|
|
||||||
if (event->keyval >= 'a' && event->keyval <= 'f')
|
|
||||||
val = (event->keyval - 'a') + 10;
|
|
||||||
else if (event->keyval >= 'A' && event->keyval <= 'F')
|
|
||||||
val = (event->keyval - 'A') + 10;
|
|
||||||
else if (event->keyval >= '0' && event->keyval <= '9')
|
|
||||||
val = (event->keyval - '0');
|
|
||||||
else if (event->keyval == GDK_Left)
|
|
||||||
DataPtr->pd_bitoffset -= 4;
|
|
||||||
else if (event->keyval == GDK_Right)
|
|
||||||
DataPtr->pd_bitoffset += 4;
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (val != -1) {
|
|
||||||
/* Lazy...
|
|
||||||
* XXX Allow (DataPtr->pd_bitoffset % 4) != 0 ? */
|
|
||||||
if (DataPtr->pd_bitoffset < 4) {
|
|
||||||
DataPtr->pd[DataPtr->pd_offset] = (DataPtr->pd[DataPtr->pd_offset] & 0x0f) | (val << 4);
|
|
||||||
DataPtr->pd_bitoffset = 4;
|
|
||||||
} else {
|
|
||||||
DataPtr->pd[DataPtr->pd_offset] = (DataPtr->pd[DataPtr->pd_offset] & 0xf0) | val;
|
|
||||||
DataPtr->pd_bitoffset = 8;
|
|
||||||
}
|
|
||||||
/* DataPtr->pd_bitoffset += 4; */
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BYTES_BITS:
|
|
||||||
if (event->keyval == '0' || event->keyval == '1')
|
|
||||||
val = (event->keyval != '0');
|
|
||||||
else if (event->keyval == GDK_Left)
|
|
||||||
DataPtr->pd_bitoffset -= 1;
|
|
||||||
else if (event->keyval == GDK_Right)
|
|
||||||
DataPtr->pd_bitoffset += 1;
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (val != -1) {
|
|
||||||
if (val)
|
|
||||||
DataPtr->pd[DataPtr->pd_offset] |= (1 << (7-DataPtr->pd_bitoffset));
|
|
||||||
else
|
|
||||||
DataPtr->pd[DataPtr->pd_offset] &= ~(1 << (7-DataPtr->pd_bitoffset));
|
|
||||||
DataPtr->pd_bitoffset += 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
g_assert_not_reached();
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (DataPtr->pd_bitoffset >= 8) {
|
|
||||||
DataPtr->pd_offset += 1;
|
|
||||||
DataPtr->pd_bitoffset -= 8;
|
|
||||||
}
|
|
||||||
while (DataPtr->pd_bitoffset < 0) {
|
|
||||||
DataPtr->pd_offset -= 1;
|
|
||||||
DataPtr->pd_bitoffset += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
DataPtr->val = val;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
edit_pkt_win_key_pressed_cb(GtkWidget *win _U_, GdkEventKey *event, gpointer user_data)
|
|
||||||
{
|
|
||||||
struct PacketWinData *DataPtr = (struct PacketWinData *)user_data;
|
|
||||||
struct CommonWinData data;
|
|
||||||
GSList *src_le;
|
|
||||||
gboolean ret;
|
|
||||||
tvbuff_t *ds_tvb = NULL;
|
|
||||||
|
|
||||||
/* save */
|
|
||||||
data.frame = DataPtr->frame;
|
|
||||||
data.pd = DataPtr->pd;
|
|
||||||
data.pd_offset = DataPtr->pd_offset;
|
|
||||||
data.pd_bitoffset = DataPtr->pd_bitoffset;
|
|
||||||
|
|
||||||
ret = edit_pkt_common_key_pressed_cb(event, &data);
|
|
||||||
|
|
||||||
/* restore */
|
|
||||||
DataPtr->pd_offset = data.pd_offset;
|
|
||||||
DataPtr->pd_bitoffset = data.pd_bitoffset;
|
|
||||||
|
|
||||||
if (DataPtr->pd_offset < 0) {
|
|
||||||
DataPtr->pd_offset = DataPtr->frame->cap_len-1;
|
|
||||||
/* XXX, last bit/octect? */
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((guint)DataPtr->pd_offset >= DataPtr->frame->cap_len) {
|
|
||||||
DataPtr->pd_offset = 0;
|
|
||||||
DataPtr->pd_bitoffset = 0; /* first bit */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* redissect if changed */
|
|
||||||
if (data.val != -1) {
|
|
||||||
redissect_packet_window(DataPtr, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (src_le = DataPtr->edt.pi.data_src; src_le != NULL; src_le = src_le->next) {
|
|
||||||
const struct data_source *src = (const struct data_source *)src_le->data;
|
|
||||||
tvbuff_t *tvb = get_data_source_tvb(src);
|
|
||||||
|
|
||||||
if (tvb && tvb->real_data == DataPtr->pd) {
|
|
||||||
ds_tvb = tvb;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ds_tvb != NULL) {
|
|
||||||
GtkWidget *byte_view;
|
|
||||||
|
|
||||||
set_notebook_page(DataPtr->bv_nb_ptr, ds_tvb);
|
|
||||||
byte_view = get_notebook_bv_ptr(DataPtr->bv_nb_ptr);
|
|
||||||
if (byte_view)
|
|
||||||
packet_hex_editor_print(byte_view, DataPtr->pd, DataPtr->frame, DataPtr->pd_offset, DataPtr->pd_bitoffset, DataPtr->frame->cap_len);
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
edit_pkt_destroy_new_window(GObject *object _U_, gpointer user_data)
|
|
||||||
{
|
|
||||||
/* like destroy_new_window, but without freeing DataPtr->pd */
|
|
||||||
struct PacketWinData *DataPtr = (struct PacketWinData *)user_data;
|
|
||||||
|
|
||||||
detail_windows = g_list_remove(detail_windows, DataPtr);
|
|
||||||
proto_tree_draw(NULL, DataPtr->tree_view);
|
|
||||||
epan_dissect_cleanup(&(DataPtr->edt));
|
|
||||||
g_free(DataPtr);
|
|
||||||
|
|
||||||
/* XXX, notify main packet list that packet should be redisplayed */
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* WANT_PACKET_EDITOR */
|
|
||||||
|
|
||||||
void new_packet_window(GtkWidget *w _U_, gboolean reference, gboolean editable _U_)
|
void new_packet_window(GtkWidget *w _U_, gboolean reference, gboolean editable _U_)
|
||||||
{
|
{
|
||||||
char *title;
|
char *title;
|
||||||
|
@ -1004,14 +270,6 @@ void new_packet_window(GtkWidget *w _U_, gboolean reference, gboolean editable _
|
||||||
g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)),
|
g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)),
|
||||||
"changed", G_CALLBACK(new_tree_view_selection_changed_cb), DataPtr);
|
"changed", G_CALLBACK(new_tree_view_selection_changed_cb), DataPtr);
|
||||||
g_signal_connect(tree_view, "button_press_event", G_CALLBACK(button_press_handler), NULL);
|
g_signal_connect(tree_view, "button_press_event", G_CALLBACK(button_press_handler), NULL);
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
if (editable && DataPtr->frame->cap_len != 0) {
|
|
||||||
g_signal_connect(main_w, "key-press-event", G_CALLBACK(edit_pkt_win_key_pressed_cb), DataPtr);
|
|
||||||
/* XXX, popup-menu instead of row-activated? */
|
|
||||||
g_signal_connect(tree_view, "row-activated", G_CALLBACK(edit_pkt_tree_row_activated_cb), DataPtr);
|
|
||||||
g_signal_connect(main_w, "destroy", G_CALLBACK(edit_pkt_destroy_new_window), DataPtr);
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
g_signal_connect(main_w, "destroy", G_CALLBACK(destroy_new_window), DataPtr);
|
g_signal_connect(main_w, "destroy", G_CALLBACK(destroy_new_window), DataPtr);
|
||||||
|
|
||||||
/* draw the protocol tree & print hex data */
|
/* draw the protocol tree & print hex data */
|
||||||
|
@ -1022,17 +280,6 @@ void new_packet_window(GtkWidget *w _U_, gboolean reference, gboolean editable _
|
||||||
DataPtr->pd_offset = 0;
|
DataPtr->pd_offset = 0;
|
||||||
DataPtr->pd_bitoffset = 0;
|
DataPtr->pd_bitoffset = 0;
|
||||||
gtk_widget_show(main_w);
|
gtk_widget_show(main_w);
|
||||||
|
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
if (editable && DataPtr->frame->cap_len != 0) {
|
|
||||||
/* XXX, there's no Save button here, so lets assume packet is always edited */
|
|
||||||
cf_set_frame_edited(&cfile, DataPtr->frame, &DataPtr->phdr,
|
|
||||||
DataPtr->pd);
|
|
||||||
|
|
||||||
/* Update the main window, as we now have unsaved changes. */
|
|
||||||
main_update_for_unsaved_changes(&cfile);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1085,38 +332,6 @@ new_tree_view_selection_changed_cb(GtkTreeSelection *sel, gpointer user_data)
|
||||||
|
|
||||||
DataPtr->finfo_selected = finfo;
|
DataPtr->finfo_selected = finfo;
|
||||||
|
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
DataPtr->pd_offset = 0;
|
|
||||||
DataPtr->pd_bitoffset = 0;
|
|
||||||
|
|
||||||
if (!FI_GET_FLAG(finfo, FI_GENERATED) &&
|
|
||||||
finfo->ds_tvb && finfo->ds_tvb->real_data >= DataPtr->pd && finfo->ds_tvb->real_data <= DataPtr->pd + DataPtr->frame->cap_len)
|
|
||||||
{
|
|
||||||
/* I haven't really test if TVB subsets works, but why not? :> */
|
|
||||||
int pd_offset = (int) (finfo->ds_tvb->real_data - DataPtr->pd);
|
|
||||||
|
|
||||||
/* some code from packet_hex_print */
|
|
||||||
int finfo_offset = finfo->start;
|
|
||||||
int finfo_len = finfo->length;
|
|
||||||
|
|
||||||
if (!(finfo_offset >= 0 && finfo_len > 0)) {
|
|
||||||
finfo_offset = finfo->appendix_start;
|
|
||||||
finfo_len = finfo->appendix_length;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Don't care about things like bitmask or LE/BE, just point DataPtr->tvb_[bit]offset to proper offsets. */
|
|
||||||
if (finfo_offset >= 0 && finfo_len > 0) {
|
|
||||||
DataPtr->pd_offset = pd_offset + finfo_offset;
|
|
||||||
DataPtr->pd_bitoffset = 0; /* XXX */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DataPtr->pd_offset < 0)
|
|
||||||
DataPtr->pd_offset = 0;
|
|
||||||
if ((guint)DataPtr->pd_offset >= DataPtr->frame->cap_len)
|
|
||||||
DataPtr->pd_offset = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
packet_hex_print(byte_view, data, DataPtr->frame, finfo, len);
|
packet_hex_print(byte_view, data, DataPtr->frame, finfo, len);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1317,10 +1317,6 @@ void MainWindow::setMenusForSelectedPacket()
|
||||||
main_ui_->actionEditNextMark->setEnabled(another_is_marked);
|
main_ui_->actionEditNextMark->setEnabled(another_is_marked);
|
||||||
main_ui_->actionEditPreviousMark->setEnabled(another_is_marked);
|
main_ui_->actionEditPreviousMark->setEnabled(another_is_marked);
|
||||||
|
|
||||||
#ifdef WANT_PACKET_EDITOR
|
|
||||||
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/EditPacket",
|
|
||||||
// frame_selected);
|
|
||||||
#endif // WANT_PACKET_EDITOR
|
|
||||||
main_ui_->actionEditPacketComment->setEnabled(frame_selected && wtap_dump_can_write(capture_file_.capFile()->linktypes, WTAP_COMMENT_PER_PACKET));
|
main_ui_->actionEditPacketComment->setEnabled(frame_selected && wtap_dump_can_write(capture_file_.capFile()->linktypes, WTAP_COMMENT_PER_PACKET));
|
||||||
main_ui_->actionDeleteAllPacketComments->setEnabled((capture_file_.capFile() != NULL) && wtap_dump_can_write(capture_file_.capFile()->linktypes, WTAP_COMMENT_PER_PACKET));
|
main_ui_->actionDeleteAllPacketComments->setEnabled((capture_file_.capFile() != NULL) && wtap_dump_can_write(capture_file_.capFile()->linktypes, WTAP_COMMENT_PER_PACKET));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue