aboutsummaryrefslogtreecommitdiffstats
path: root/gtk/packet_win.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2000-02-29 06:24:41 +0000
committerGuy Harris <guy@alum.mit.edu>2000-02-29 06:24:41 +0000
commit7c113340005e40b182076b765b675e8db7c85c4c (patch)
tree2f87391c5d48dec1712faab6f9f4b38cc017c9ae /gtk/packet_win.c
parent25c6518e54cb06fb7e6af5304a82a13bf07f5a63 (diff)
downloadwireshark-7c113340005e40b182076b765b675e8db7c85c4c.tar.gz
wireshark-7c113340005e40b182076b765b675e8db7c85c4c.tar.bz2
wireshark-7c113340005e40b182076b765b675e8db7c85c4c.zip
Jeff Foster's changes, with my additions, to allow the user to pop up a
window showing the protocol tree and hex/ASCII data for the currently selected packet. svn path=/trunk/; revision=1670
Diffstat (limited to 'gtk/packet_win.c')
-rw-r--r--gtk/packet_win.c339
1 files changed, 339 insertions, 0 deletions
diff --git a/gtk/packet_win.c b/gtk/packet_win.c
new file mode 100644
index 0000000000..253b6d8268
--- /dev/null
+++ b/gtk/packet_win.c
@@ -0,0 +1,339 @@
+/* packet_win.c
+ * Routines for popping a window to display current packet
+ *
+ * Copyright 2000, Jeffrey C. Foster <jfoste@woodward.com>
+ *
+ * $Id: packet_win.c,v 1.1 2000/02/29 06:24:40 guy Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@zing.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * Copied from main.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * To do:
+ * - Add close button to bottom.
+ * - improve the window Title and allow user to config it
+ * - Add print support ? ( could be a mess)
+ * - Add button to have main window jump to this packet ?
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gtk/gtk.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "main.h"
+#include "timestamp.h"
+#include "packet.h"
+#include "capture.h"
+#include "summary.h"
+#include "file.h"
+#include "menu.h"
+#include "../menu.h"
+#include "prefs_dlg.h"
+#include "column.h"
+#include "print.h"
+#include "resolv.h"
+#include "follow.h"
+#include "util.h"
+#include "packet_win.h"
+#include "simple_dialog.h"
+#include "ui_util.h"
+#include "proto_draw.h"
+#include "dfilter.h"
+#include "keys.h"
+#include "gtkglobals.h"
+#include "plugins.h"
+
+/* Data structure holding information about a packet-detail window. */
+struct PacketWinData {
+ gint cap_len;
+ gint encoding;
+ guint8 *pd; /* Data for packet */
+ proto_tree *protocol_tree; /* Protocol tree for packet */
+ GtkWidget *main;
+ GtkWidget *tv_scrollw;
+ GtkWidget *tree_view;
+ GtkWidget *byte_view;
+ GtkWidget *bv_vscroll_left;
+ GtkWidget *bv_vscroll_right;
+};
+
+/* List of all the packet-detail windows popped up. */
+static GList *detail_windows;
+
+static void new_tree_view_select_row_cb( GtkCTree *ctree, GList *node,
+ gint column, gpointer user_data);
+
+static void new_tree_view_unselect_row_cb( GtkCTree *ctree, GList *node,
+ gint column, gpointer user_data);
+
+static void create_new_window( char *Title, gint tv_size, gint bv_size);
+static void destroy_new_window(gpointer data);
+
+static void set_scrollbar_placement_packet_win(struct PacketWinData *DataPtr,
+ int pos);
+
+void new_window_cb(GtkWidget *w){
+
+ #define NewWinTitleLen 1000
+
+ gint tv_size = 95, bv_size = 75;
+ int i;
+ char Title[ NewWinTitleLen] = "";
+ char *TextPtr;
+
+ /* build title of window by getting */
+ /* data from the packet_list GtkCList */
+ for( i = 0; i < cf.cinfo.num_cols; ++i){
+
+ if ( gtk_clist_get_text(GTK_CLIST( packet_list),
+ cf.current_frame->row, i, &TextPtr)){
+
+ if (( strlen( Title) + strlen( TextPtr))
+ < ( NewWinTitleLen - 1)){
+
+ strcat( Title, TextPtr);
+ strcat( Title, " ");
+ }
+ }
+ }
+
+ create_new_window ( Title, tv_size, bv_size);
+}
+
+
+static void
+create_new_window ( char *Title, gint tv_size, gint bv_size){
+
+ GtkWidget *main_w, *main_vbox, *pane,
+ *tree_view, *byte_view, *tv_scrollw,
+ *bv_vscroll_left, *bv_vscroll_right;
+ struct PacketWinData *DataPtr;
+
+ main_w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ gtk_window_set_title(GTK_WINDOW(main_w), Title);
+ gtk_window_set_default_size(GTK_WINDOW(main_w), DEF_WIDTH, -1);
+
+ /* Container for paned windows */
+ main_vbox = gtk_vbox_new(FALSE, 1);
+ gtk_container_border_width(GTK_CONTAINER(main_vbox), 1);
+ gtk_container_add(GTK_CONTAINER(main_w), main_vbox);
+ gtk_widget_show(main_vbox);
+
+ /* Panes for the tree and byte view */
+ pane = gtk_vpaned_new();
+ gtk_paned_gutter_size(GTK_PANED(pane), (GTK_PANED(pane))->handle_size);
+ gtk_container_add(GTK_CONTAINER(main_vbox), pane);
+ gtk_widget_show(pane);
+
+ /* Tree view */
+ create_tree_view(tv_size, &prefs, pane, &tv_scrollw, &tree_view);
+ gtk_widget_show(tree_view);
+
+ /* Byte view */
+ create_byte_view(bv_size, pane, &byte_view, &bv_vscroll_left,
+ &bv_vscroll_right);
+
+ /* Allocate data structure to represent this window. */
+ DataPtr = (struct PacketWinData *) g_malloc(sizeof(struct PacketWinData));
+
+ DataPtr->cap_len = cf.current_frame->cap_len;
+ DataPtr->encoding = cf.current_frame->encoding;
+ DataPtr->pd = g_malloc(DataPtr->cap_len);
+ memcpy(DataPtr->pd, cf.pd, DataPtr->cap_len);
+ DataPtr->protocol_tree = proto_tree_create_root();
+ dissect_packet(DataPtr->pd, cf.current_frame, DataPtr->protocol_tree);
+ DataPtr->main = main_w;
+ DataPtr->tv_scrollw = tv_scrollw;
+ DataPtr->tree_view = tree_view;
+ DataPtr->byte_view = byte_view;
+ DataPtr->bv_vscroll_left = bv_vscroll_left;
+ DataPtr->bv_vscroll_right = bv_vscroll_right;
+ detail_windows = g_list_append(detail_windows, DataPtr);
+
+ /* Now that the 2 panes are created, set the vertical scrollbar
+ * on the left or right according to the user's preference */
+ set_scrollbar_placement_packet_win(DataPtr, prefs.gui_scrollbar_on_right);
+
+ /* load callback handlers */
+ gtk_signal_connect(GTK_OBJECT(tree_view), "tree-select-row",
+ GTK_SIGNAL_FUNC(new_tree_view_select_row_cb), DataPtr);
+
+ /* This handler needs a destroy function */
+ /* to remove the stored packet data */
+ gtk_signal_connect_full(GTK_OBJECT(tree_view), "tree-unselect-row",
+ GTK_SIGNAL_FUNC(new_tree_view_unselect_row_cb), NULL, DataPtr,
+ &destroy_new_window, FALSE, FALSE);
+
+
+ /* draw the protocol tree & print hex data */
+ proto_tree_draw(DataPtr->protocol_tree, tree_view);
+ packet_hex_print( GTK_TEXT(byte_view), DataPtr->pd,
+ DataPtr->cap_len, -1, -1, DataPtr->encoding);
+
+ gtk_widget_show(main_w);
+}
+
+static void
+destroy_new_window(gpointer data)
+{
+ struct PacketWinData *DataPtr = data;
+
+ detail_windows = g_list_remove(detail_windows, DataPtr);
+ proto_tree_free(DataPtr->protocol_tree);
+ g_free(DataPtr->pd);
+ g_free(DataPtr);
+}
+
+static void
+new_tree_view_select_row_cb(GtkCTree *ctree, GList *node, gint column,
+ gpointer user_data){
+
+/* called when a tree row is selected in the popup packet window */
+
+ field_info *finfo;
+
+ struct PacketWinData *DataPtr = (struct PacketWinData*)user_data;
+
+ g_assert(node);
+ finfo = gtk_ctree_node_get_row_data( ctree, GTK_CTREE_NODE(node) );
+ if (!finfo) return;
+
+ finfo_selected = finfo;
+
+ packet_hex_print(GTK_TEXT(DataPtr->byte_view), DataPtr->pd,
+ DataPtr->cap_len, finfo->start, finfo->length,
+ DataPtr->encoding);
+
+}
+
+static void
+new_tree_view_unselect_row_cb(GtkCTree *ctree, GList *node, gint column,
+ gpointer user_data){
+
+/* called when a tree row is unselected in the popup packet window */
+
+
+
+ struct PacketWinData *DataPtr = (struct PacketWinData*)user_data;
+
+ packet_hex_print(GTK_TEXT(DataPtr->byte_view), DataPtr->pd,
+ DataPtr->cap_len, -1, -1, DataPtr->encoding);
+}
+
+/* Functions called from elsewhere to act on all popup packet windows. */
+
+/* Destroy all popup packet windows. */
+void
+destroy_packet_wins(void)
+{
+ struct PacketWinData *DataPtr;
+
+ /* Destroying a packet window causes it to be removed from
+ the list of packet windows, so we can't do a "g_list_foreach()"
+ to go through the list of all packet windows and destroy them
+ as we find them; instead, as long as the list is non-empty,
+ we destroy the first window on the list. */
+ while (detail_windows != NULL) {
+ DataPtr = (struct PacketWinData *)(detail_windows->data);
+ gtk_widget_destroy(DataPtr->main);
+ }
+}
+
+/* Set the scrollbar position of a given popup packet window based upon
+ pos value: 0 = left, 1 = right */
+static void
+set_scrollbar_placement_packet_win(struct PacketWinData *DataPtr, int pos)
+{
+ set_scrollbar_placement_scrollw(DataPtr->tv_scrollw, pos);
+ set_scrollbar_placement_textw(DataPtr->bv_vscroll_left,
+ DataPtr->bv_vscroll_right, pos);
+}
+
+static void
+set_scrollbar_placement_cb(gpointer data, gpointer user_data)
+{
+ set_scrollbar_placement_packet_win((struct PacketWinData *)data,
+ *(int *)user_data);
+}
+
+/* Set the scrollbar position of all the popup packet windows based upon
+ pos value: 0 = left, 1 = right */
+void
+set_scrollbar_placement_packet_wins(int pos)
+{
+ g_list_foreach(detail_windows, set_scrollbar_placement_cb, &pos);
+}
+
+static void
+set_ptree_sel_browse_cb(gpointer data, gpointer user_data)
+{
+ struct PacketWinData *DataPtr = (struct PacketWinData *)data;
+
+ set_ptree_sel_browse(DataPtr->tree_view, *(gboolean *)user_data);
+}
+
+/* Set the selection mode of all the popup packet windows. */
+void
+set_ptree_sel_browse_packet_wins(gboolean val)
+{
+ g_list_foreach(detail_windows, set_ptree_sel_browse_cb, &val);
+}
+
+static void
+set_ptree_line_style_cb(gpointer data, gpointer user_data)
+{
+ struct PacketWinData *DataPtr = (struct PacketWinData *)data;
+
+ set_ptree_line_style(DataPtr->tree_view, *(gint *)user_data);
+}
+
+/* Set the selection mode of all the popup packet windows. */
+void
+set_ptree_line_style_packet_wins(gint style)
+{
+ g_list_foreach(detail_windows, set_ptree_line_style_cb, &style);
+}
+
+static void
+set_ptree_expander_style_cb(gpointer data, gpointer user_data)
+{
+ struct PacketWinData *DataPtr = (struct PacketWinData *)data;
+
+ set_ptree_expander_style(DataPtr->tree_view, *(gint *)user_data);
+}
+
+/* Set the selection mode of all the popup packet windows. */
+void
+set_ptree_expander_style_packet_wins(gint style)
+{
+ g_list_foreach(detail_windows, set_ptree_expander_style_cb, &style);
+}