Ethereal-dev: Re: [Ethereal-dev] Saving the contents of the TCP follow dialog without formatti
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Alan Jenkins <sourcejedi@xxxxxxxxxxxxxx>
Date: Tue, 20 Jul 2004 19:40:11 +0000
> Look out! Escaped patch! > Sorry, I stil need to fix postcript printing Done. Could someone please review the attached patch? Alan
Index: follow_dlg.c =================================================================== --- follow_dlg.c +++ .svn/tmp/follow_dlg.c.61096.00001.tmp 2004-07-20 19:32:35.000000000 +0000 @@ -78,7 +78,8 @@ SHOW_ASCII, SHOW_EBCDIC, SHOW_HEXDUMP, - SHOW_CARRAY + SHOW_CARRAY, + SHOW_RAW } show_type_t; typedef struct { @@ -90,6 +91,7 @@ GtkWidget *ebcdic_bt; GtkWidget *hexdump_bt; GtkWidget *carray_bt; + GtkWidget *raw_bt; GtkWidget *follow_save_as_w; gboolean is_ipv6; char *filter_out_filter; @@ -415,6 +417,16 @@ SIGNAL_CONNECT(radio_bt, "toggled", follow_charset_toggle_cb, follow_info); follow_info->carray_bt = radio_bt; + + /* Raw radio button */ + radio_bt = gtk_radio_button_new_with_label(gtk_radio_button_group + (GTK_RADIO_BUTTON(radio_bt)), + "Raw"); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_bt), FALSE); + gtk_box_pack_start(GTK_BOX(hbox), radio_bt, FALSE, FALSE, 0); + SIGNAL_CONNECT(radio_bt, "toggled", follow_charset_toggle_cb, + follow_info); + follow_info->raw_bt = radio_bt; /* button hbox */ button_hbox = gtk_hbutton_box_new(); @@ -519,6 +531,8 @@ follow_info->show_type = SHOW_CARRAY; else if (GTK_TOGGLE_BUTTON(follow_info->ascii_bt)->active) follow_info->show_type = SHOW_ASCII; + else if (GTK_TOGGLE_BUTTON(follow_info->raw_bt)->active) + follow_info->show_type = SHOW_RAW; else g_assert_not_reached(); @@ -534,10 +548,26 @@ FRS_PRINT_ERROR } frs_return_t; +/* + * convert non printable characters to periods + */ + +static void ascii_to_raw (char* buffer, int nchars) +{ + int i; + for (i = 0; i < nchars; i++) { + if (buffer[i] == '\n' || buffer[i] == '\r') + continue; + if (! isprint(buffer[i])) { + buffer[i] = '.'; + } + } +} + static frs_return_t follow_read_stream(follow_info_t *follow_info, - gboolean (*print_line) (char *, int, gboolean, void *, print_format_e), - void *arg, print_format_e format) + gboolean (*write_data) (char *, int, gboolean, void *), + void *arg) { tcp_stream_chunk sc; int bcount, iplen; @@ -595,20 +625,18 @@ switch (follow_info->show_type) { case SHOW_EBCDIC: - /* If our native arch is ASCII, call: */ - EBCDIC_to_ASCII(buffer, nchars); - if (!(*print_line) (buffer, nchars, is_server, arg, format)) - goto print_error; - break; + /* convert EBDIC characters to ASCII */ + EBCDIC_to_ASCII(buffer, nchars); case SHOW_ASCII: - /* If our native arch is EBCDIC, call: - * ASCII_TO_EBCDIC(buffer, nchars); - */ - if (!(*print_line) (buffer, nchars, is_server, arg, format)) + ascii_to_raw (buffer, nchars); + + case SHOW_RAW: + if (!(*write_data) (buffer, nchars, is_server, arg)) goto print_error; break; + case SHOW_HEXDUMP: current_pos = 0; while (current_pos < nchars) { @@ -662,7 +690,7 @@ (*global_pos) += i; hexbuf[cur++] = '\n'; hexbuf[cur] = 0; - if (!(*print_line) (hexbuf, strlen(hexbuf), is_server, arg, format)) + if (!(*write_data) (hexbuf, strlen(hexbuf), is_server, arg)) goto print_error; } break; @@ -671,7 +699,7 @@ current_pos = 0; g_snprintf(initbuf, 256, "char peer%d_%d[] = {\n", is_server ? 1 : 0, is_server ? server_packet_count++ : client_packet_count++); - if (!(*print_line) (initbuf, strlen(initbuf), is_server, arg, format)) + if (!(*write_data) (initbuf, strlen(initbuf), is_server, arg)) goto print_error; while (current_pos < nchars) { gchar hexbuf[256]; @@ -705,7 +733,7 @@ (*global_pos) += i; hexbuf[cur++] = '\n'; hexbuf[cur] = 0; - if (!(*print_line) (hexbuf, strlen(hexbuf), is_server, arg, format)) + if (!(*write_data) (hexbuf, strlen(hexbuf), is_server, arg)) goto print_error; } break; @@ -740,29 +768,37 @@ * suggestion. */ static gboolean -follow_print_text(char *buffer, int nchars, gboolean is_server _U_, void *arg, print_format_e format) +follow_print_text(char *buffer, int nchars, gboolean is_server _U_, void *arg) { FILE *fh = arg; - int i; - char *str; + return nchars == (int) fwrite (buffer, 1, nchars, fh); +} - /* convert non printable characters */ - for (i = 0; i < nchars; i++) { - if (buffer[i] == '\n' || buffer[i] == '\r') - continue; - if (! isprint(buffer[i])) { - buffer[i] = '.'; - } - } +static gboolean +follow_print_postscript(char *buffer, int nchars, gboolean is_server _U_, void *arg) +{ + FILE *fh = arg; + char *str, *line, *next_line; - /* convert unterminated char array to a zero terminated string */ - str = g_malloc(nchars + 1); + /* convert unterminated char array to a zero terminated string */ + line = str = g_malloc(nchars + 1); memcpy(str, buffer, nchars); str[nchars] = 0; - print_line(fh, /*indent*/ 0, format, str); - g_free(str); - return TRUE; + /* print buffer a line at a time */ + do { + next_line = strchr (line, '\n'); + if (next_line != NULL) { + *next_line = '\0'; + next_line++; + } + + print_line (fh, 0, PR_FMT_PS, line); + line = next_line; + } while (line != NULL); + g_free(str); + + return TRUE; } static void @@ -835,7 +871,19 @@ if (ferror(fh)) goto print_error; - switch (follow_read_stream(follow_info, follow_print_text, fh, prefs.pr_format)) { + gboolean (*print_function) (char *, int, gboolean, void *); + switch (prefs.pr_format) { + case PR_FMT_TEXT: + print_function = follow_print_text; + break; + case PR_FMT_PS: + print_function = follow_print_postscript; + break; + default: + g_assert_not_reached(); + } + + switch (follow_read_stream(follow_info, print_function, fh)) { case FRS_OK: break; case FRS_OPEN_ERROR: @@ -888,8 +936,7 @@ } static gboolean -follow_add_to_gtk_text(char *buffer, int nchars, gboolean is_server, - void *arg, print_format_e format _U_) +follow_add_to_gtk_text(char *buffer, int nchars, gboolean is_server, void *arg) { GtkWidget *text = arg; GdkColor fg, bg; @@ -964,7 +1011,7 @@ #else gtk_text_buffer_set_text(buf, "", -1); #endif - follow_read_stream(follow_info, follow_add_to_gtk_text, follow_info->text, PR_FMT_TEXT); + follow_read_stream(follow_info, follow_add_to_gtk_text, follow_info->text); #if GTK_MAJOR_VERSION < 2 gtk_text_thaw(GTK_TEXT(follow_info->text)); #endif @@ -1008,10 +1055,10 @@ #else /* Connect the ok_button to file_save_as_ok_cb function and pass along a pointer to the file selection box widget */ - SIGNAL_CONNECT(GTK_FILE_SELECTION(new_win)->ok_button, + SIGNAL_CONNECT(GTK_FILE_SELECTION(new_win)->ok_button, "clicked", follow_save_as_ok_cb, new_win); - window_set_cancel_button(new_win, + window_set_cancel_button(new_win, GTK_FILE_SELECTION(new_win)->cancel_button, window_cancel_button_cb); gtk_file_selection_set_filename(GTK_FILE_SELECTION(new_win), ""); @@ -1060,7 +1107,7 @@ follow_info = OBJECT_GET_DATA(fs, E_FOLLOW_INFO_KEY); window_destroy(GTK_WIDGET(fs)); - switch (follow_read_stream(follow_info, follow_print_text, fh, PR_FMT_TEXT)) { + switch (follow_read_stream(follow_info, follow_print_text, fh)) { case FRS_OK: if (fclose(fh) == EOF)
- Follow-Ups:
- References:
- [Ethereal-dev] Saving the contents of the TCP follow dialog without formatting
- From: Alan Jenkins
- Re: [Ethereal-dev] Saving the contents of the TCP follow dialog without formatting
- From: Alan Jenkins
- Re: [Ethereal-dev] Saving the contents of the TCP follow dialog without formatting
- From: Alan Jenkins
- [Ethereal-dev] Saving the contents of the TCP follow dialog without formatting
- Prev by Date: [Ethereal-dev] CRC wish list
- Next by Date: Re: [Ethereal-dev] Re: [Ethereal-cvs] r11426 - trunk: trunk/acinclude.m4
- Previous by thread: Re: [Ethereal-dev] Saving the contents of the TCP follow dialog without formatting
- Next by thread: Re: [Ethereal-dev] Saving the contents of the TCP follow dialog without formatting
- Index(es):