diff options
author | Gerald Combs <gerald@wireshark.org> | 2012-10-12 23:40:29 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2012-10-12 23:40:29 +0000 |
commit | cfa22deaae3169b3bca9fd4cd9c564d391531bb0 (patch) | |
tree | 9ae2671a2c61b6a3bbf23e2f8097a6a34270f713 /ui/qt/export_dissection_dialog.cpp | |
parent | c91c1df500cc3950cc7a375aaae72f20ea0eb652 (diff) |
Add a packet format group box, similar to the packet range group box.
Use it in the new "Export Packet Dissections" dialog.
I'm omitting PostScript exports on purpose. If you *really* need that
feature you can probably get better results than we produce using text +
enscript or print-to-PDF + pdf2ps/pdftops or PSML/PDML + XSL + ...
The Windows code is untested. I'll check in any needed fixes shortly.
svn path=/trunk/; revision=45513
Diffstat (limited to 'ui/qt/export_dissection_dialog.cpp')
-rw-r--r-- | ui/qt/export_dissection_dialog.cpp | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/ui/qt/export_dissection_dialog.cpp b/ui/qt/export_dissection_dialog.cpp new file mode 100644 index 0000000000..47ba3d72cc --- /dev/null +++ b/ui/qt/export_dissection_dialog.cpp @@ -0,0 +1,249 @@ +/* export_dissection_dialog.cpp + * + * $Id: capture_file_dialog.h 45164 2012-09-27 02:43:09Z eapache $ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "export_dissection_dialog.h" + +#if !defined(Q_WS_WIN) +#include "print.h" + +#include "ui/alert_box.h" +#include "ui/help_url.h" + +#include <epan/filesystem.h> + +#include "qt_ui_utils.h" + +#include <QDialogButtonBox> +#include <QGridLayout> +#include <QPushButton> +#include <QMessageBox> +#include <QDesktopServices> +#include <QUrl> + +#include <QDebug> +#endif // Q_WS_WIN + +ExportDissectionDialog::ExportDissectionDialog(QWidget *parent, export_type_e export_type, capture_file *cap_file): + QFileDialog(parent), + export_type_(export_type), + cap_file_(cap_file), + save_bt_(NULL) +{ +#if !defined(Q_WS_WIN) + QDialogButtonBox *button_box = findChild<QDialogButtonBox *>(); + QGridLayout *fd_grid = qobject_cast<QGridLayout*>(layout()); + QHBoxLayout *h_box = new QHBoxLayout(); + QStringList name_filters; + int last_row; + + setWindowTitle(tr("Wireshark: Export Packet Dissections")); + setAcceptMode(QFileDialog::AcceptSave); + setLabelText(FileType, "Export as:"); + + if (button_box) { + save_bt_ = button_box->button(QDialogButtonBox::Save); + } + + // export_type_map_keys() sorts alphabetically. We don't want that. + name_filters + << "Plain text (*.txt)" + << "Comma Separated Values - summary (*.csv)" + << "PSML - summary (*.psml, *.xml)" + << "PDML - details (*.pdml, *.xml)" + << "C Arrays - bytes (*.c, *.h)"; + export_type_map_[name_filters[0]] = export_type_text; + export_type_map_[name_filters[1]] = export_type_csv; + export_type_map_[name_filters[2]] = export_type_psml; + export_type_map_[name_filters[3]] = export_type_pdml; + export_type_map_[name_filters[4]] = export_type_carrays; + setNameFilters(name_filters); + selectNameFilter(export_type_map_.key(export_type)); + exportTypeChanged(export_type_map_.key(export_type)); + + last_row = fd_grid->rowCount(); + fd_grid->addItem(new QSpacerItem(1, 1), last_row, 0); + fd_grid->addLayout(h_box, last_row, 1); + + /* Init the export range */ + packet_range_init(&print_args_.range, cap_file_); + /* Default to displayed packets */ + print_args_.range.process_filtered = TRUE; + + packet_range_group_box_.initRange(&print_args_.range); + h_box->addWidget(&packet_range_group_box_); + + h_box->addWidget(&packet_format_group_box_, 0, Qt::AlignTop); + + if (save_bt_) { + connect(&packet_range_group_box_, SIGNAL(validityChanged(bool)), + this, SLOT(checkValidity())); + connect(&packet_format_group_box_, SIGNAL(formatChanged()), + this, SLOT(checkValidity())); + } + connect(this, SIGNAL(filterSelected(QString)), this, SLOT(exportTypeChanged(QString))); + + // Grow the dialog to account for the extra widgets. + resize(width(), height() + (packet_range_group_box_.height() * 2 / 3)); + + qDebug() << "FIX: ExportDissectionDialog help button"; + +#else // Q_WS_WIN +#endif // Q_WS_WIN +} + +ExportDissectionDialog::~ExportDissectionDialog() +{ +} + +int ExportDissectionDialog::exec() +{ +#if !defined(Q_WS_WIN) + int retval; + + if (!cap_file_) return QDialog::Rejected; + + retval = QFileDialog::exec(); + + if (retval == QDialog::Accepted && selectedFiles().length() > 0) { + print_args_t print_args; + cf_print_status_t status; + QString file_name = selectedFiles()[0]; + + /* Fill in our print (and export) args */ + + print_args_.file = file_name.toUtf8().data(); + print_args_.format = PR_FMT_TEXT; + print_args_.to_file = TRUE; + print_args_.cmd = NULL; + print_args_.print_summary = TRUE; + print_args_.print_dissections = print_dissections_as_displayed; + print_args_.print_hex = FALSE; + print_args_.print_formfeed = FALSE; + + + switch (export_type_) { + case export_type_text: /* Text */ + print_args_.print_summary = packet_format_group_box_.summaryEnabled(); + print_args_.print_dissections = print_dissections_none; + if (packet_format_group_box_.detailsEnabled()) { + if (packet_format_group_box_.allCollapsedEnabled()) + print_args_.print_dissections = print_dissections_collapsed; + else if (packet_format_group_box_.asDisplayedEnabled()) + print_args_.print_dissections = print_dissections_as_displayed; + else if (packet_format_group_box_.allExpandedEnabled()) + print_args_.print_dissections = print_dissections_expanded; + } + print_args_.print_hex = packet_format_group_box_.bytesEnabled(); + print_args_.stream = print_stream_text_new(TRUE, print_args_.file); + if (print_args_.stream == NULL) { + open_failure_alert_box(print_args_.file, errno, TRUE); + return QDialog::Rejected; + } + status = cf_print_packets(cap_file_, &print_args_); + break; + case export_type_csv: /* CSV */ + status = cf_write_csv_packets(cap_file_, &print_args_); + break; + case export_type_carrays: /* C Arrays */ + status = cf_write_carrays_packets(cap_file_, &print_args_); + break; + case export_type_psml: /* PSML */ + status = cf_write_psml_packets(cap_file_, &print_args_); + break; + case export_type_pdml: /* PDML */ + status = cf_write_pdml_packets(cap_file_, &print_args_); + break; + default: + return QDialog::Rejected; + } + + switch (status) { + case CF_PRINT_OK: + break; + case CF_PRINT_OPEN_ERROR: + open_failure_alert_box(print_args.file, errno, TRUE); + break; + case CF_PRINT_WRITE_ERROR: + write_failure_alert_box(print_args.file, errno); + break; + } + + if (selectedFiles().length() > 0) { + gchar *dirname; + /* Save the directory name for future file dialogs. */ + dirname = get_dirname(print_args_.file); /* Overwrites file_name data */ + set_last_open_dir(dirname); + } + } + + return retval; +#else // Q_WS_WIN + win32_export_file(parent->effectiveWinId(), export_type_); + return QDialog::Accepted; +#endif // Q_WS_WIN +} + +void ExportDissectionDialog::exportTypeChanged(QString name_filter) +{ + export_type_ = export_type_map_.value(name_filter); + if (export_type_ == export_type_text) { + packet_format_group_box_.setEnabled(true); + print_args_.format = PR_FMT_TEXT; + } else { + packet_format_group_box_.setEnabled(false); + } + + checkValidity(); +} + +void ExportDissectionDialog::checkValidity() +{ + bool enable = true; + + if (!save_bt_) return; + + if (!packet_range_group_box_.isValid()) enable = false; + + if (export_type_ == export_type_text) { + if ( ! packet_format_group_box_.summaryEnabled() && + ! packet_format_group_box_.detailsEnabled() && + ! packet_format_group_box_.bytesEnabled() ) { + enable = false; + } + } + + save_bt_->setEnabled(enable); +} + +//#if !defined(Q_WS_WIN) +//void ExportDissectionDialog::on_buttonBox_helpRequested() +//{ +// gchar *url = topic_action_url(HELP_EXPORT_FILE_DIALOG); + +// if(url != NULL) { +// QDesktopServices::openUrl(QUrl(url)); +// g_free(url); +// } +//} + +//#endif // Q_WS_WIN |