diff --git a/file.c b/file.c index fa7ca74906..6b933d93bf 100644 --- a/file.c +++ b/file.c @@ -1,7 +1,7 @@ /* file.c * File I/O routines * - * $Id: file.c,v 1.373 2004/04/15 23:28:10 guy Exp $ + * $Id: file.c,v 1.374 2004/04/16 18:17:47 ulfl Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -1506,13 +1506,22 @@ print_packet(capture_file *cf, frame_data *fdata, int line_len; int column_len; int cp_off; + gboolean proto_tree_needed; + + + proto_tree_needed = + args->print_args->print_dissections != print_dissections_none || args->print_args->print_hex; + + /* Fill in the column information, but don't bother creating + the logical protocol tree. */ + edt = epan_dissect_new(proto_tree_needed, proto_tree_needed); + epan_dissect_run(edt, pseudo_header, pd, fdata, &cf->cinfo); + epan_dissect_fill_in_columns(edt); + + if (args->print_separator) + print_line(args->print_fh, 0, args->print_args->format, ""); if (args->print_args->print_summary) { - /* Fill in the column information, but don't bother creating - the logical protocol tree. */ - edt = epan_dissect_new(FALSE, FALSE); - epan_dissect_run(edt, pseudo_header, pd, fdata, &cf->cinfo); - epan_dissect_fill_in_columns(edt); cp = &args->line_buf[0]; line_len = 0; for (i = 0; i < cf->cinfo.num_cols; i++) { @@ -1542,27 +1551,24 @@ print_packet(capture_file *cf, frame_data *fdata, } *cp = '\0'; print_line(args->print_fh, 0, args->print_args->format, args->line_buf); - } else { - if (args->print_separator) - print_line(args->print_fh, 0, args->print_args->format, ""); - - /* Create the logical protocol tree, complete with the display - representation of the items; we don't need the columns here, - however. */ - edt = epan_dissect_new(TRUE, TRUE); - epan_dissect_run(edt, pseudo_header, pd, fdata, NULL); - + } /* if (print_summary) */ + + if (args->print_args->print_dissections != print_dissections_none) { /* Print the information in that tree. */ proto_tree_print(args->print_args, edt, args->print_fh); - if (args->print_args->print_hex) { - /* Print the full packet data as hex. */ - print_hex_data(args->print_fh, args->print_args->format, edt); - } + /* Print a blank line if we print anything after this (aka more than one packet). */ + args->print_separator = TRUE; + } - /* Print a blank line if we print anything after this. */ + if (args->print_args->print_hex) { + /* Print the full packet data as hex. */ + print_hex_data(args->print_fh, args->print_args->format, edt); + + /* Print a blank line if we print anything after this (aka more than one packet). */ args->print_separator = TRUE; } /* if (print_summary) */ + epan_dissect_free(edt); return !ferror(args->print_fh); diff --git a/gtk/print_dlg.c b/gtk/print_dlg.c index 1cfebbc776..e64efd6b69 100644 --- a/gtk/print_dlg.c +++ b/gtk/print_dlg.c @@ -1,7 +1,7 @@ /* print_dlg.c * Dialog boxes for printing * - * $Id: print_dlg.c,v 1.65 2004/04/16 05:30:39 ulfl Exp $ + * $Id: print_dlg.c,v 1.66 2004/04/16 18:17:48 ulfl Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -85,13 +85,15 @@ static gchar * print_cmd; #define PRINT_PDML_RB_KEY "printer_pdml_radio_button" #define PRINT_DEST_CB_KEY "printer_destination_check_button" +#define PRINT_SUMMARY_CB_KEY "printer_summary_check_button" #define PRINT_DETAILS_CB_KEY "printer_details_check_button" -#define PRINT_NONE_RB_KEY "printer_none_radio_button" #define PRINT_COLLAPSE_ALL_RB_KEY "printer_collapse_all_radio_button" #define PRINT_AS_DISPLAYED_RB_KEY "printer_as_displayed_radio_button" #define PRINT_EXPAND_ALL_RB_KEY "printer_expand_all_radio_button" #define PRINT_HEX_CB_KEY "printer_hex_check_button" +#define PRINT_BT_KEY "printer_button" + /* XXX - can we make these not be static? */ static packet_range_t range; static GtkWidget *captured_bt; @@ -330,10 +332,13 @@ file_print_cmd_cb(GtkWidget *widget _U_, gpointer data _U_) GtkWidget *packet_hb; - GtkWidget *details_sep; GtkWidget *format_fr, *format_vb; - GtkWidget *details_cb, *details_vb; - GtkWidget *none_rb, *collapse_all_rb, *as_displayed_rb, *expand_all_rb,*hex_cb; + GtkWidget *summary_cb; + + GtkWidget *details_cb; + GtkWidget *details_hb, *details_vb; + GtkWidget *collapse_all_rb, *as_displayed_rb, *expand_all_rb; + GtkWidget *hex_cb; GtkWidget *bbox, *ok_bt, *cancel_bt; @@ -613,64 +618,73 @@ file_print_cmd_cb(GtkWidget *widget _U_, gpointer data _U_) gtk_container_add(GTK_CONTAINER(format_fr), format_vb); gtk_widget_show(format_vb); - /* "Print detail" check buttons */ - details_cb = CHECK_BUTTON_NEW_WITH_MNEMONIC("Packet d_etails:", accel_group); + /* "Print summary line" check button */ + summary_cb = CHECK_BUTTON_NEW_WITH_MNEMONIC("Packet summary line", accel_group); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(summary_cb), FALSE); + SIGNAL_CONNECT(summary_cb, "clicked", print_cmd_toggle_detail, print_w); + gtk_tooltips_set_tip (tooltips, summary_cb, ("Print a packet summary line, like in the packet list"), NULL); + gtk_container_add(GTK_CONTAINER(format_vb), summary_cb); + gtk_widget_show(summary_cb); + + + /* "Details" check button */ + details_cb = CHECK_BUTTON_NEW_WITH_MNEMONIC("Packet details:", accel_group); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(details_cb), TRUE); - SIGNAL_CONNECT(details_cb, "clicked", print_cmd_toggle_detail, NULL); - gtk_tooltips_set_tip (tooltips, details_cb, ("Print packet details, or a packet summary line only"), NULL); + SIGNAL_CONNECT(details_cb, "clicked", print_cmd_toggle_detail, print_w); + gtk_tooltips_set_tip (tooltips, details_cb, ("Print the selected packet details (protocol tree)."), NULL); gtk_container_add(GTK_CONTAINER(format_vb), details_cb); gtk_widget_show(details_cb); - /*** packet details ***/ - details_sep = gtk_hseparator_new(); - gtk_box_pack_start(GTK_BOX(format_vb), details_sep, FALSE, FALSE, 0); - gtk_widget_show(details_sep); + details_hb = gtk_hbox_new(FALSE, 6); + gtk_container_border_width(GTK_CONTAINER(details_hb), 0); + gtk_container_add(GTK_CONTAINER(format_vb), details_hb); + gtk_widget_show(details_hb); - details_vb = gtk_vbox_new(FALSE, 5); + details_vb = gtk_vbox_new(FALSE, 6); gtk_container_border_width(GTK_CONTAINER(details_vb), 0); - gtk_container_add(GTK_CONTAINER(format_vb), details_vb); + gtk_container_add(GTK_CONTAINER(details_hb), details_vb); gtk_widget_show(details_vb); - /* "None"/"All collapsed"/"As displayed"/"All Expanded" radio buttons */ - none_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(NULL, "_No dissections", accel_group); - gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(none_rb), FALSE); - gtk_tooltips_set_tip (tooltips, none_rb, ("Don't print a packet details tree at all. " - "Use this together with the \"Packet hex data\" option, to get a plain packet hexdump."), NULL); - gtk_container_add(GTK_CONTAINER(details_vb), none_rb); - gtk_widget_show(none_rb); + details_vb = gtk_vbox_new(FALSE, 6); + gtk_container_border_width(GTK_CONTAINER(details_vb), 0); + gtk_container_add(GTK_CONTAINER(details_hb), details_vb); + gtk_widget_show(details_vb); - collapse_all_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(none_rb, "All dissections co_llapsed", accel_group); + /* "All collapsed"/"As displayed"/"All Expanded" radio buttons */ + collapse_all_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(NULL, "All co_llapsed", accel_group); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(collapse_all_rb), FALSE); gtk_tooltips_set_tip (tooltips, collapse_all_rb, ("Print packet details tree \"collapsed\""), NULL); gtk_container_add(GTK_CONTAINER(details_vb), collapse_all_rb); gtk_widget_show(collapse_all_rb); - as_displayed_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(none_rb, "Dissections as displa_yed", accel_group); + as_displayed_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(collapse_all_rb, "As displa_yed", accel_group); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(as_displayed_rb), TRUE); gtk_tooltips_set_tip (tooltips, as_displayed_rb, ("Print packet details tree \"as displayed\""), NULL); gtk_container_add(GTK_CONTAINER(details_vb), as_displayed_rb); gtk_widget_show(as_displayed_rb); - expand_all_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(none_rb, "All dissections e_xpanded", accel_group); + expand_all_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(collapse_all_rb, "All e_xpanded", accel_group); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(expand_all_rb), FALSE); gtk_tooltips_set_tip (tooltips, expand_all_rb, ("Print packet details tree \"expanded\""), NULL); gtk_container_add(GTK_CONTAINER(details_vb), expand_all_rb); gtk_widget_show(expand_all_rb); /* "Print hex" check button. */ - hex_cb = CHECK_BUTTON_NEW_WITH_MNEMONIC("Packet _hex data", accel_group); + hex_cb = CHECK_BUTTON_NEW_WITH_MNEMONIC("Packet bytes", accel_group); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(hex_cb), FALSE); + SIGNAL_CONNECT(hex_cb, "clicked", print_cmd_toggle_detail, print_w); gtk_tooltips_set_tip (tooltips, hex_cb, ("Add hexdump of packet data"), NULL); - gtk_container_add(GTK_CONTAINER(details_vb), hex_cb); + gtk_container_add(GTK_CONTAINER(format_vb), hex_cb); gtk_widget_show(hex_cb); - OBJECT_SET_DATA(details_cb, PRINT_NONE_RB_KEY, none_rb); - OBJECT_SET_DATA(details_cb, PRINT_COLLAPSE_ALL_RB_KEY, collapse_all_rb); - OBJECT_SET_DATA(details_cb, PRINT_AS_DISPLAYED_RB_KEY, as_displayed_rb); - OBJECT_SET_DATA(details_cb, PRINT_EXPAND_ALL_RB_KEY, expand_all_rb); - OBJECT_SET_DATA(details_cb, PRINT_HEX_CB_KEY, hex_cb); + OBJECT_SET_DATA(print_w, PRINT_SUMMARY_CB_KEY, summary_cb); + OBJECT_SET_DATA(print_w, PRINT_DETAILS_CB_KEY, details_cb); + OBJECT_SET_DATA(print_w, PRINT_COLLAPSE_ALL_RB_KEY, collapse_all_rb); + OBJECT_SET_DATA(print_w, PRINT_AS_DISPLAYED_RB_KEY, as_displayed_rb); + OBJECT_SET_DATA(print_w, PRINT_EXPAND_ALL_RB_KEY, expand_all_rb); + OBJECT_SET_DATA(print_w, PRINT_HEX_CB_KEY, hex_cb); /*****************************************************/ @@ -681,6 +695,9 @@ file_print_cmd_cb(GtkWidget *widget _U_, gpointer data _U_) gtk_widget_show(bbox); ok_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_PRINT); + + OBJECT_SET_DATA(print_w, PRINT_BT_KEY, ok_bt); + OBJECT_SET_DATA(ok_bt, PRINT_PS_RB_KEY, ps_rb); OBJECT_SET_DATA(ok_bt, PRINT_PDML_RB_KEY, pdml_rb); OBJECT_SET_DATA(ok_bt, PRINT_DEST_CB_KEY, dest_cb); @@ -689,11 +706,12 @@ file_print_cmd_cb(GtkWidget *widget _U_, gpointer data _U_) #endif OBJECT_SET_DATA(ok_bt, PRINT_FILE_TE_KEY, file_te); + OBJECT_SET_DATA(ok_bt, PRINT_SUMMARY_CB_KEY, summary_cb); OBJECT_SET_DATA(ok_bt, PRINT_DETAILS_CB_KEY, details_cb); - OBJECT_SET_DATA(ok_bt, PRINT_HEX_CB_KEY, hex_cb); OBJECT_SET_DATA(ok_bt, PRINT_COLLAPSE_ALL_RB_KEY, collapse_all_rb); OBJECT_SET_DATA(ok_bt, PRINT_AS_DISPLAYED_RB_KEY, as_displayed_rb); OBJECT_SET_DATA(ok_bt, PRINT_EXPAND_ALL_RB_KEY, expand_all_rb); + OBJECT_SET_DATA(ok_bt, PRINT_HEX_CB_KEY, hex_cb); SIGNAL_CONNECT(ok_bt, "clicked", print_ok_cb, print_w); gtk_widget_grab_default(ok_bt); @@ -751,21 +769,24 @@ print_cmd_toggle_dest(GtkWidget *widget, gpointer data _U_) gtk_widget_set_sensitive(file_te, to_file); } + static void -print_cmd_toggle_detail(GtkWidget *widget, gpointer data _U_) +print_cmd_toggle_detail(GtkWidget *widget _U_, gpointer data) { - GtkWidget *none_rb, *collapse_all_rb, *expand_all_rb, *as_displayed_rb, *hex_cb; + GtkWidget *print_bt, *summary_cb, *details_cb, *collapse_all_rb, *expand_all_rb, *as_displayed_rb, *hex_cb; gboolean print_detail; - none_rb = GTK_WIDGET(OBJECT_GET_DATA(widget, PRINT_NONE_RB_KEY)); - collapse_all_rb = GTK_WIDGET(OBJECT_GET_DATA(widget, PRINT_COLLAPSE_ALL_RB_KEY)); - as_displayed_rb = GTK_WIDGET(OBJECT_GET_DATA(widget, + print_bt = GTK_WIDGET(OBJECT_GET_DATA(data, PRINT_BT_KEY)); + summary_cb = GTK_WIDGET(OBJECT_GET_DATA(data, PRINT_SUMMARY_CB_KEY)); + details_cb = GTK_WIDGET(OBJECT_GET_DATA(data, PRINT_DETAILS_CB_KEY)); + collapse_all_rb = GTK_WIDGET(OBJECT_GET_DATA(data, PRINT_COLLAPSE_ALL_RB_KEY)); + as_displayed_rb = GTK_WIDGET(OBJECT_GET_DATA(data, PRINT_AS_DISPLAYED_RB_KEY)); - expand_all_rb = GTK_WIDGET(OBJECT_GET_DATA(widget, PRINT_EXPAND_ALL_RB_KEY)); - hex_cb = GTK_WIDGET(OBJECT_GET_DATA(widget, PRINT_HEX_CB_KEY)); + expand_all_rb = GTK_WIDGET(OBJECT_GET_DATA(data, PRINT_EXPAND_ALL_RB_KEY)); + hex_cb = GTK_WIDGET(OBJECT_GET_DATA(data, PRINT_HEX_CB_KEY)); - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget))) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (details_cb))) { /* They selected "Print detail" */ print_detail = TRUE; } else { @@ -773,11 +794,16 @@ print_cmd_toggle_detail(GtkWidget *widget, gpointer data _U_) print_detail = FALSE; } - gtk_widget_set_sensitive(none_rb, print_detail); gtk_widget_set_sensitive(collapse_all_rb, print_detail); gtk_widget_set_sensitive(as_displayed_rb, print_detail); gtk_widget_set_sensitive(expand_all_rb, print_detail); - gtk_widget_set_sensitive(hex_cb, print_detail); + + print_detail = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (summary_cb)) || + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (details_cb)) || + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (hex_cb)); + + gtk_widget_set_sensitive(print_bt, print_detail); } #ifdef _WIN32 @@ -844,13 +870,8 @@ print_ok_cb(GtkWidget *ok_bt, gpointer parent_w) print_format = PR_FMT_PDML; print_args.format = print_format; - button = (GtkWidget *)OBJECT_GET_DATA(ok_bt, PRINT_DETAILS_CB_KEY); - print_args.print_summary = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)); - - button = (GtkWidget *)OBJECT_GET_DATA(ok_bt, PRINT_HEX_CB_KEY); - print_args.print_hex = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)); - - print_args.print_dissections = print_dissections_none; + button = (GtkWidget *)OBJECT_GET_DATA(ok_bt, PRINT_SUMMARY_CB_KEY); + print_args.print_summary = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)); button = (GtkWidget *)OBJECT_GET_DATA(ok_bt, PRINT_COLLAPSE_ALL_RB_KEY); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button))) { @@ -865,6 +886,15 @@ print_ok_cb(GtkWidget *ok_bt, gpointer parent_w) print_args.print_dissections = print_dissections_expanded; } + /* the details setting has priority over the radio buttons */ + button = (GtkWidget *)OBJECT_GET_DATA(ok_bt, PRINT_DETAILS_CB_KEY); + if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button))) { + print_args.print_dissections = print_dissections_none; + } + + button = (GtkWidget *)OBJECT_GET_DATA(ok_bt, PRINT_HEX_CB_KEY); + print_args.print_hex = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (button)); + print_args.range = range; gtk_widget_destroy(GTK_WIDGET(parent_w)); diff --git a/print.c b/print.c index 9320a62157..56e085654d 100644 --- a/print.c +++ b/print.c @@ -1,7 +1,7 @@ /* print.c * Routines for printing packet analysis trees. * - * $Id: print.c,v 1.73 2004/04/15 19:56:15 ulfl Exp $ + * $Id: print.c,v 1.74 2004/04/16 18:17:47 ulfl Exp $ * * Gilbert Ramirez * @@ -187,8 +187,7 @@ void proto_tree_print_node(proto_node *node, gpointer data) proto_item_fill_label(fi, label_str); } - if (pdata->print_dissections != print_dissections_none) - print_line(pdata->fh, pdata->level, pdata->format, label_ptr); + print_line(pdata->fh, pdata->level, pdata->format, label_ptr); /* If it's uninterpreted data, dump it (unless our caller will be printing the entire packet in hex). */ @@ -334,6 +333,14 @@ proto_tree_print_node_pdml(proto_node *node, gpointer data) print_escaped_xml(pdata->fh, label_ptr); } +#if 0 + fputs("\" showname=\"", pdata->fh); + print_escaped_xml(pdata->fh, fi->hfinfo->name); + if(!fi->visible) { + fprintf(pdata->fh, "\" hide=\"yes"); + } +#endif + fprintf(pdata->fh, "\" size=\"%d", fi->length); fprintf(pdata->fh, "\" pos=\"%d", fi->start); /* fprintf(pdata->fh, "\" id=\"%d", fi->hfinfo->id);*/ @@ -654,12 +661,20 @@ void ps_clean_string(unsigned char *out, const unsigned char *in, void print_preamble(FILE *fh, gint format) { - if (format == PR_FMT_PS) + switch(format) { + case(PR_FMT_TEXT): + /* do nothing */ + break; + case(PR_FMT_PS): print_ps_preamble(fh); - else if (format == PR_FMT_PDML) { + break; + case(PR_FMT_PDML): fputs("\n", fh); fputs("\n", PACKAGE, VERSION); + break; + default: + g_assert_not_reached(); } } @@ -667,10 +682,18 @@ print_preamble(FILE *fh, gint format) void print_finale(FILE *fh, gint format) { - if (format == PR_FMT_PS) + switch(format) { + case(PR_FMT_TEXT): + /* do nothing */ + break; + case(PR_FMT_PS): print_ps_finale(fh); - else if (format == PR_FMT_PDML) { + break; + case(PR_FMT_PDML): fputs("\n", fh); + break; + default: + g_assert_not_reached(); } } diff --git a/tethereal.c b/tethereal.c index 2450495d7a..1efad85f36 100644 --- a/tethereal.c +++ b/tethereal.c @@ -1,6 +1,6 @@ /* tethereal.c * - * $Id: tethereal.c,v 1.233 2004/03/23 21:19:56 guy Exp $ + * $Id: tethereal.c,v 1.234 2004/04/16 18:17:47 ulfl Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -2609,8 +2609,8 @@ wtap_dispatch_cb_print(guchar *user, const struct wtap_pkthdr *phdr, print_args.to_file = TRUE; print_args.format = print_format; print_args.print_summary = !verbose; - print_args.print_hex = print_hex; - print_args.print_dissections = print_dissections_expanded; + print_args.print_hex = verbose && print_hex; + print_args.print_dissections = verbose ? print_dissections_expanded : print_dissections_none; /* init the packet range */ packet_range_init(&print_args.range);