Redissect extra packet windows in all cases (that I know of) where we

redissect normal packet list.

Fixes https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8482

svn path=/trunk/; revision=48528
This commit is contained in:
Evan Huus 2013-03-24 16:47:38 +00:00
parent ace8a9cb6a
commit c4a36c513f
8 changed files with 79 additions and 24 deletions

View File

@ -51,6 +51,7 @@
#include "ui/gtk/help_dlg.h"
#include "ui/gtk/keys.h"
#include "ui/gtk/old-gtk-compat.h"
#include "ui/gtk/packet_win.h"
#include <airpcap.h>
#include "airpcap_loader.h"
@ -1364,6 +1365,7 @@ on_decryption_mode_cb_changed(GtkWidget *cb, gpointer data _U_)
/* Redissect all the packets, and re-evaluate the display filter. */
redissect_packets();
redissect_all_packet_windows();
}
/*

View File

@ -50,6 +50,7 @@
#include "ui/gtk/decode_as_ber.h"
#include "ui/gtk/help_dlg.h"
#include "ui/gtk/old-gtk-compat.h"
#include "ui/gtk/packet_win.h"
#undef DEBUG
@ -578,6 +579,7 @@ decode_clear_all(gboolean redissect)
if (redissect) {
redissect_packets();
redissect_all_packet_windows();
}
}
@ -1062,6 +1064,7 @@ decode_ok_cb (GtkWidget *ok_bt _U_, gpointer parent_w)
decode_dimmable = NULL;
redissect_packets();
redissect_all_packet_windows();
}
/*
@ -1091,6 +1094,7 @@ decode_apply_cb (GtkWidget *apply_bt _U_, gpointer parent_w)
func(notebook_pg);
redissect_packets();
redissect_all_packet_windows();
}
/*

View File

@ -5168,6 +5168,7 @@ menu_prefs_toggle_bool (GtkWidget *w, gpointer data)
prefs_main_write();
}
redissect_packets();
redissect_all_packet_windows();
}
static void
@ -5189,6 +5190,7 @@ menu_prefs_change_enum (GtkWidget *w, gpointer data)
prefs_main_write();
}
redissect_packets();
redissect_all_packet_windows();
}
}
@ -5259,6 +5261,7 @@ menu_prefs_change_ok (GtkWidget *w, gpointer parent_w)
prefs_main_write();
}
redissect_packets();
redissect_all_packet_windows();
}
window_destroy(GTK_WIDGET(parent_w));

View File

@ -39,6 +39,7 @@
#include "ui/gtk/menus.h"
#include "ui/gtk/manual_addr_resolv.h"
#include "ui/gtk/old-gtk-compat.h"
#include "ui/gtk/packet_win.h"
GtkWidget *man_addr_resolv_dlg = NULL;
@ -86,6 +87,7 @@ man_addr_resolv_ok(GtkWidget *w _U_, gpointer data _U_)
if (redissect) {
redissect_packets();
redissect_all_packet_windows();
}
window_destroy(man_addr_resolv_dlg);
man_addr_resolv_dlg = NULL;

View File

@ -157,6 +157,52 @@ button_press_handler(GtkWidget *widget, GdkEvent *event, gpointer data _U_)
return FALSE;
}
/* Returns dynamically allocated memory, must be freed by caller after use */
static char*
create_packet_window_title(void)
{
GString *title;
char *ret;
int i;
title = g_string_new("");
/*
* Build title of window by getting column data constructed when the
* frame was dissected.
*/
for (i = 0; i < cfile.cinfo.num_cols; ++i) {
g_string_append(title, cfile.cinfo.col_data[i]);
g_string_append_c(title, ' ');
}
ret = title->str;
g_string_free(title, FALSE);
return ret;
}
static void
redissect_packet_window(gpointer object, gpointer user_data _U_)
{
struct PacketWinData *DataPtr = (struct PacketWinData *)object;
char *title;
/* XXX, can be optimized? */
proto_tree_draw(NULL, DataPtr->tree_view);
epan_dissect_cleanup(&(DataPtr->edt));
epan_dissect_init(&(DataPtr->edt), TRUE, TRUE);
epan_dissect_run(&(DataPtr->edt), &DataPtr->phdr, 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);
/* update the window title */
title = create_packet_window_title();
gtk_window_set_title(GTK_WINDOW(DataPtr->main), title);
g_free(title);
}
#ifdef WANT_PACKET_EDITOR
static field_info *
proto_finfo_find(proto_tree *tree, field_info *old_finfo)
@ -804,13 +850,7 @@ edit_pkt_win_key_pressed_cb(GtkWidget *win _U_, GdkEventKey *event, gpointer use
/* redissect if changed */
if (data.val != -1) {
/* XXX, can be optimized? */
proto_tree_draw(NULL, DataPtr->tree_view);
epan_dissect_cleanup(&(DataPtr->edt));
epan_dissect_init(&(DataPtr->edt), TRUE, TRUE);
epan_dissect_run(&(DataPtr->edt), &DataPtr->phdr, 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);
redissect_packet_window(DataPtr, NULL);
}
for (src_le = DataPtr->edt.pi.data_src; src_le != NULL; src_le = src_le->next) {
@ -868,14 +908,11 @@ static void modifed_frame_data_free(gpointer data) {
void new_packet_window(GtkWidget *w _U_, gboolean reference, gboolean editable _U_)
{
#define NewWinTitleLen 1000
char Title[NewWinTitleLen] = "";
const char *TextPtr;
char *title;
GtkWidget *main_w, *main_vbox, *pane,
*tree_view, *tv_scrollw,
*bv_nb_ptr;
struct PacketWinData *DataPtr;
int i;
frame_data *fd;
if(reference) {
@ -930,19 +967,10 @@ void new_packet_window(GtkWidget *w _U_, gboolean reference, gboolean editable _
DataPtr->frame, &cfile.cinfo);
epan_dissect_fill_in_columns(&(DataPtr->edt), FALSE, TRUE);
/*
* Build title of window by getting column data constructed when the
* frame was dissected.
*/
for (i = 0; i < cfile.cinfo.num_cols; ++i) {
TextPtr = cfile.cinfo.col_data[i];
if ((strlen(Title) + strlen(TextPtr)) < NewWinTitleLen - 1) {
g_strlcat(Title, TextPtr, NewWinTitleLen);
g_strlcat(Title, " ", NewWinTitleLen);
}
}
main_w = window_new(GTK_WINDOW_TOPLEVEL, Title);
/* update the window title */
title = create_packet_window_title();
main_w = window_new(GTK_WINDOW_TOPLEVEL, title);
g_free(title);
gtk_window_set_default_size(GTK_WINDOW(main_w), DEF_WIDTH, -1);
/* Container for paned windows */
@ -1014,6 +1042,12 @@ void new_packet_window(GtkWidget *w _U_, gboolean reference, gboolean editable _
#endif
}
void
redissect_all_packet_windows(void)
{
g_list_foreach(detail_windows, redissect_packet_window, NULL);
}
static void
destroy_new_window(GObject *object _U_, gpointer user_data)
{

View File

@ -45,4 +45,7 @@ void destroy_packet_wins(void);
/** Redraw the packet bytes panes of all packet windows. */
void redraw_packet_bytes_packet_wins(void);
/** Redissect all packet windows **/
void redissect_all_packet_windows(void);
#endif

View File

@ -56,6 +56,7 @@
#include "ui/gtk/old-gtk-compat.h"
#include "ui/gtk/file_dlg.h"
#include "ui/gtk/dlg_utils.h"
#include "ui/gtk/packet_win.h"
#ifdef HAVE_LIBPCAP
#ifdef _WIN32
@ -1425,6 +1426,7 @@ prefs_main_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w)
if (must_redissect) {
/* Redissect all the packets, and re-evaluate the display filter. */
redissect_packets();
redissect_all_packet_windows();
}
}
@ -1455,6 +1457,7 @@ prefs_main_apply_cb(GtkWidget *apply_bt _U_, gpointer parent_w)
if (must_redissect) {
/* Redissect all the packets, and re-evaluate the display filter. */
redissect_packets();
redissect_all_packet_windows();
}
}
@ -1491,6 +1494,7 @@ prefs_main_save_cb(GtkWidget *save_bt _U_, gpointer parent_w)
if (must_redissect) {
/* Redissect all the packets, and re-evaluate the display filter. */
redissect_packets();
redissect_all_packet_windows();
}
}
@ -1539,6 +1543,7 @@ prefs_main_cancel_cb(GtkWidget *cancel_bt _U_, gpointer parent_w)
if (must_redissect) {
/* Redissect all the packets, and re-evaluate the display filter. */
redissect_packets();
redissect_all_packet_windows();
}
}

View File

@ -70,6 +70,7 @@
#include "ui/gtk/packet_list.h"
#include "ui/gtk/webbrowser.h"
#include "ui/gtk/old-gtk-compat.h"
#include "ui/gtk/packet_win.h"
# define BUTTON_SIZE_X -1
# define BUTTON_SIZE_Y -1
@ -725,6 +726,7 @@ static void uat_apply_changes(uat_t *uat) {
/* Just redissect packets if we have any */
if (cfile.state != FILE_CLOSED) {
redissect_packets ();
redissect_all_packet_windows ();
}
}
}