diff options
Diffstat (limited to 'ui/qt')
-rw-r--r-- | ui/qt/bluetooth_att_server_attributes_dialog.cpp | 32 | ||||
-rw-r--r-- | ui/qt/bluetooth_devices_dialog.cpp | 32 | ||||
-rw-r--r-- | ui/qt/capture_file.cpp | 9 | ||||
-rw-r--r-- | ui/qt/capture_file.h | 2 | ||||
-rw-r--r-- | ui/qt/conversation_dialog.cpp | 16 | ||||
-rw-r--r-- | ui/qt/endpoint_dialog.cpp | 15 | ||||
-rw-r--r-- | ui/qt/expert_info_dialog.cpp | 26 | ||||
-rw-r--r-- | ui/qt/export_object_dialog.cpp | 25 | ||||
-rw-r--r-- | ui/qt/follow_stream_dialog.cpp | 27 | ||||
-rw-r--r-- | ui/qt/response_time_delay_dialog.cpp | 15 | ||||
-rw-r--r-- | ui/qt/rtp_analysis_dialog.cpp | 5 | ||||
-rw-r--r-- | ui/qt/service_response_time_dialog.cpp | 24 | ||||
-rw-r--r-- | ui/qt/simple_statistics_dialog.cpp | 21 | ||||
-rw-r--r-- | ui/qt/stats_tree_dialog.cpp | 23 | ||||
-rw-r--r-- | ui/qt/tap_parameter_dialog.cpp | 13 | ||||
-rw-r--r-- | ui/qt/tap_parameter_dialog.h | 1 | ||||
-rw-r--r-- | ui/qt/wireshark_dialog.cpp | 85 | ||||
-rw-r--r-- | ui/qt/wireshark_dialog.h | 77 | ||||
-rw-r--r-- | ui/qt/wlan_statistics_dialog.cpp | 21 |
19 files changed, 251 insertions, 218 deletions
diff --git a/ui/qt/bluetooth_att_server_attributes_dialog.cpp b/ui/qt/bluetooth_att_server_attributes_dialog.cpp index 1c89e97a29..4ce9b8cc49 100644 --- a/ui/qt/bluetooth_att_server_attributes_dialog.cpp +++ b/ui/qt/bluetooth_att_server_attributes_dialog.cpp @@ -98,27 +98,6 @@ btatt_handle_tap_reset(void *tapinfo_ptr) tapinfo->tap_reset(tapinfo); } - -static void -bluetooth_att_server_attributes_tap(void *data) -{ - GString *error_string; - - error_string = register_tap_listener("btatt.handles", data, NULL, - 0, - btatt_handle_tap_reset, - btatt_handle_tap_packet, - NULL - ); - - if (error_string != NULL) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, - "%s", error_string->str); - g_string_free(error_string, TRUE); - } -} - - BluetoothAttServerAttributesDialog::BluetoothAttServerAttributesDialog(QWidget &parent, CaptureFile &cf) : WiresharkDialog(parent, cf), ui(new Ui::BluetoothAttServerAttributesDialog) @@ -142,7 +121,12 @@ BluetoothAttServerAttributesDialog::BluetoothAttServerAttributesDialog(QWidget & tapinfo_.tap_reset = tapReset; tapinfo_.ui = this; - bluetooth_att_server_attributes_tap(&tapinfo_); + registerTapListener("btatt.handles", &tapinfo_, NULL, + 0, + btatt_handle_tap_reset, + btatt_handle_tap_packet, + NULL + ); cap_file_.retapPackets(); } @@ -151,15 +135,11 @@ BluetoothAttServerAttributesDialog::BluetoothAttServerAttributesDialog(QWidget & BluetoothAttServerAttributesDialog::~BluetoothAttServerAttributesDialog() { delete ui; - - remove_tap_listener(&tapinfo_); } void BluetoothAttServerAttributesDialog::captureFileClosing() { - remove_tap_listener(&tapinfo_); - ui->interfaceComboBox->setEnabled(FALSE); ui->deviceComboBox->setEnabled(FALSE); ui->removeDuplicatesCheckBox->setEnabled(FALSE); diff --git a/ui/qt/bluetooth_devices_dialog.cpp b/ui/qt/bluetooth_devices_dialog.cpp index 38ade7e889..cb8271802f 100644 --- a/ui/qt/bluetooth_devices_dialog.cpp +++ b/ui/qt/bluetooth_devices_dialog.cpp @@ -75,27 +75,6 @@ bluetooth_device_tap_reset(void *tapinfo_ptr) tapinfo->tap_reset(tapinfo); } - -static void -bluetooth_devices_tap(void *data) -{ - GString *error_string; - - error_string = register_tap_listener("bluetooth.device", data, NULL, - 0, - bluetooth_device_tap_reset, - bluetooth_device_tap_packet, - NULL - ); - - if (error_string != NULL) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, - "%s", error_string->str); - g_string_free(error_string, TRUE); - } -} - - BluetoothDevicesDialog::BluetoothDevicesDialog(QWidget &parent, CaptureFile &cf) : WiresharkDialog(parent, cf), ui(new Ui::BluetoothDevicesDialog) @@ -118,7 +97,12 @@ BluetoothDevicesDialog::BluetoothDevicesDialog(QWidget &parent, CaptureFile &cf) tapinfo_.tap_reset = tapReset; tapinfo_.ui = this; - bluetooth_devices_tap(&tapinfo_); + registerTapListener("bluetooth.device", &tapinfo_, NULL, + 0, + bluetooth_device_tap_reset, + bluetooth_device_tap_packet, + NULL + ); cap_file_.retapPackets(); } @@ -127,15 +111,11 @@ BluetoothDevicesDialog::BluetoothDevicesDialog(QWidget &parent, CaptureFile &cf) BluetoothDevicesDialog::~BluetoothDevicesDialog() { delete ui; - - remove_tap_listener(&tapinfo_); } void BluetoothDevicesDialog::captureFileClosing() { - remove_tap_listener(&tapinfo_); - ui->interfaceComboBox->setEnabled(FALSE); ui->showInformationStepsCheckBox->setEnabled(FALSE); diff --git a/ui/qt/capture_file.cpp b/ui/qt/capture_file.cpp index 340d3e1e46..4ce0fc03ea 100644 --- a/ui/qt/capture_file.cpp +++ b/ui/qt/capture_file.cpp @@ -186,7 +186,6 @@ void CaptureFile::captureFileEvent(int event, gpointer data) g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Reload finished"); emit captureFileReloadFinished(); break; - case(cf_cb_file_rescan_started): g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Rescan started"); emit captureFileRescanStarted(); @@ -195,6 +194,14 @@ void CaptureFile::captureFileEvent(int event, gpointer data) g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Rescan finished"); emit captureFileRescanFinished(); break; + case(cf_cb_file_retap_started): + g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Retap started"); + emit captureFileRetapStarted(); + break; + case(cf_cb_file_retap_finished): + g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Retap finished"); + emit captureFileRetapFinished(); + break; case(cf_cb_file_fast_save_finished): // Ignored for now diff --git a/ui/qt/capture_file.h b/ui/qt/capture_file.h index 430933e76f..d31a9868f8 100644 --- a/ui/qt/capture_file.h +++ b/ui/qt/capture_file.h @@ -85,6 +85,8 @@ signals: void captureFileReloadFinished() const; void captureFileRescanStarted() const; void captureFileRescanFinished() const; + void captureFileRetapStarted() const; + void captureFileRetapFinished() const; void captureFileClosing() const; void captureFileClosed() const; void captureFileSaveStarted(const QString &file_path) const; diff --git a/ui/qt/conversation_dialog.cpp b/ui/qt/conversation_dialog.cpp index 89576c144a..8f034e641a 100644 --- a/ui/qt/conversation_dialog.cpp +++ b/ui/qt/conversation_dialog.cpp @@ -34,7 +34,6 @@ #include <QCheckBox> #include <QDialogButtonBox> -#include <QMessageBox> #include <QPushButton> // To do: @@ -127,7 +126,6 @@ void ConversationDialog::captureFileClosing() // on a live capture file. for (int i = 0; i < trafficTableTabWidget()->count(); i++) { ConversationTreeWidget *cur_tree = qobject_cast<ConversationTreeWidget *>(trafficTableTabWidget()->widget(i)); - remove_tap_listener(cur_tree->trafficTreeHash()); disconnect(cur_tree, SIGNAL(filterAction(QString&,FilterAction::Action,FilterAction::ActionType)), this, SIGNAL(filterAction(QString&,FilterAction::Action,FilterAction::ActionType))); } @@ -174,16 +172,10 @@ bool ConversationDialog::addTrafficTable(register_ct_t* table) conv_tree->trafficTreeHash()->user_data = conv_tree; - GString *error_string = register_tap_listener(proto_get_protocol_filter_name(proto_id), conv_tree->trafficTreeHash(), filter, 0, - ConversationTreeWidget::tapReset, - get_conversation_packet_func(table), - ConversationTreeWidget::tapDraw); - - if (error_string) { - QMessageBox::warning(this, tr("Conversation %1 failed to register tap listener").arg(table_name), - error_string->str); - g_string_free(error_string, TRUE); - } + registerTapListener(proto_get_protocol_filter_name(proto_id), conv_tree->trafficTreeHash(), filter, 0, + ConversationTreeWidget::tapReset, + get_conversation_packet_func(table), + ConversationTreeWidget::tapDraw); return true; } diff --git a/ui/qt/endpoint_dialog.cpp b/ui/qt/endpoint_dialog.cpp index ec477579a3..d9617d5dd7 100644 --- a/ui/qt/endpoint_dialog.cpp +++ b/ui/qt/endpoint_dialog.cpp @@ -114,7 +114,6 @@ void EndpointDialog::captureFileClosing() // on a live capture file. for (int i = 0; i < trafficTableTabWidget()->count(); i++) { EndpointTreeWidget *cur_tree = qobject_cast<EndpointTreeWidget *>(trafficTableTabWidget()->widget(i)); - remove_tap_listener(cur_tree->trafficTreeHash()); disconnect(cur_tree, SIGNAL(filterAction(QString&,FilterAction::Action,FilterAction::ActionType)), this, SIGNAL(filterAction(QString&,FilterAction::Action,FilterAction::ActionType))); } @@ -159,16 +158,10 @@ bool EndpointDialog::addTrafficTable(register_ct_t *table) endp_tree->trafficTreeHash()->user_data = endp_tree; - GString *error_string = register_tap_listener(proto_get_protocol_filter_name(proto_id), endp_tree->trafficTreeHash(), filter, 0, - EndpointTreeWidget::tapReset, - get_hostlist_packet_func(table), - EndpointTreeWidget::tapDraw); - - if (error_string) { - QMessageBox::warning(this, tr("Endpoint %1 failed to register tap listener").arg(table_name), - error_string->str); - g_string_free(error_string, TRUE); - } + registerTapListener(proto_get_protocol_filter_name(proto_id), endp_tree->trafficTreeHash(), filter, 0, + EndpointTreeWidget::tapReset, + get_hostlist_packet_func(table), + EndpointTreeWidget::tapDraw); #ifdef HAVE_GEOIP connect(endp_tree, SIGNAL(geoIPStatusChanged()), this, SLOT(tabChanged())); diff --git a/ui/qt/expert_info_dialog.cpp b/ui/qt/expert_info_dialog.cpp index 25012f54b1..141e388c91 100644 --- a/ui/qt/expert_info_dialog.cpp +++ b/ui/qt/expert_info_dialog.cpp @@ -207,7 +207,6 @@ ExpertInfoDialog::ExpertInfoDialog(QWidget &parent, CaptureFile &capture_file) : ExpertInfoDialog::~ExpertInfoDialog() { - remove_tap_listener(this); delete ui; } @@ -236,24 +235,20 @@ void ExpertInfoDialog::retapPackets() if (file_closed_) return; clearAllData(); - remove_tap_listener(this); - - GString *error_string = register_tap_listener("expert", - this, - NULL, - TL_REQUIRES_NOTHING, - tapReset, - tapPacket, - tapDraw); - if (error_string) { - QMessageBox::warning(this, tr("Endpoint expert failed to register tap listener"), - error_string->str); - g_string_free(error_string, TRUE); + removeTapListeners(); + + if (!registerTapListener("expert", + this, + NULL, + TL_REQUIRES_NOTHING, + tapReset, + tapPacket, + tapDraw)) { return; } if (ui->limitCheckBox->isChecked()) { - error_string = set_tap_dfilter(this, display_filter_.toUtf8().constData()); + GString *error_string = set_tap_dfilter(this, display_filter_.toUtf8().constData()); if (error_string) { QMessageBox::warning(this, tr("Endpoint expert failed to set filter"), error_string->str); @@ -517,7 +512,6 @@ void ExpertInfoDialog::filterActionTriggered() void ExpertInfoDialog::captureFileClosing() { - remove_tap_listener(this); WiresharkDialog::captureFileClosing(); } diff --git a/ui/qt/export_object_dialog.cpp b/ui/qt/export_object_dialog.cpp index 4812486669..2da7bd5a03 100644 --- a/ui/qt/export_object_dialog.cpp +++ b/ui/qt/export_object_dialog.cpp @@ -31,9 +31,9 @@ #include "wireshark_application.h" #include <QDialogButtonBox> -#include <QPushButton> -#include <QMessageBox> #include <QFileDialog> +#include <QMessageBox> +#include <QPushButton> extern "C" { @@ -127,7 +127,7 @@ ExportObjectDialog::~ExportObjectDialog() { delete eo_ui_; export_object_list_.eod = NULL; - remove_tap_listener((void *)&export_object_list_); + removeTapListeners(); } void ExportObjectDialog::addObjectEntry(export_object_entry_t *entry) @@ -172,22 +172,11 @@ void ExportObjectDialog::resetObjects() void ExportObjectDialog::show() { - GString *error_msg; - /* Data will be gathered via a tap callback */ - error_msg = register_tap_listener(tap_name_, (void *)&export_object_list_, NULL, 0, - eo_reset, - tap_packet_, - NULL); - - if (error_msg) { - QMessageBox::warning( - this, - tr("Tap registration error"), - QString(tr("Unable to register ")) + name_ + QString(tr(" tap: ")) + error_msg->str, - QMessageBox::Ok - ); - g_string_free(error_msg, TRUE); + if (!registerTapListener(tap_name_, &export_object_list_, NULL, 0, + eo_reset, + tap_packet_, + NULL)) { return; } diff --git a/ui/qt/follow_stream_dialog.cpp b/ui/qt/follow_stream_dialog.cpp index 39655f2203..7fa3947a17 100644 --- a/ui/qt/follow_stream_dialog.cpp +++ b/ui/qt/follow_stream_dialog.cpp @@ -841,9 +841,9 @@ bool FollowStreamDialog::follow(QString previous_filter, bool use_stream_index) follow_stats_t stats; tcp_stream_chunk sc; size_t nchars; - GString * msg; gboolean is_tcp = FALSE, is_udp = FALSE; + beginRetapPackets(); resetStream(); if (file_closed_) @@ -968,13 +968,9 @@ bool FollowStreamDialog::follow(QString previous_filter, bool use_stream_index) case FOLLOW_UDP: { /* data will be passed via tap callback*/ - msg = register_tap_listener("udp_follow", &follow_info_, - follow_filter.toUtf8().constData(), - 0, NULL, udp_queue_packet_data, NULL); - if (msg) { - QMessageBox::critical(this, "Error", - "Can't register udp_follow tap: %1", - msg->str); + if (!registerTapListener("udp_follow", &follow_info_, + follow_filter.toUtf8().constData(), + 0, NULL, udp_queue_packet_data, NULL)) { return false; } @@ -990,13 +986,9 @@ bool FollowStreamDialog::follow(QString previous_filter, bool use_stream_index) } case FOLLOW_SSL: /* we got ssl so we can follow */ - msg = register_tap_listener("ssl", &follow_info_, - follow_filter.toUtf8().constData(), 0, - NULL, ssl_queue_packet_data, NULL); - if (msg) - { - QMessageBox::critical(this, "Error", - "Can't register ssl tap: %1", msg->str); + if (!registerTapListener("ssl", &follow_info_, + follow_filter.toUtf8().constData(), 0, + NULL, ssl_queue_packet_data, NULL)) { return false; } break; @@ -1012,10 +1004,8 @@ bool FollowStreamDialog::follow(QString previous_filter, bool use_stream_index) break; case FOLLOW_UDP: - remove_tap_listener(&follow_info_); - break; case FOLLOW_SSL: - remove_tap_listener(&follow_info_); + removeTapListeners(); break; } @@ -1235,6 +1225,7 @@ bool FollowStreamDialog::follow(QString previous_filter, bool use_stream_index) data_out_file = NULL; } + endRetapPackets(); return true; } diff --git a/ui/qt/response_time_delay_dialog.cpp b/ui/qt/response_time_delay_dialog.cpp index 193dbbaa80..cbbf8bf072 100644 --- a/ui/qt/response_time_delay_dialog.cpp +++ b/ui/qt/response_time_delay_dialog.cpp @@ -26,7 +26,6 @@ #include "epan/proto.h" #include "epan/rtd_table.h" -#include <QMessageBox> #include <QTreeWidget> #include "qt_ui_utils.h" @@ -243,18 +242,14 @@ void ResponseTimeDelayDialog::fillTree() rtd_table_dissector_init(rtd_, &rtd_data.stat_table, NULL, NULL); rtd_data.user_data = this; - QString display_filter = displayFilter(); - GString *error_string = register_tap_listener(get_rtd_tap_listener_name(rtd_), + QByteArray display_filter = displayFilter().toUtf8(); + if (!registerTapListener(get_rtd_tap_listener_name(rtd_), &rtd_data, - display_filter.toUtf8().constData(), + display_filter.constData(), 0, tapReset, get_rtd_packet_func(rtd_), - tapDraw); - if (error_string) { - QMessageBox::critical(this, tr("Failed to attach to tap \"%1\"").arg(get_rtd_tap_listener_name(rtd_)), - error_string->str); - g_string_free(error_string, TRUE); + tapDraw)) { free_rtd_table(&rtd_data.stat_table, NULL, NULL); reject(); // XXX Stay open instead? return; @@ -269,7 +264,7 @@ void ResponseTimeDelayDialog::fillTree() statsTreeWidget()->sortItems(col_type_, Qt::AscendingOrder); statsTreeWidget()->setSortingEnabled(true); - remove_tap_listener(&rtd_data); + removeTapListeners(); free_rtd_table(&rtd_data.stat_table, NULL, NULL); } diff --git a/ui/qt/rtp_analysis_dialog.cpp b/ui/qt/rtp_analysis_dialog.cpp index 2ebdb29bc6..493012da00 100644 --- a/ui/qt/rtp_analysis_dialog.cpp +++ b/ui/qt/rtp_analysis_dialog.cpp @@ -449,10 +449,9 @@ RtpAnalysisDialog::RtpAnalysisDialog(QWidget &parent, CaptureFile &cf) : this, SLOT(updateWidgets())); updateWidgets(); - register_tap_listener("rtp", this, NULL, 0, tapReset, tapPacket, tapDraw); - + registerTapListener("rtp", this, NULL, 0, tapReset, tapPacket, tapDraw); cap_file_.retapPackets(); - remove_tap_listener(this); + removeTapListeners(); updateStatistics(); } diff --git a/ui/qt/service_response_time_dialog.cpp b/ui/qt/service_response_time_dialog.cpp index 5219d3ceaf..1c939d9d0b 100644 --- a/ui/qt/service_response_time_dialog.cpp +++ b/ui/qt/service_response_time_dialog.cpp @@ -30,7 +30,6 @@ #include "rpc_service_response_time_dialog.h" #include "wireshark_application.h" -#include <QMessageBox> #include <QTreeWidget> #include <QTreeWidgetItemIterator> @@ -266,19 +265,13 @@ void ServiceResponseTimeDialog::fillTree() srt_table_dissector_init(srt_, srt_data.srt_array, NULL, NULL); QString display_filter = displayFilter(); - GString *error_string = register_tap_listener(get_srt_tap_listener_name(srt_), - &srt_data, - display_filter.toUtf8().constData(), - 0, - tapReset, - get_srt_packet_func(srt_), - tapDraw); - if (error_string) { - QMessageBox::critical(this, tr("Failed to attach to tap \"%1\"").arg(get_srt_tap_listener_name(srt_)), - error_string->str); - g_string_free(error_string, TRUE); - g_array_free(srt_data.srt_array, TRUE); - srt_data.srt_array = NULL; + if (!registerTapListener(get_srt_tap_listener_name(srt_), + &srt_data, + display_filter.toUtf8().constData(), + 0, + tapReset, + get_srt_packet_func(srt_), + tapDraw)) { reject(); // XXX Stay open instead? return; } @@ -297,7 +290,8 @@ void ServiceResponseTimeDialog::fillTree() statsTreeWidget()->sortItems(SRT_COLUMN_PROCEDURE, Qt::AscendingOrder); statsTreeWidget()->setSortingEnabled(true); - remove_tap_listener(&srt_data); + removeTapListeners(); + g_array_free(srt_data.srt_array, TRUE); } diff --git a/ui/qt/simple_statistics_dialog.cpp b/ui/qt/simple_statistics_dialog.cpp index 525153580d..9ed61324aa 100644 --- a/ui/qt/simple_statistics_dialog.cpp +++ b/ui/qt/simple_statistics_dialog.cpp @@ -25,7 +25,6 @@ #include "epan/stat_tap_ui.h" -#include <QMessageBox> #include <QTreeWidget> #include "wireshark_application.h" @@ -252,17 +251,13 @@ void SimpleStatisticsDialog::fillTree() stu_->stat_tap_init_cb(stu_, NULL, NULL); QString display_filter = displayFilter(); - GString *error_string = register_tap_listener(stu_->tap_name, - &stat_data, - display_filter.toUtf8().constData(), - 0, - tapReset, - stu_->packet_func, - tapDraw); - if (error_string) { - QMessageBox::critical(this, tr("Failed to attach to tap \"%1\"").arg(stu_->tap_name), - error_string->str); - g_string_free(error_string, TRUE); + if (!registerTapListener(stu_->tap_name, + &stat_data, + display_filter.toUtf8().constData(), + 0, + tapReset, + stu_->packet_func, + tapDraw)) { free_stat_tables(stu_, NULL, NULL); reject(); // XXX Stay open instead? return; @@ -272,7 +267,7 @@ void SimpleStatisticsDialog::fillTree() tapDraw(&stat_data); - remove_tap_listener(&stat_data); + removeTapListeners(); free_stat_tables(stu_, NULL, NULL); } diff --git a/ui/qt/stats_tree_dialog.cpp b/ui/qt/stats_tree_dialog.cpp index f4f804f673..4f998568a9 100644 --- a/ui/qt/stats_tree_dialog.cpp +++ b/ui/qt/stats_tree_dialog.cpp @@ -111,7 +111,6 @@ void StatsTreeDialog::setupNode(stat_node* node) void StatsTreeDialog::fillTree() { - GString *error_string; if (!st_cfg_ || file_closed_) return; QString display_name = gchar_free_to_qstring(stats_tree_get_displayname(st_cfg_->name)); @@ -139,26 +138,22 @@ void StatsTreeDialog::fillTree() resize(st_->num_columns*80+80, height()); statsTreeWidget()->setSortingEnabled(false); - error_string = register_tap_listener(st_cfg_->tapname, - st_, - st_->filter, - st_cfg_->flags, - resetTap, - stats_tree_packet, - drawTreeItems); - if (error_string) { - QMessageBox::critical(this, tr("%1 failed to attach to tap").arg(display_name), - error_string->str); - g_string_free(error_string, TRUE); + if (!registerTapListener(st_cfg_->tapname, + st_, + st_->filter, + st_cfg_->flags, + resetTap, + stats_tree_packet, + drawTreeItems)) { reject(); // XXX Stay open instead? return; } - cf_retap_packets(cap_file_.capFile()); + cap_file_.retapPackets(); drawTreeItems(st_); statsTreeWidget()->setSortingEnabled(true); - remove_tap_listener(st_); + removeTapListeners(); st_cfg_->pr = NULL; } diff --git a/ui/qt/tap_parameter_dialog.cpp b/ui/qt/tap_parameter_dialog.cpp index ba7e4001e6..93e9ec223d 100644 --- a/ui/qt/tap_parameter_dialog.cpp +++ b/ui/qt/tap_parameter_dialog.cpp @@ -197,7 +197,7 @@ void TapParameterDialog::setRetapOnShow(bool retap) { show_timer_->stop(); if (retap) { - show_timer_->singleShot(0, this, SLOT(fillTree())); + show_timer_->singleShot(0, this, SLOT(fillTreeWrapper())); } } @@ -429,6 +429,13 @@ QByteArray TapParameterDialog::getTreeAsString(st_format_type format) return ba; } +void TapParameterDialog::fillTreeWrapper() +{ + ui->applyFilterButton->setEnabled(false); + fillTree(); + ui->applyFilterButton->setEnabled(true); +} + void TapParameterDialog::drawTreeItems() { if (ui->statsTreeWidget->model()->rowCount() < expand_all_threshold_) { @@ -519,11 +526,9 @@ void TapParameterDialog::on_applyFilterButton_clicked() if (!ui->displayFilterLineEdit->checkFilter()) return; - ui->applyFilterButton->setEnabled(false); QString filter = ui->displayFilterLineEdit->text(); emit updateFilter(filter, true); - fillTree(); - ui->applyFilterButton->setEnabled(true); + fillTreeWrapper(); } void TapParameterDialog::on_actionCopyToClipboard_triggered() diff --git a/ui/qt/tap_parameter_dialog.h b/ui/qt/tap_parameter_dialog.h index d79a30d75c..55915d2c8d 100644 --- a/ui/qt/tap_parameter_dialog.h +++ b/ui/qt/tap_parameter_dialog.h @@ -110,6 +110,7 @@ private: private slots: // Called by the constructor. The subclass should tap packets here. virtual void fillTree() = 0; + void fillTreeWrapper(); void on_applyFilterButton_clicked(); void on_actionCopyToClipboard_triggered(); diff --git a/ui/qt/wireshark_dialog.cpp b/ui/qt/wireshark_dialog.cpp index d816a4b553..8ddfddc1cd 100644 --- a/ui/qt/wireshark_dialog.cpp +++ b/ui/qt/wireshark_dialog.cpp @@ -19,20 +19,19 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* - * @file General dialog base class - * - * Base class which provides convenience methods for dialogs that handle - * capture files. "General" is a misnomer but we already have a class named - * "CaptureFileDialog". - */ - #include "config.h" #include <glib.h> +#include "cfile.h" + +#include <epan/packet.h> +#include <epan/tap.h> + #include "wireshark_dialog.h" +#include <QMessageBox> + #include "wireshark_application.h" // To do: @@ -42,31 +41,40 @@ WiresharkDialog::WiresharkDialog(QWidget &, CaptureFile &capture_file) : QDialog(NULL, Qt::Window), cap_file_(capture_file), - file_closed_(false) + file_closed_(false), + retap_depth_(0), + dialog_closed_(false) { setWindowIcon(wsApp->normalIcon()); + setWindowTitleFromSubtitle(); + + connect(&cap_file_, SIGNAL(captureFileRetapStarted()), this, SLOT(beginRetapPackets())); + connect(&cap_file_, SIGNAL(captureFileRetapFinished()), this, SLOT(endsRetapPackets())); connect(&cap_file_, SIGNAL(captureFileClosing()), this, SLOT(captureFileClosing())); connect(&cap_file_, SIGNAL(captureFileClosed()), this, SLOT(captureFileClosing())); - setWindowTitleFromSubtitle(); } void WiresharkDialog::accept() { - // Cancel any taps in progress. - cap_file_.setCaptureStopFlag(); - // We need to make sure our destructor is called. - deleteLater(); QDialog::accept(); + + // Cancel any taps in progress? + // cap_file_.setCaptureStopFlag(); + removeTapListeners(); + dialog_closed_ = true; + tryDeleteLater(); } // XXX Should we do this in WiresharkDialog? void WiresharkDialog::reject() { - // Cancel any taps in progress. - cap_file_.setCaptureStopFlag(); - // We need to make sure our destructor is called. - deleteLater(); QDialog::reject(); + + // Cancel any taps in progress? + // cap_file_.setCaptureStopFlag(); + removeTapListeners(); + dialog_closed_ = true; + tryDeleteLater(); } @@ -82,13 +90,54 @@ void WiresharkDialog::setWindowTitleFromSubtitle() QDialog::setWindowTitle(title); } +// See if we can destroy ourselves. The user may have clicked "Close" while +// we were deep in the bowels of a routine that retaps packets. Track our +// tapping state using retap_depth_ and our closed state using dialog_closed_. +void WiresharkDialog::tryDeleteLater() +{ + // In many of our subclasses, if the user clicks "Apply" followed by + // "Close" we can end up calling fillTree after calling tryDeleteLater. + // Disconnecting our slots here prevents that (in Qt5 at least). + disconnect(); + if (retap_depth_ < 1 && dialog_closed_) deleteLater(); +} + void WiresharkDialog::updateWidgets() { setWindowTitleFromSubtitle(); } +bool WiresharkDialog::registerTapListener(const char *tap_name, void *tap_data, const char *filter, guint flags, void(*tap_reset)(void *), gboolean(*tap_packet)(void *, struct _packet_info *, struct epan_dissect *, const void *), void(*tap_draw)(void *)) +{ + GString *error_string = register_tap_listener(tap_name, tap_data, filter, flags, + tap_reset, tap_packet, tap_draw); + if (error_string) { + QMessageBox::warning(this, tr("Failed to attach to tap \"%1\"").arg(tap_name), + error_string->str); + g_string_free(error_string, TRUE); + return false; + } + + tap_listeners_ << tap_data; + return true; +} + +void WiresharkDialog::endRetapPackets() +{ + retap_depth_--; + tryDeleteLater(); +} + +void WiresharkDialog::removeTapListeners() +{ + while (!tap_listeners_.isEmpty()) { + remove_tap_listener(tap_listeners_.takeFirst()); + } +} + void WiresharkDialog::captureFileClosing() { + removeTapListeners(); file_closed_ = true; setWindowTitleFromSubtitle(); updateWidgets(); diff --git a/ui/qt/wireshark_dialog.h b/ui/qt/wireshark_dialog.h index 33ca4100d9..d90be2104b 100644 --- a/ui/qt/wireshark_dialog.h +++ b/ui/qt/wireshark_dialog.h @@ -22,6 +22,17 @@ #ifndef WIRESHARK_DIALOG_H #define WIRESHARK_DIALOG_H +/* + * @file General dialog base class + * + * Base class which provides convenience methods for dialogs that handle + * capture files. "General" is a misnomer but we already have a class named + * "CaptureFileDialog". Suggestions for a better name from + * https://code.wireshark.org/review/#/c/9739/: + * BaseCaptureDialog, CaptureHelperDialog (or rename CaptureFileDialog to something else - WiresharkFileDialog). + * TapDialog might make sense as well. + */ + #include "capture_file.h" #include <QDialog> @@ -37,26 +48,92 @@ public: signals: public slots: + /** + * @brief Mark the start of a code block that retaps packets. If the user + * closes the dialog while tapping, the dialog will not be destroyed until + * endRetapPackets is called. + * + * This is automatically called when tapping begins, but might need to be + * called explicilty if any member functions are called or variables are + * accessed after tapping is finished. + */ + + void beginRetapPackets() { retap_depth_++; } + /** + * @brief Mark the end of a code block that retaps packets. If the user + * has closed the dialog it will be desroyed at this point. + * + * This is automatically called when tapping ends, but might need to be + * called explicilty if any member functions are called or variables are + * accessed after tapping is finished. + */ + void endRetapPackets(); protected: virtual void keyPressEvent(QKeyEvent *event) { QDialog::keyPressEvent(event); } virtual void accept(); virtual void reject(); + /** + * @brief Set the window subtitle, e.g. "Foo Timeouts". The subtitle and + * file name will be added to the dialog window title. + * @param subtitle The subtitle to add. It should be unique, short, and + * descriptive. + */ void setWindowSubtitle(const QString &subtitle); const QString &windowSubtitle() { return subtitle_; } virtual void updateWidgets(); + // Capture file and tapping CaptureFile &cap_file_; + /** + * @brief Convenience wrapper for register_tap_listener. Tap + * listeners registered via this function are automatically + * removed during destruction. They can also be explicitly + * removed using remove_tap_listener or removeTapListeners. + * + * Shows a warning dialog if registration is unsuccessful. + * @param tap_name A registered tap name. + * @param tap_data A unique pointer. Usually 'this'. + * @param filter A display filter. + * @param flags See register_tap_listener. + * @param tap_reset Reset callback. + * @param tap_packet Per-packet callback. + * @param tap_draw Draw callback. + */ + bool registerTapListener(const char *tap_name, void *tap_data, + const char *filter, guint flags, + void (*tap_reset)(void *tapdata), + gboolean (*tap_packet)(void *tapdata, struct _packet_info *pinfo, struct epan_dissect *edt, const void *data), + void (*tap_draw)(void *tap_data)); + + /** + * @brief Remove all tap listeners registered via registerTapListener. + */ + void removeTapListeners(); + + /** + * @brief true if the file has been closed, false otherwise. + */ + // XXX Needs a getter? bool file_closed_; protected slots: + /** + * @brief Called when the capture file is about to close. This can be + * used to enable or disable widgets according to the state of + * file_closed_. + */ virtual void captureFileClosing(); private: void setWindowTitleFromSubtitle(); + void tryDeleteLater(); QString subtitle_; + QList<void *> tap_listeners_; + int retap_depth_; + int dialog_closed_; private slots: }; diff --git a/ui/qt/wlan_statistics_dialog.cpp b/ui/qt/wlan_statistics_dialog.cpp index 3855de86fe..8759e77025 100644 --- a/ui/qt/wlan_statistics_dialog.cpp +++ b/ui/qt/wlan_statistics_dialog.cpp @@ -27,7 +27,6 @@ #include <epan/dissectors/packet-ieee80211.h> -#include <QMessageBox> #include <QTreeWidget> #include <QTreeWidgetItem> @@ -596,24 +595,20 @@ const QString WlanStatisticsDialog::filterExpression() void WlanStatisticsDialog::fillTree() { - GString *error_string = register_tap_listener("wlan", - this, - NULL, - TL_REQUIRES_NOTHING, - tapReset, - tapPacket, - tapDraw); - if (error_string) { - QMessageBox::warning(this, tr("Endpoint expert failed to register tap listener"), - error_string->str); - g_string_free(error_string, TRUE); + if (!registerTapListener("wlan", + this, + NULL, + TL_REQUIRES_NOTHING, + tapReset, + tapPacket, + tapDraw)) { reject(); return; } cap_file_.retapPackets(); tapDraw(this); - remove_tap_listener(this); + removeTapListeners(); for (int i = 0; i < statsTreeWidget()->topLevelItemCount(); i++) { QTreeWidgetItem *ti = statsTreeWidget()->topLevelItem(i); |