diff options
Diffstat (limited to 'ui/qt/export_dissection_dialog.cpp')
-rw-r--r-- | ui/qt/export_dissection_dialog.cpp | 131 |
1 files changed, 56 insertions, 75 deletions
diff --git a/ui/qt/export_dissection_dialog.cpp b/ui/qt/export_dissection_dialog.cpp index 5b09efcd..3a51bfd4 100644 --- a/ui/qt/export_dissection_dialog.cpp +++ b/ui/qt/export_dissection_dialog.cpp @@ -9,12 +9,6 @@ #include "export_dissection_dialog.h" -#ifdef Q_OS_WIN -#include <windows.h> -#include "ui/packet_range.h" -#include "ui/win32/file_dlg_win32.h" -#else // Q_OS_WIN - #include "ui/alert_box.h" #include "ui/help_url.h" #include "ui/util.h" @@ -28,12 +22,9 @@ #include <QDialogButtonBox> #include <QGridLayout> #include <QPushButton> -#endif // Q_OS_WIN -#include <epan/prefs.h> #include "main_application.h" -#if !defined(Q_OS_WIN) static const QStringList export_extensions = QStringList() << "" << "txt" @@ -44,45 +35,16 @@ static const QStringList export_extensions = QStringList() << "c" << "json"; -#endif - ExportDissectionDialog::ExportDissectionDialog(QWidget *parent, capture_file *cap_file, export_type_e export_type, QString selRange): WiresharkFileDialog(parent), export_type_(export_type), cap_file_(cap_file) -#if !defined(Q_OS_WIN) , save_bt_(NULL) -#else - , sel_range_(selRange) -#endif /* Q_OS_WIN */ { setWindowTitle(mainApp->windowTitleString(tr("Export Packet Dissections"))); - switch (prefs.gui_fileopen_style) { - - case FO_STYLE_LAST_OPENED: - /* The user has specified that we should start out in the last directory - * we looked in. If we've already opened a file, use its containing - * directory, if we could determine it, as the directory, otherwise - * use the "last opened" directory saved in the preferences file if - * there was one. - */ - setDirectory(mainApp->openDialogInitialDir()); - break; - - case FO_STYLE_SPECIFIED: - /* The user has specified that we should always start out in a - * specified directory; if they've specified that directory, - * start out by showing the files in that dir. - */ - if (prefs.gui_fileopen_dir[0] != '\0') - setDirectory(prefs.gui_fileopen_dir); - break; - } + setDirectory(mainApp->openDialogInitialDir()); -#if !defined(Q_OS_WIN) - // Add extra widgets - // https://wiki.qt.io/Qt_project_org_faq#How_can_I_add_widgets_to_my_QFileDialog_instance.3F setOption(QFileDialog::DontUseNativeDialog, true); QDialogButtonBox *button_box = findChild<QDialogButtonBox *>(); QGridLayout *fd_grid = qobject_cast<QGridLayout*>(layout()); @@ -119,7 +81,7 @@ ExportDissectionDialog::ExportDissectionDialog(QWidget *parent, capture_file *ca /* Init the export range */ packet_range_init(&print_args_.range, cap_file_); /* Default to displayed packets */ - print_args_.range.process_filtered = TRUE; + print_args_.range.process_filtered = true; packet_range_group_box_.initRange(&print_args_.range, selRange); h_box->addWidget(&packet_range_group_box_); @@ -128,47 +90,39 @@ ExportDissectionDialog::ExportDissectionDialog(QWidget *parent, capture_file *ca if (button_box) { button_box->addButton(QDialogButtonBox::Help); - connect(button_box, SIGNAL(helpRequested()), this, SLOT(on_buttonBox_helpRequested())); + connect(button_box, &QDialogButtonBox::helpRequested, this, &ExportDissectionDialog::on_buttonBox_helpRequested); save_bt_ = button_box->button(QDialogButtonBox::Save); } 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(&packet_range_group_box_, &PacketRangeGroupBox::validityChanged, + this, &ExportDissectionDialog::checkValidity); + connect(&packet_format_group_box_, &PacketFormatGroupBox::formatChanged, + this, &ExportDissectionDialog::checkValidity); + save_bt_->installEventFilter(this); } - connect(this, SIGNAL(filterSelected(QString)), this, SLOT(exportTypeChanged(QString))); + connect(this, &ExportDissectionDialog::filterSelected, this, &ExportDissectionDialog::exportTypeChanged); // Grow the dialog to account for the extra widgets. resize(width(), height() + (packet_range_group_box_.height() * 2 / 3)); - connect(this, SIGNAL(filesSelected(QStringList)), this, SLOT(dialogAccepted(QStringList))); -#else // Q_OS_WIN -#endif // Q_OS_WIN + connect(this, &ExportDissectionDialog::filesSelected, this, &ExportDissectionDialog::dialogAccepted); } ExportDissectionDialog::~ExportDissectionDialog() { -#if !defined(Q_OS_WIN) g_free(print_args_.file); packet_range_cleanup(&print_args_.range); -#endif } void ExportDissectionDialog::show() { -#if !defined(Q_OS_WIN) if (cap_file_) { WiresharkFileDialog::show(); } -#else // Q_OS_WIN - win32_export_file((HWND)parentWidget()->effectiveWinId(), windowTitle().toStdWString().c_str(), cap_file_, export_type_, sel_range_.toStdString().c_str()); -#endif // Q_OS_WIN } -#ifndef Q_OS_WIN void ExportDissectionDialog::dialogAccepted(const QStringList &selected) { if (selected.length() > 0) { @@ -179,19 +133,19 @@ void ExportDissectionDialog::dialogAccepted(const QStringList &selected) */ hide(); cf_print_status_t status; - QString file_name = selected[0]; + QString file_name = QDir::toNativeSeparators(selected[0]); /* Fill in our print (and export) args */ print_args_.file = qstring_strdup(file_name); print_args_.format = PR_FMT_TEXT; - print_args_.to_file = TRUE; + print_args_.to_file = true; print_args_.cmd = NULL; - print_args_.print_summary = TRUE; - print_args_.print_col_headings = TRUE; + print_args_.print_summary = true; + print_args_.print_col_headings = true; print_args_.print_dissections = print_dissections_as_displayed; - print_args_.print_hex = FALSE; - print_args_.print_formfeed = FALSE; + print_args_.print_hex = false; + print_args_.print_formfeed = false; switch (export_type_) { case export_type_text: /* Text */ @@ -208,12 +162,12 @@ void ExportDissectionDialog::dialogAccepted(const QStringList &selected) } print_args_.print_hex = packet_format_group_box_.bytesEnabled(); print_args_.hexdump_options = packet_format_group_box_.getHexdumpOptions(); - print_args_.stream = print_stream_text_new(TRUE, print_args_.file); + 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); + open_failure_alert_box(print_args_.file, errno, true); return; } - status = cf_print_packets(cap_file_, &print_args_, TRUE); + status = cf_print_packets(cap_file_, &print_args_, true); break; case export_type_csv: /* CSV */ status = cf_write_csv_packets(cap_file_, &print_args_); @@ -238,14 +192,14 @@ void ExportDissectionDialog::dialogAccepted(const QStringList &selected) case CF_PRINT_OK: break; case CF_PRINT_OPEN_ERROR: - open_failure_alert_box(print_args_.file, errno, TRUE); + open_failure_alert_box(print_args_.file, errno, true); break; case CF_PRINT_WRITE_ERROR: write_failure_alert_box(print_args_.file, errno); break; } - gchar *dirname; + char *dirname; /* Save the directory name for future file dialogs. */ dirname = get_dirname(print_args_.file); /* Overwrites file_name data */ set_last_open_dir(dirname); @@ -266,28 +220,55 @@ void ExportDissectionDialog::exportTypeChanged(QString name_filter) setDefaultSuffix(export_extensions[export_type_]); } -void ExportDissectionDialog::checkValidity() +bool ExportDissectionDialog::isValid() { - bool enable = true; - - if (!save_bt_) return; + bool valid = true; - if (!packet_range_group_box_.isValid()) enable = false; + if (!packet_range_group_box_.isValid()) valid = 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; + valid = false; } } - save_bt_->setEnabled(enable); + return valid; +} + +void ExportDissectionDialog::checkValidity() +{ + if (!save_bt_) return; + + save_bt_->setEnabled(isValid()); } void ExportDissectionDialog::on_buttonBox_helpRequested() { mainApp->helpTopicAction(HELP_EXPORT_FILE_DIALOG); } -#endif // Q_OS_WIN + +bool ExportDissectionDialog::eventFilter(QObject *obj, QEvent *event) +{ + // The QFileDialogPrivate will enable the Ok (Open/Save) button when + // anything is typed or selected. We can't catch that beforehand, so + // watch for the enable status change and re-disable it if the + // group boxes are invalid. + // We could do extra work (here and elsewhere) not to disable the button + // if what's selected in the dialog is a directory, but even with save_bt_ + // disabled clicking on the directory still opens it. + if (event->type() == QEvent::EnabledChange) { + QPushButton *button = qobject_cast<QPushButton *>(obj); + if (button && button == save_bt_) { + // The button is already changed by the time we get this event. + if (button->isEnabled() && !isValid()) { + button->setEnabled(false); + return true; + } + } + } + + return QObject::eventFilter(obj, event); +} |