2014-12-22 23:51:36 +00:00
|
|
|
/* wireshark_dialog.cpp
|
|
|
|
*
|
|
|
|
* Wireshark - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@wireshark.org>
|
|
|
|
* Copyright 1998 Gerald Combs
|
|
|
|
*
|
2018-04-30 07:47:58 +00:00
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
*/
|
2014-12-22 23:51:36 +00:00
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
#include <glib.h>
|
|
|
|
|
2015-08-24 19:30:56 +00:00
|
|
|
#include "cfile.h"
|
|
|
|
|
|
|
|
#include <epan/packet.h>
|
|
|
|
#include <epan/tap.h>
|
|
|
|
|
2022-02-01 03:30:09 +00:00
|
|
|
#include "main_application.h"
|
2014-12-22 23:51:36 +00:00
|
|
|
#include "wireshark_dialog.h"
|
2017-07-25 14:15:18 +00:00
|
|
|
#include <ui/qt/utils/qt_ui_utils.h>
|
2016-02-28 18:23:20 +00:00
|
|
|
#include "ui/recent.h"
|
2017-10-14 20:14:14 +00:00
|
|
|
#include "ui/ws_ui_util.h"
|
2014-12-22 23:51:36 +00:00
|
|
|
|
2015-08-24 19:30:56 +00:00
|
|
|
#include <QMessageBox>
|
|
|
|
|
2014-12-22 23:51:36 +00:00
|
|
|
|
|
|
|
// To do:
|
|
|
|
// - Use a dynamic property + Q_PROPERTY for the subtitle.
|
2015-08-26 19:48:56 +00:00
|
|
|
// - Make our nested event loop more robust. See tryDeleteLater for details.
|
2014-12-22 23:51:36 +00:00
|
|
|
|
2016-06-24 17:52:44 +00:00
|
|
|
WiresharkDialog::WiresharkDialog(QWidget &parent, CaptureFile &capture_file) :
|
|
|
|
GeometryStateDialog(&parent, Qt::Window),
|
2014-12-22 23:51:36 +00:00
|
|
|
cap_file_(capture_file),
|
2015-08-24 19:30:56 +00:00
|
|
|
file_closed_(false),
|
|
|
|
retap_depth_(0),
|
|
|
|
dialog_closed_(false)
|
2014-12-22 23:51:36 +00:00
|
|
|
{
|
2022-02-01 03:30:09 +00:00
|
|
|
setWindowIcon(mainApp->normalIcon());
|
2019-10-07 09:28:19 +00:00
|
|
|
setWindowSubtitle(QString());
|
2015-08-24 19:30:56 +00:00
|
|
|
|
2021-10-10 18:42:51 +00:00
|
|
|
connect(&cap_file_, &CaptureFile::captureEvent, this, &WiresharkDialog::captureEvent);
|
2014-12-22 23:51:36 +00:00
|
|
|
}
|
|
|
|
|
2015-07-24 17:24:15 +00:00
|
|
|
void WiresharkDialog::accept()
|
|
|
|
{
|
|
|
|
QDialog::accept();
|
2019-10-07 09:28:19 +00:00
|
|
|
dialogCleanup(true);
|
2015-07-24 17:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// XXX Should we do this in WiresharkDialog?
|
|
|
|
void WiresharkDialog::reject()
|
|
|
|
{
|
|
|
|
QDialog::reject();
|
2019-10-07 09:28:19 +00:00
|
|
|
dialogCleanup(true);
|
2015-07-24 17:24:15 +00:00
|
|
|
}
|
|
|
|
|
2014-12-22 23:51:36 +00:00
|
|
|
void WiresharkDialog::setWindowSubtitle(const QString &subtitle)
|
|
|
|
{
|
|
|
|
subtitle_ = subtitle;
|
|
|
|
|
2022-02-01 03:30:09 +00:00
|
|
|
QString title = mainApp->windowTitleString(QStringList() << subtitle_ << cap_file_.fileTitle());
|
2014-12-22 23:51:36 +00:00
|
|
|
QDialog::setWindowTitle(title);
|
|
|
|
}
|
|
|
|
|
2015-08-24 19:30:56 +00:00
|
|
|
// 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_.
|
2015-08-26 19:48:56 +00:00
|
|
|
//
|
2019-07-27 07:54:44 +00:00
|
|
|
// The Delta Object Rules page on nested event loops:
|
|
|
|
//
|
|
|
|
// https://jblog.andbit.net/2007/04/28/delta-object-rules/
|
|
|
|
//
|
|
|
|
// effectively says "don't do that." However, we don't really have a choice
|
|
|
|
// if we want to have a usable application that retaps packets.
|
2015-08-26 19:48:56 +00:00
|
|
|
|
2019-10-07 09:28:19 +00:00
|
|
|
void WiresharkDialog::dialogCleanup(bool closeDialog)
|
2015-08-24 19:30:56 +00:00
|
|
|
{
|
2019-11-17 19:02:20 +00:00
|
|
|
if (closeDialog)
|
2019-10-07 09:28:19 +00:00
|
|
|
{
|
|
|
|
// Cancel any taps in progress?
|
|
|
|
// cap_file_.setCaptureStopFlag();
|
|
|
|
removeTapListeners();
|
|
|
|
dialog_closed_ = true;
|
|
|
|
}
|
|
|
|
|
2015-08-26 19:48:56 +00:00
|
|
|
if (retap_depth_ < 1 && dialog_closed_) {
|
|
|
|
disconnect();
|
|
|
|
deleteLater();
|
|
|
|
}
|
2015-08-24 19:30:56 +00:00
|
|
|
}
|
|
|
|
|
2014-12-22 23:51:36 +00:00
|
|
|
void WiresharkDialog::updateWidgets()
|
|
|
|
{
|
2019-10-07 09:28:19 +00:00
|
|
|
setWindowSubtitle(subtitle_);
|
2014-12-22 23:51:36 +00:00
|
|
|
}
|
|
|
|
|
2022-06-09 15:47:35 +00:00
|
|
|
bool WiresharkDialog::registerTapListener(const char *tap_name, void *tap_data, const char *filter, guint flags, tap_reset_cb tap_reset, tap_packet_cb tap_packet, tap_draw_cb tap_draw)
|
2015-08-24 19:30:56 +00:00
|
|
|
{
|
2016-06-19 09:01:56 +00:00
|
|
|
GString *error_string = register_tap_listener(tap_name, tap_data, filter, flags,
|
2018-07-21 00:07:19 +00:00
|
|
|
tap_reset, tap_packet, tap_draw, NULL);
|
2015-08-24 19:30:56 +00:00
|
|
|
if (error_string) {
|
|
|
|
QMessageBox::warning(this, tr("Failed to attach to tap \"%1\"").arg(tap_name),
|
2016-06-19 09:01:56 +00:00
|
|
|
error_string->str);
|
|
|
|
g_string_free(error_string, TRUE);
|
2015-08-24 19:30:56 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
tap_listeners_ << tap_data;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2018-03-28 08:04:50 +00:00
|
|
|
void WiresharkDialog::captureEvent(CaptureEvent e)
|
2017-12-27 00:42:08 +00:00
|
|
|
{
|
2018-03-28 08:04:50 +00:00
|
|
|
switch (e.captureContext())
|
2017-12-27 00:42:08 +00:00
|
|
|
{
|
|
|
|
case CaptureEvent::Retap:
|
2018-03-28 08:04:50 +00:00
|
|
|
switch (e.eventType())
|
2017-12-27 00:42:08 +00:00
|
|
|
{
|
|
|
|
case CaptureEvent::Started:
|
|
|
|
beginRetapPackets();
|
|
|
|
break;
|
|
|
|
case CaptureEvent::Finished:
|
|
|
|
endRetapPackets();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case CaptureEvent::File:
|
2018-03-28 08:04:50 +00:00
|
|
|
switch (e.eventType())
|
2017-12-27 00:42:08 +00:00
|
|
|
{
|
|
|
|
case CaptureEvent::Closing:
|
|
|
|
captureFileClosing();
|
|
|
|
break;
|
|
|
|
case CaptureEvent::Closed:
|
2019-10-07 09:28:19 +00:00
|
|
|
file_closed_ = true;
|
2021-01-10 20:57:47 +00:00
|
|
|
captureFileClosed();
|
2017-12-27 00:42:08 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-01-14 20:37:16 +00:00
|
|
|
void WiresharkDialog::beginRetapPackets()
|
|
|
|
{
|
|
|
|
retap_depth_++;
|
|
|
|
}
|
|
|
|
|
2015-08-24 19:30:56 +00:00
|
|
|
void WiresharkDialog::endRetapPackets()
|
|
|
|
{
|
|
|
|
retap_depth_--;
|
2019-10-07 09:28:19 +00:00
|
|
|
dialogCleanup();
|
2015-08-24 19:30:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void WiresharkDialog::removeTapListeners()
|
|
|
|
{
|
|
|
|
while (!tap_listeners_.isEmpty()) {
|
|
|
|
remove_tap_listener(tap_listeners_.takeFirst());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-22 23:51:36 +00:00
|
|
|
void WiresharkDialog::captureFileClosing()
|
|
|
|
{
|
2015-09-25 09:05:45 +00:00
|
|
|
removeTapListeners();
|
|
|
|
updateWidgets();
|
|
|
|
}
|
|
|
|
|
2021-01-10 20:57:47 +00:00
|
|
|
void WiresharkDialog::captureFileClosed()
|
|
|
|
{
|
|
|
|
updateWidgets();
|
|
|
|
}
|