diff options
author | Gilbert Ramirez <gram@alumni.rice.edu> | 1999-10-19 04:11:23 +0000 |
---|---|---|
committer | Gilbert Ramirez <gram@alumni.rice.edu> | 1999-10-19 04:11:23 +0000 |
commit | 2dd24ea353a4c25370938c008f461bf00629d48b (patch) | |
tree | c75d3f5276cd0e77f516c6b700546df546b27b07 /gtk | |
parent | 10fcfef266be47d37585c211125fac7b7ad960c5 (diff) |
Add ASCII/EBCDIC conversion to TCP Follow window. Also add Close button
for ease-of-use with window managers w/o "destroy" buttons (twm).
svn path=/trunk/; revision=884
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/main.c | 143 |
1 files changed, 129 insertions, 14 deletions
diff --git a/gtk/main.c b/gtk/main.c index eb55e8fa68..e7dbb58d85 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1,6 +1,6 @@ /* main.c * - * $Id: main.c,v 1.23 1999/10/15 20:33:06 guy Exp $ + * $Id: main.c,v 1.24 1999/10/19 04:11:23 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -115,6 +115,9 @@ GtkStyle *item_style; /* Specifies byte offsets for object selected in tree */ static gint tree_selected_start=-1, tree_selected_len=-1; +static void follow_destroy_cb(GtkWidget *win, gpointer data); +static void follow_charset_toggle_cb(GtkWidget *w, gpointer parent_w); +static void follow_load_text(GtkWidget *text, char *filename, gboolean show_ascii); /* About Ethereal window */ void @@ -163,6 +166,7 @@ void follow_stream_cb( GtkWidget *w, gpointer data ) { char filename1[128+1]; GtkWidget *streamwindow, *box, *text, *vscrollbar, *table; + GtkWidget *hbox, *close_bt, *button; int tmp_fd; gchar *follow_filter; @@ -205,10 +209,15 @@ follow_stream_cb( GtkWidget *w, gpointer data ) { /* the filename1 file now has all the text that was in the session */ streamwindow = gtk_window_new( GTK_WINDOW_TOPLEVEL); gtk_widget_set_name( streamwindow, "TCP stream window" ); - gtk_signal_connect( GTK_OBJECT(streamwindow), "delete_event", +/* gtk_signal_connect( GTK_OBJECT(streamwindow), "delete_event", NULL, "WM destroy" ); gtk_signal_connect( GTK_OBJECT(streamwindow), "destroy", - NULL, "WM destroy" ); + NULL, "WM destroy" );*/ + gtk_signal_connect( GTK_OBJECT(streamwindow), "delete_event", + GTK_SIGNAL_FUNC(follow_destroy_cb), NULL); + gtk_signal_connect( GTK_OBJECT(streamwindow), "destroy", + GTK_SIGNAL_FUNC(follow_destroy_cb), NULL); + if( incomplete_tcp_stream ) { gtk_window_set_title( GTK_WINDOW(streamwindow), "Contents of TCP stream (incomplete)" ); @@ -238,6 +247,39 @@ follow_stream_cb( GtkWidget *w, gpointer data ) { GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0 ); gtk_widget_show(text); + /* Create hbox */ + hbox = gtk_hbox_new( FALSE, 1 ); + gtk_box_pack_end( GTK_BOX(box), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + +#define E_FOLLOW_ASCII_KEY "follow_ascii_key" + + /* Create Radio Buttons */ + button = gtk_radio_button_new_with_label(NULL, "ASCII"); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); + gtk_object_set_data(GTK_OBJECT(streamwindow), E_FOLLOW_ASCII_KEY, button); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gtk_signal_connect(GTK_OBJECT(button), "toggled", + GTK_SIGNAL_FUNC(follow_charset_toggle_cb), + GTK_OBJECT(streamwindow)); + gtk_widget_show(button); + + button = gtk_radio_button_new_with_label( + gtk_radio_button_group(GTK_RADIO_BUTTON(button)), + "EBCDIC"); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + /* Create Close Button */ + close_bt = gtk_button_new_with_label("Close"); + gtk_signal_connect_object(GTK_OBJECT(close_bt), "clicked", + GTK_SIGNAL_FUNC(gtk_widget_destroy), + GTK_OBJECT(streamwindow)); + gtk_box_pack_end( GTK_BOX(hbox), close_bt, FALSE, FALSE, 0); + gtk_widget_show( close_bt ); + + /* create the scrollbar */ vscrollbar = gtk_vscrollbar_new( GTK_TEXT(text)->vadj ); gtk_table_attach( GTK_TABLE(table), vscrollbar, 1, 2, 0, 1, @@ -245,14 +287,95 @@ follow_stream_cb( GtkWidget *w, gpointer data ) { gtk_widget_show( vscrollbar ); gtk_widget_realize( text ); + /* Tuck away the filename and textbox into streamwindow */ +#define E_FOLLOW_FILENAME_KEY "follow_filename_key" +#define E_FOLLOW_TEXT_KEY "follow_text_key" + + gtk_object_set_data(GTK_OBJECT(streamwindow), E_FOLLOW_FILENAME_KEY, + g_strdup(filename1)); + gtk_object_set_data(GTK_OBJECT(streamwindow), E_FOLLOW_TEXT_KEY, text); + + follow_load_text(text, filename1, TRUE); + + data_out_file = NULL; + gtk_widget_show( streamwindow ); + } else { + simple_dialog(ESD_TYPE_WARN, NULL, + "Error following stream. Please make\n" + "sure you have a TCP packet selected."); + } +} + +/* The destroy call back has the responsibility of + * unlinking the temporary file */ +static void +follow_destroy_cb(GtkWidget *win, gpointer data) +{ + char *filename; + + filename = (char*) gtk_object_get_data(GTK_OBJECT(win), + E_FOLLOW_FILENAME_KEY); + g_assert(filename); + + unlink(filename); + gtk_widget_destroy(win); +} + +/* Handles the ASCII/EBCDIC toggling */ +static void +follow_charset_toggle_cb(GtkWidget *w, gpointer parent_w) +{ + gboolean show_ascii = FALSE; + GtkWidget *button, *text; + char *filename; + + + button = (GtkWidget*) gtk_object_get_data(GTK_OBJECT(parent_w), + E_FOLLOW_ASCII_KEY); + text = (GtkWidget*) gtk_object_get_data(GTK_OBJECT(parent_w), + E_FOLLOW_TEXT_KEY); + filename = (char*) gtk_object_get_data(GTK_OBJECT(parent_w), + E_FOLLOW_FILENAME_KEY); + + g_assert(button); + g_assert(text); + g_assert(filename); + + if (GTK_TOGGLE_BUTTON(button)->active) + show_ascii = TRUE; + + follow_load_text(text, filename, show_ascii); +} + +static void +follow_load_text(GtkWidget *text, char *filename, gboolean show_ascii) +{ + int bytes_already; + + /* Delete any info already in text box */ + bytes_already = gtk_text_get_length(GTK_TEXT(text)); + if (bytes_already > 0) { + gtk_text_set_point(GTK_TEXT(text), 0); + gtk_text_forward_delete(GTK_TEXT(text), bytes_already); + } + /* stop the updates while we fill the text box */ gtk_text_freeze( GTK_TEXT(text) ); - data_out_file = fopen( filename1, "r" ); + data_out_file = fopen( filename, "r" ); if( data_out_file ) { char buffer[1024]; int nchars; while( 1 ) { nchars = fread( buffer, 1, 1024, data_out_file ); + if (show_ascii) { + /* If our native arch is EBCDIC, call: + * ASCII_TO_EBCDIC(buffer, nchars); + */ + } + else { + /* If our native arch is ASCII, call: */ + EBCDIC_to_ASCII(buffer, nchars); + } gtk_text_insert( GTK_TEXT(text), m_r_font, NULL, NULL, buffer, nchars ); if( nchars < 1024 ) { break; @@ -260,22 +383,14 @@ follow_stream_cb( GtkWidget *w, gpointer data ) { } if( ferror( data_out_file ) ) { simple_dialog(ESD_TYPE_WARN, NULL, - "Error reading temporary file %s: %s", filename1, strerror(errno)); + "Error reading temporary file %s: %s", filename, strerror(errno)); } fclose( data_out_file ); } else { simple_dialog(ESD_TYPE_WARN, NULL, - "Could not open temporary file %s: %s", filename1, strerror(errno)); + "Could not open temporary file %s: %s", filename, strerror(errno)); } gtk_text_thaw( GTK_TEXT(text) ); - unlink( filename1 ); - data_out_file = NULL; - gtk_widget_show( streamwindow ); - } else { - simple_dialog(ESD_TYPE_WARN, NULL, - "Error following stream. Please make\n" - "sure you have a TCP packet selected."); - } } /* Match selected byte pattern */ |