From 428f2228533351baf6509b8fc50a075cdbc136b0 Mon Sep 17 00:00:00 2001 From: "j.novak@netsystem.cz" Date: Thu, 6 Jan 2022 07:02:11 +0000 Subject: Extcap: Extcaps must be fully configured before start of capture --- ui/qt/capture_options_dialog.cpp | 6 +++--- ui/qt/capture_options_dialog.h | 2 +- ui/qt/extcap_options_dialog.cpp | 12 +++++++---- ui/qt/extcap_options_dialog.h | 4 ++-- ui/qt/interface_frame.cpp | 4 ++-- ui/qt/interface_frame.h | 2 +- ui/qt/main_window.cpp | 6 ++++-- ui/qt/main_window.h | 6 +++++- ui/qt/main_window_slots.cpp | 43 +++++++++++++++++++++++++++++++++------- ui/qt/welcome_page.cpp | 4 ++-- ui/qt/welcome_page.h | 4 ++-- 11 files changed, 66 insertions(+), 27 deletions(-) (limited to 'ui') diff --git a/ui/qt/capture_options_dialog.cpp b/ui/qt/capture_options_dialog.cpp index 857ae2b16f..e4311ddbda 100644 --- a/ui/qt/capture_options_dialog.cpp +++ b/ui/qt/capture_options_dialog.cpp @@ -499,7 +499,7 @@ void CaptureOptionsDialog::itemClicked(QTreeWidgetItem *item, int column) QString device_name = ti->data(col_extcap_, Qt::UserRole).value(); if (extcap_has_configuration((const char *)(device_name.toStdString().c_str()), FALSE)) { - emit showExtcapOptions(device_name); + emit showExtcapOptions(device_name, false); return; } } @@ -527,7 +527,7 @@ void CaptureOptionsDialog::itemDoubleClicked(QTreeWidgetItem *item) QString device_name = ti->data(col_extcap_, Qt::UserRole).value(); if (extcap_has_configuration((const char *)(device_name.toStdString().c_str()), TRUE)) { - emit showExtcapOptions(device_name); + emit showExtcapOptions(device_name, true); return; } } @@ -598,7 +598,7 @@ void CaptureOptionsDialog::on_buttonBox_accepted() QString device_name = ti->data(col_extcap_, Qt::UserRole).value(); if (extcap_has_configuration((const char *)(device_name.toStdString().c_str()), TRUE)) { - emit showExtcapOptions(device_name); + emit showExtcapOptions(device_name, true); return; } } diff --git a/ui/qt/capture_options_dialog.h b/ui/qt/capture_options_dialog.h index 060e526be5..289db06ebb 100644 --- a/ui/qt/capture_options_dialog.h +++ b/ui/qt/capture_options_dialog.h @@ -103,7 +103,7 @@ signals: void ifsChanged(); void interfaceListChanged(); void captureFilterTextEdited(const QString & text); - void showExtcapOptions(QString &device_name); + void showExtcapOptions(QString &device_name, bool startCaptureOnClose); private: Ui::CaptureOptionsDialog *ui; diff --git a/ui/qt/extcap_options_dialog.cpp b/ui/qt/extcap_options_dialog.cpp index 550e478e62..1a963d6ed4 100644 --- a/ui/qt/extcap_options_dialog.cpp +++ b/ui/qt/extcap_options_dialog.cpp @@ -54,7 +54,7 @@ #include #include -ExtcapOptionsDialog::ExtcapOptionsDialog(QWidget *parent) : +ExtcapOptionsDialog::ExtcapOptionsDialog(bool startCaptureOnClose, QWidget *parent) : QDialog(parent), ui(new Ui::ExtcapOptionsDialog), device_name(""), @@ -67,10 +67,14 @@ ExtcapOptionsDialog::ExtcapOptionsDialog(QWidget *parent) : ui->checkSaveOnStart->setCheckState(prefs.extcap_save_on_start ? Qt::Checked : Qt::Unchecked); - ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Start")); + if (startCaptureOnClose) { + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Start")); + } else { + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Save")); + } } -ExtcapOptionsDialog * ExtcapOptionsDialog::createForDevice(QString &dev_name, QWidget *parent) +ExtcapOptionsDialog * ExtcapOptionsDialog::createForDevice(QString &dev_name, bool startCaptureOnClose, QWidget *parent) { interface_t *device; ExtcapOptionsDialog * resultDialog = NULL; @@ -93,7 +97,7 @@ ExtcapOptionsDialog * ExtcapOptionsDialog::createForDevice(QString &dev_name, QW if (! dev_found) return NULL; - resultDialog = new ExtcapOptionsDialog(parent); + resultDialog = new ExtcapOptionsDialog(startCaptureOnClose, parent); resultDialog->device_name = QString(dev_name); resultDialog->device_idx = if_idx; diff --git a/ui/qt/extcap_options_dialog.h b/ui/qt/extcap_options_dialog.h index 3799d0bce3..230e2d32ae 100644 --- a/ui/qt/extcap_options_dialog.h +++ b/ui/qt/extcap_options_dialog.h @@ -35,7 +35,7 @@ class ExtcapOptionsDialog : public QDialog public: ~ExtcapOptionsDialog(); - static ExtcapOptionsDialog * createForDevice(QString &device_name, QWidget *parent = 0); + static ExtcapOptionsDialog * createForDevice(QString &device_name, bool startCaptureOnClose, QWidget *parent = 0); ExtcapValueList loadValuesFor(int argNum, QString call, QString parent = ""); @@ -48,7 +48,7 @@ private Q_SLOTS: void anyValueChanged(); private: - explicit ExtcapOptionsDialog(QWidget *parent = 0); + explicit ExtcapOptionsDialog(bool startCaptureOnClose, QWidget *parent = 0); Ui::ExtcapOptionsDialog *ui; QString device_name; diff --git a/ui/qt/interface_frame.cpp b/ui/qt/interface_frame.cpp index 7b3e4317f7..60193c8a7b 100644 --- a/ui/qt/interface_frame.cpp +++ b/ui/qt/interface_frame.cpp @@ -423,7 +423,7 @@ void InterfaceFrame::on_interfaceTree_doubleClicked(const QModelIndex &index) /* this checks if configuration is required and not yet provided or saved via prefs */ if (extcap_has_configuration((const char *)(device_name.toStdString().c_str()), TRUE)) { - emit showExtcapOptions(device_name); + emit showExtcapOptions(device_name, true); return; } } @@ -451,7 +451,7 @@ void InterfaceFrame::on_interfaceTree_clicked(const QModelIndex &index) /* this checks if configuration is required and not yet provided or saved via prefs */ if (extcap_has_configuration((const char *)(device_name.toStdString().c_str()), FALSE)) { - emit showExtcapOptions(device_name); + emit showExtcapOptions(device_name, false); return; } } diff --git a/ui/qt/interface_frame.h b/ui/qt/interface_frame.h index 62ed0f6a95..031a65e308 100644 --- a/ui/qt/interface_frame.h +++ b/ui/qt/interface_frame.h @@ -46,7 +46,7 @@ public: void ensureSelectedInterface(); Q_SIGNALS: - void showExtcapOptions(QString device_name); + void showExtcapOptions(QString device_name, bool startCaptureOnClose); void startCapture(); void itemSelectionChanged(); void typeSelectionChanged(); diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp index e77891f7e6..d98c3bdd56 100644 --- a/ui/qt/main_window.cpp +++ b/ui/qt/main_window.cpp @@ -679,8 +679,10 @@ MainWindow::MainWindow(QWidget *parent) : connect(main_ui_->welcomePage, SIGNAL(captureFilterSyntaxChanged(bool)), this, SLOT(captureFilterSyntaxChanged(bool))); - connect(this->welcome_page_, SIGNAL(showExtcapOptions(QString&)), - this, SLOT(showExtcapOptionsDialog(QString&))); + connect(this, SIGNAL(showExtcapOptions(QString&, bool)), + this, SLOT(showExtcapOptionsDialog(QString&, bool))); + connect(this->welcome_page_, SIGNAL(showExtcapOptions(QString&, bool)), + this, SLOT(showExtcapOptionsDialog(QString&, bool))); #endif // HAVE_LIBPCAP diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h index 75372ee63f..8f7ad2660b 100644 --- a/ui/qt/main_window.h +++ b/ui/qt/main_window.h @@ -312,6 +312,10 @@ signals: void selectRtpStream(rtpstream_id_t *id); void deselectRtpStream(rtpstream_id_t *id); +#ifdef HAVE_LIBPCAP + void showExtcapOptions(QString &device_name, bool startCaptureOnClose); +#endif + public slots: // in main_window_slots.cpp /** @@ -727,7 +731,7 @@ private slots: void on_actionContextFilterFieldReference_triggered(); void extcap_options_finished(int result); - void showExtcapOptionsDialog(QString & device_name); + void showExtcapOptionsDialog(QString & device_name, bool startCaptureOnClose); QString findRtpStreams(QVector *stream_ids, bool reverse); diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp index f2a48dd274..aedb0b1261 100644 --- a/ui/qt/main_window_slots.cpp +++ b/ui/qt/main_window_slots.cpp @@ -834,6 +834,8 @@ void MainWindow::startCapture() { #ifdef HAVE_LIBPCAP interface_options *interface_opts; guint i; + interface_t *device; + gboolean can_start_capture = TRUE; /* did the user ever select a capture interface before? */ if (global_capture_opts.num_selected == 0) { @@ -843,6 +845,31 @@ void MainWindow::startCapture() { return; } + for (i = 0; i < global_capture_opts.all_ifaces->len; i++) { + device = &g_array_index(global_capture_opts.all_ifaces, interface_t, i); + if (device->selected && (device->if_info.type == IF_EXTCAP)) { + /* device is EXTCAP and is selected. Check if all mandatory + * settings are set. + */ + if (extcap_has_configuration(device->name, TRUE)) + { + /* Request openning of extcap options dialog */ + QString device_name(device->name); + emit showExtcapOptions(device_name, false); + /* Cancel start of capture */ + can_start_capture = FALSE; + } + } + } + + /* If some of extcap was not configured, do not start with the capture */ + if (!can_start_capture) { + QString msg = QString(tr("Configure all extcaps before start of capture.")); + wsApp->pushStatus(WiresharkApplication::TemporaryStatus, msg); + main_ui_->actionCaptureStart->setChecked(false); + return; + } + // Ideally we should have disabled the start capture // toolbar buttons and menu items. This may not be the // case, e.g. with QtMacExtras. @@ -4000,8 +4027,8 @@ void MainWindow::on_actionCaptureOptions_triggered() connect(capture_options_dialog_, SIGNAL(setFilterValid(bool, const QString)), this, SLOT(startInterfaceCapture(bool, const QString))); - connect(capture_options_dialog_, SIGNAL(showExtcapOptions(QString&)), - this, SLOT(showExtcapOptionsDialog(QString&))); + connect(capture_options_dialog_, SIGNAL(showExtcapOptions(QString&, bool)), + this, SLOT(showExtcapOptionsDialog(QString&, bool))); } capture_options_dialog_->setTab(0); capture_options_dialog_->updateInterfaces(); @@ -4066,17 +4093,19 @@ void MainWindow::extcap_options_finished(int result) this->welcome_page_->getInterfaceFrame()->interfaceListChanged(); } -void MainWindow::showExtcapOptionsDialog(QString &device_name) +void MainWindow::showExtcapOptionsDialog(QString &device_name, bool startCaptureOnClose) { - ExtcapOptionsDialog * extcap_options_dialog = ExtcapOptionsDialog::createForDevice(device_name, this); + ExtcapOptionsDialog * extcap_options_dialog = ExtcapOptionsDialog::createForDevice(device_name, startCaptureOnClose, this); /* The dialog returns null, if the given device name is not a valid extcap device */ if (extcap_options_dialog) { extcap_options_dialog->setModal(true); extcap_options_dialog->setAttribute(Qt::WA_DeleteOnClose); - connect(extcap_options_dialog, SIGNAL(finished(int)), - this, SLOT(extcap_options_finished(int))); + if (startCaptureOnClose) { + connect(extcap_options_dialog, SIGNAL(finished(int)), + this, SLOT(extcap_options_finished(int))); + } #ifdef HAVE_LIBPCAP - if (capture_options_dialog_) { + if (capture_options_dialog_ && startCaptureOnClose) { /* Allow capture options dialog to close */ connect(extcap_options_dialog, SIGNAL(accepted()), capture_options_dialog_, SLOT(accept())); diff --git a/ui/qt/welcome_page.cpp b/ui/qt/welcome_page.cpp index 8097c25455..e8b8edee50 100644 --- a/ui/qt/welcome_page.cpp +++ b/ui/qt/welcome_page.cpp @@ -243,9 +243,9 @@ bool WelcomePage::event(QEvent *event) return QFrame::event(event); } -void WelcomePage::on_interfaceFrame_showExtcapOptions(QString device_name) +void WelcomePage::on_interfaceFrame_showExtcapOptions(QString device_name, bool startCaptureOnClose) { - emit showExtcapOptions(device_name); + emit showExtcapOptions(device_name, startCaptureOnClose); } void WelcomePage::on_interfaceFrame_startCapture() diff --git a/ui/qt/welcome_page.h b/ui/qt/welcome_page.h index 433dcc3671..e11a87146f 100644 --- a/ui/qt/welcome_page.h +++ b/ui/qt/welcome_page.h @@ -62,7 +62,7 @@ signals: void startCapture(); void recentFileActivated(QString cfile); void captureFilterSyntaxChanged(bool valid); - void showExtcapOptions(QString &device_name); + void showExtcapOptions(QString &device_name, bool startCaptureOnClose); void interfacesChanged(); public slots: @@ -80,7 +80,7 @@ private slots: void copyRecentPath(); void removeRecentPath(); - void on_interfaceFrame_showExtcapOptions(QString device_name); + void on_interfaceFrame_showExtcapOptions(QString device_name, bool startCaptureOnClose); void on_interfaceFrame_startCapture(); }; -- cgit v1.2.3