aboutsummaryrefslogtreecommitdiffstats
path: root/ui/qt/export_dissection_dialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ui/qt/export_dissection_dialog.cpp')
-rw-r--r--ui/qt/export_dissection_dialog.cpp249
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