wireshark/ui/qt/traffic_table_dialog.cpp

151 lines
3.8 KiB
C++

/* traffic_table_dialog.cpp
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "traffic_table_dialog.h"
#include <ui_traffic_table_dialog.h>
#include <epan/addr_resolv.h>
#include <epan/prefs.h>
#include "ui/recent.h"
#include "progress_frame.h"
#include "main_application.h"
#include <ui/qt/widgets/traffic_tab.h>
#include <QCheckBox>
#include <QClipboard>
#include <QContextMenuEvent>
#include <QDialogButtonBox>
#include <QList>
#include <QMap>
#include <QMessageBox>
#include <QPushButton>
#include <QTabWidget>
#include <QTreeWidget>
#include <QTextStream>
#include <QToolButton>
#include <QTreeView>
// To do:
// - Add "copy" items to the menu.
// Bugs:
// - Tabs and menu items don't always end up in the same order.
// - Columns don't resize correctly.
// - Closing the capture file clears conversation data.
TrafficTableDialog::TrafficTableDialog(QWidget &parent, CaptureFile &cf, const char *filter, const QString &table_name) :
WiresharkDialog(parent, cf),
ui(new Ui::TrafficTableDialog),
filter_(filter)
{
ui->setupUi(this);
loadGeometry(parent.width(), parent.height() * 3 / 4);
ui->absoluteTimeCheckBox->hide();
setWindowSubtitle(QString("%1s").arg(table_name));
copy_bt_ = ui->buttonBox->addButton(tr("Copy"), QDialogButtonBox::ActionRole);
copy_bt_->setMenu(ui->trafficTab->createCopyMenu(copy_bt_));
ui->trafficTab->setFocus();
ui->trafficTab->useNanosecondTimestamps(cf.timestampPrecision() == WTAP_TSPREC_NSEC);
connect(mainApp, SIGNAL(addressResolutionChanged()), this, SLOT(currentTabChanged()));
connect(ui->trafficTab, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged()));
connect(&cap_file_, SIGNAL(captureEvent(CaptureEvent)), this, SLOT(captureEvent(CaptureEvent)));
connect(ui->absoluteTimeCheckBox, &QCheckBox::toggled, trafficTab(), &TrafficTab::useAbsoluteTime);
connect(trafficTab(), &TrafficTab::retapRequired, &cap_file_, &CaptureFile::delayedRetapPackets);
}
TrafficTableDialog::~TrafficTableDialog()
{
delete ui;
}
void TrafficTableDialog::addProgressFrame(QObject *parent)
{
ProgressFrame::addToButtonBox(ui->buttonBox, parent);
}
QDialogButtonBox *TrafficTableDialog::buttonBox() const
{
return ui->buttonBox;
}
QCheckBox *TrafficTableDialog::displayFilterCheckBox() const
{
return ui->displayFilterCheckBox;
}
QCheckBox *TrafficTableDialog::absoluteTimeCheckBox() const
{
return ui->absoluteTimeCheckBox;
}
TrafficTab *TrafficTableDialog::trafficTab() const
{
return ui->trafficTab;
}
void TrafficTableDialog::currentTabChanged()
{
bool has_resolution = ui->trafficTab->hasNameResolution();
ui->nameResolutionCheckBox->setEnabled(has_resolution);
if (! has_resolution) {
ui->nameResolutionCheckBox->setChecked(false);
ui->trafficTab->setNameResolution(false);
}
}
void TrafficTableDialog::on_nameResolutionCheckBox_toggled(bool checked)
{
ui->trafficTab->setNameResolution(checked);
}
void TrafficTableDialog::on_displayFilterCheckBox_toggled(bool checked)
{
if (!cap_file_.isValid()) {
return;
}
if (checked)
trafficTab()->setFilter(cap_file_.capFile()->dfilter);
else if (!filter_.isEmpty())
trafficTab()->setFilter(filter_);
else
trafficTab()->setFilter(QString());
cap_file_.retapPackets();
}
void TrafficTableDialog::captureEvent(CaptureEvent e)
{
if (e.captureContext() == CaptureEvent::Retap)
{
switch (e.eventType())
{
case CaptureEvent::Started:
ui->displayFilterCheckBox->setEnabled(false);
break;
case CaptureEvent::Finished:
ui->displayFilterCheckBox->setEnabled(true);
break;
default:
break;
}
}
}