Qt: Convert more dialogs to WiresharkDialog.

Make the Sequence, IO Graph, Statistics Tree, and VoIP Calls dialogs
subclasses of WiresharkDialog.

Remove "Stats Tree" from Statistics Tree dialog titles. Don't complain
if the user opens more than one instance of the dialog.

Use the applicationName property in WiresharkApplication instead of a
separate variable.

Add a preexisting item to the IO Graph bug list (hovering when the file
is closed clears the graph).

Change-Id: I8411a25305d00b16e0d4a82fa50a9bad5c85b239
Reviewed-on: https://code.wireshark.org/review/6125
Reviewed-by: Gerald Combs <gerald@wireshark.org>
This commit is contained in:
Gerald Combs 2014-12-29 11:42:01 -08:00
parent b6ff338e81
commit 4556498f33
14 changed files with 86 additions and 134 deletions

View File

@ -140,7 +140,7 @@ struct _stats_tree_cfg {
gchar* tapname; gchar* tapname;
register_stat_group_t stat_group; register_stat_group_t stat_group;
gboolean in_use; gboolean in_use; /* GTK+ only */
gboolean plugin; gboolean plugin;
/** dissector defined callbacks */ /** dissector defined callbacks */

View File

@ -38,7 +38,7 @@ public:
explicit CaptureFile(QObject *parent = 0, capture_file *cap_file = NULL); explicit CaptureFile(QObject *parent = 0, capture_file *cap_file = NULL);
~CaptureFile(); ~CaptureFile();
capture_file *capFile() const { return cap_file_; } capture_file *capFile() const { return isValid() ? cap_file_ : NULL; }
void setCapFile(capture_file *cap_file) { cap_file_ = cap_file; } void setCapFile(capture_file *cap_file) { cap_file_ = cap_file; }
/** Check capture file validity /** Check capture file validity
* *

View File

@ -52,6 +52,7 @@
// - We retap and redraw more than we should. // - We retap and redraw more than we should.
// - Smoothing doesn't seem to match GTK+ // - Smoothing doesn't seem to match GTK+
// - We don't register a tap listener ("-z io,stat", bottom of gtk/io_stat.c) // - We don't register a tap listener ("-z io,stat", bottom of gtk/io_stat.c)
// - Hovering over a graph when the file is closed clears the graph.
// To do: // To do:
// - Use scroll bars? // - Use scroll bars?
@ -177,10 +178,9 @@ static void io_graph_free_cb(void* p) {
Q_DECLARE_METATYPE(IOGraph *) Q_DECLARE_METATYPE(IOGraph *)
IOGraphDialog::IOGraphDialog(QWidget *parent, capture_file *cf) : IOGraphDialog::IOGraphDialog(QWidget &parent, CaptureFile &cf) :
QDialog(parent), WiresharkDialog(parent, cf),
ui(new Ui::IOGraphDialog), ui(new Ui::IOGraphDialog),
cap_file_(cf),
name_line_edit_(NULL), name_line_edit_(NULL),
dfilter_line_edit_(NULL), dfilter_line_edit_(NULL),
yfield_line_edit_(NULL), yfield_line_edit_(NULL),
@ -199,6 +199,7 @@ IOGraphDialog::IOGraphDialog(QWidget *parent, capture_file *cf) :
auto_axes_(true) auto_axes_(true)
{ {
ui->setupUi(this); ui->setupUi(this);
setWindowSubtitle(tr("IO Graphs"));
setAttribute(Qt::WA_DeleteOnClose, true); setAttribute(Qt::WA_DeleteOnClose, true);
QCustomPlot *iop = ui->ioPlot; QCustomPlot *iop = ui->ioPlot;
@ -247,17 +248,10 @@ IOGraphDialog::IOGraphDialog(QWidget *parent, capture_file *cf) :
iop->setMouseTracking(true); iop->setMouseTracking(true);
iop->setEnabled(true); iop->setEnabled(true);
QString dlg_title = tr("Wireshark IO Graphs: ");
if (cap_file_) {
dlg_title += cf_get_display_name(cap_file_);
} else {
dlg_title += tr("No Capture Data");
}
setWindowTitle(dlg_title);
QCPPlotTitle *title = new QCPPlotTitle(iop); QCPPlotTitle *title = new QCPPlotTitle(iop);
iop->plotLayout()->insertRow(0); iop->plotLayout()->insertRow(0);
iop->plotLayout()->addElement(0, 0, title); iop->plotLayout()->addElement(0, 0, title);
title->setText(dlg_title); title->setText(tr("Wireshark IO Graphs: %1").arg(cap_file_.fileTitle()));
tracer_ = new QCPItemTracer(iop); tracer_ = new QCPItemTracer(iop);
iop->addItem(tracer_); iop->addItem(tracer_);
@ -441,11 +435,8 @@ void IOGraphDialog::syncGraphSettings(QTreeWidgetItem *item)
} }
} }
void IOGraphDialog::setCaptureFile(capture_file *cf) void IOGraphDialog::updateWidgets()
{ {
if (!cf) { // We only want to know when the file closes.
cap_file_ = NULL;
}
} }
void IOGraphDialog::scheduleReplot(bool now) void IOGraphDialog::scheduleReplot(bool now)
@ -826,7 +817,7 @@ void IOGraphDialog::mouseMoved(QMouseEvent *event)
if (interval_packet > 0) { if (interval_packet > 0) {
packet_num_ = (guint32) interval_packet; packet_num_ = (guint32) interval_packet;
msg = tr("%1 %2") msg = tr("%1 %2")
.arg(cap_file_ ? tr("Click to select packet") : tr("Packet")) .arg(!file_closed_ ? tr("Click to select packet") : tr("Packet"))
.arg(packet_num_); .arg(packet_num_);
val = " = " + QString::number(tracer_->position->value(), 'g', 4); val = " = " + QString::number(tracer_->position->value(), 'g', 4);
} }
@ -948,15 +939,15 @@ void IOGraphDialog::updateStatistics()
{ {
if (!isVisible()) return; if (!isVisible()) return;
if (need_retap_) { if (need_retap_ && !file_closed_) {
need_retap_ = false; need_retap_ = false;
cf_retap_packets(cap_file_); cap_file_.retapPackets();
ui->ioPlot->setFocus(); ui->ioPlot->setFocus();
} else { } else {
if (need_recalc_) { if (need_recalc_) {
need_recalc_ = false; need_recalc_ = false;
need_replot_ = true; need_replot_ = true;
emit recalcGraphData(cap_file_); emit recalcGraphData(cap_file_.capFile());
if (!tracer_->graph()) { if (!tracer_->graph()) {
if (base_graph_ && base_graph_->data()->size() > 0) { if (base_graph_ && base_graph_->data()->size() > 0) {
tracer_->setGraph(base_graph_); tracer_->setGraph(base_graph_);
@ -1431,7 +1422,7 @@ void IOGraphDialog::on_actionMoveDown1_triggered()
void IOGraphDialog::on_actionGoToPacket_triggered() void IOGraphDialog::on_actionGoToPacket_triggered()
{ {
if (tracer_->visible() && cap_file_ && packet_num_ > 0) { if (tracer_->visible() && !file_closed_ && packet_num_ > 0) {
emit goToPacket(packet_num_); emit goToPacket(packet_num_);
} }
} }
@ -1477,8 +1468,8 @@ void IOGraphDialog::on_buttonBox_accepted()
.arg(jpeg_filter); .arg(jpeg_filter);
QString save_file = path.canonicalPath(); QString save_file = path.canonicalPath();
if (cap_file_) { if (!file_closed_) {
save_file += QString("/%1").arg(cf_get_display_name(cap_file_)); save_file += QString("/%1").arg(cap_file_.fileTitle());
} }
file_name = QFileDialog::getSaveFileName(this, tr("Wireshark: Save Graph As..."), file_name = QFileDialog::getSaveFileName(this, tr("Wireshark: Save Graph As..."),
save_file, filter, &extension); save_file, filter, &extension);

View File

@ -34,9 +34,9 @@
#include "ui/io_graph_item.h" #include "ui/io_graph_item.h"
#include "syntax_line_edit.h" #include "syntax_line_edit.h"
#include "wireshark_dialog.h"
#include <QComboBox> #include <QComboBox>
#include <QDialog>
#include <QIcon> #include <QIcon>
#include <QLineEdit> #include <QLineEdit>
#include <QMenu> #include <QMenu>
@ -127,12 +127,12 @@ namespace Ui {
class IOGraphDialog; class IOGraphDialog;
} }
class IOGraphDialog : public QDialog class IOGraphDialog : public WiresharkDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit IOGraphDialog(QWidget *parent = 0, capture_file *cf = NULL); explicit IOGraphDialog(QWidget &parent, CaptureFile &cf);
~IOGraphDialog(); ~IOGraphDialog();
void addGraph(bool checked, QString name, QString dfilter, int color_idx, IOGraph::PlotStyles style, void addGraph(bool checked, QString name, QString dfilter, int color_idx, IOGraph::PlotStyles style,
@ -142,7 +142,6 @@ public:
void syncGraphSettings(QTreeWidgetItem *item); void syncGraphSettings(QTreeWidgetItem *item);
public slots: public slots:
void setCaptureFile(capture_file *cf);
void scheduleReplot(bool now = false); void scheduleReplot(bool now = false);
void scheduleRecalc(bool now = false); void scheduleRecalc(bool now = false);
void scheduleRetap(bool now = false); void scheduleRetap(bool now = false);
@ -159,7 +158,6 @@ signals:
private: private:
Ui::IOGraphDialog *ui; Ui::IOGraphDialog *ui;
capture_file *cap_file_;
QLineEdit *name_line_edit_; QLineEdit *name_line_edit_;
SyntaxLineEdit *dfilter_line_edit_; SyntaxLineEdit *dfilter_line_edit_;
SyntaxLineEdit *yfield_line_edit_; SyntaxLineEdit *yfield_line_edit_;
@ -194,6 +192,7 @@ private:
void loadProfileGraphs(); void loadProfileGraphs();
private slots: private slots:
void updateWidgets();
void graphClicked(QMouseEvent *event); void graphClicked(QMouseEvent *event);
void mouseMoved(QMouseEvent *event); void mouseMoved(QMouseEvent *event);
void mouseReleased(QMouseEvent *event); void mouseReleased(QMouseEvent *event);

View File

@ -2120,11 +2120,9 @@ void MainWindow::on_actionSCTPFilterThisAssociation_triggered()
void MainWindow::on_actionStatisticsFlowGraph_triggered() void MainWindow::on_actionStatisticsFlowGraph_triggered()
{ {
SequenceDialog *sequence_dialog = new SequenceDialog(this, capture_file_.capFile()); SequenceDialog *sequence_dialog = new SequenceDialog(*this, capture_file_);
connect(sequence_dialog, SIGNAL(goToPacket(int)), connect(sequence_dialog, SIGNAL(goToPacket(int)),
packet_list_, SLOT(goToPacket(int))); packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)),
sequence_dialog, SLOT(setCaptureFile(capture_file*)));
sequence_dialog->show(); sequence_dialog->show();
} }
@ -2165,11 +2163,9 @@ void MainWindow::on_actionStatisticsTcpStreamWindowScaling_triggered()
void MainWindow::openStatisticsTreeDialog(const gchar *abbr) void MainWindow::openStatisticsTreeDialog(const gchar *abbr)
{ {
StatsTreeDialog *st_dialog = new StatsTreeDialog(this, capture_file_.capFile(), abbr); StatsTreeDialog *st_dialog = new StatsTreeDialog(*this, capture_file_, abbr);
// connect(st_dialog, SIGNAL(goToPacket(int)), // connect(st_dialog, SIGNAL(goToPacket(int)),
// packet_list_, SLOT(goToPacket(int))); // packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)),
st_dialog, SLOT(setCaptureFile(capture_file*)));
st_dialog->show(); st_dialog->show();
} }
@ -2360,10 +2356,8 @@ void MainWindow::statCommandIOGraph(const char *arg, void *userdata)
{ {
Q_UNUSED(arg); Q_UNUSED(arg);
Q_UNUSED(userdata); Q_UNUSED(userdata);
IOGraphDialog *iog_dialog = new IOGraphDialog(this, capture_file_.capFile()); IOGraphDialog *iog_dialog = new IOGraphDialog(*this, capture_file_);
connect(iog_dialog, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int))); connect(iog_dialog, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)),
iog_dialog, SLOT(setCaptureFile(capture_file*)));
iog_dialog->show(); iog_dialog->show();
} }
@ -2380,13 +2374,11 @@ void MainWindow::on_actionStatisticsSametime_triggered()
void MainWindow::openVoipCallsDialog(bool all_flows) void MainWindow::openVoipCallsDialog(bool all_flows)
{ {
VoipCallsDialog *voip_calls_dialog = new VoipCallsDialog(this, capture_file_.capFile(), all_flows); VoipCallsDialog *voip_calls_dialog = new VoipCallsDialog(*this, capture_file_, all_flows);
connect(voip_calls_dialog, SIGNAL(goToPacket(int)), connect(voip_calls_dialog, SIGNAL(goToPacket(int)),
packet_list_, SLOT(goToPacket(int))); packet_list_, SLOT(goToPacket(int)));
connect(voip_calls_dialog, SIGNAL(updateFilter(QString&, bool)), connect(voip_calls_dialog, SIGNAL(updateFilter(QString&, bool)),
this, SLOT(filterPackets(QString&, bool))); this, SLOT(filterPackets(QString&, bool)));
connect(this, SIGNAL(setCaptureFile(capture_file*)),
voip_calls_dialog, SLOT(setCaptureFile(capture_file*)));
voip_calls_dialog->show(); voip_calls_dialog->show();
} }

View File

@ -45,10 +45,9 @@
// - Create WSGraph subclasses with common behavior. // - Create WSGraph subclasses with common behavior.
// - Help button and text // - Help button and text
SequenceDialog::SequenceDialog(QWidget *parent, capture_file *cf, seq_analysis_info_t *sainfo) : SequenceDialog::SequenceDialog(QWidget &parent, CaptureFile &cf, seq_analysis_info_t *sainfo) :
QDialog(parent), WiresharkDialog(parent, cf),
ui(new Ui::SequenceDialog), ui(new Ui::SequenceDialog),
cap_file_(cf),
sainfo_(sainfo), sainfo_(sainfo),
num_items_(0), num_items_(0),
packet_num_(0), packet_num_(0),
@ -56,6 +55,7 @@ SequenceDialog::SequenceDialog(QWidget *parent, capture_file *cf, seq_analysis_i
{ {
ui->setupUi(this); ui->setupUi(this);
QCustomPlot *sp = ui->sequencePlot; QCustomPlot *sp = ui->sequencePlot;
setWindowSubtitle(sainfo ? tr("Call Flow") : tr("Flow"));
if (!sainfo_) { if (!sainfo_) {
sainfo_ = sequence_analysis_info_new(); sainfo_ = sequence_analysis_info_new();
@ -122,9 +122,7 @@ SequenceDialog::SequenceDialog(QWidget *parent, capture_file *cf, seq_analysis_i
save_bt->setText(tr("Save As...")); save_bt->setText(tr("Save As..."));
// XXX Use recent settings instead // XXX Use recent settings instead
if (parent) { resize(parent.width(), parent.height() * 4 / 5);
resize(parent->width(), parent->height() * 4 / 5);
}
connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(hScrollBarChanged(int))); connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(hScrollBarChanged(int)));
connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(vScrollBarChanged(int))); connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(vScrollBarChanged(int)));
@ -148,11 +146,8 @@ SequenceDialog::~SequenceDialog()
delete ui; delete ui;
} }
void SequenceDialog::setCaptureFile(capture_file *cf) void SequenceDialog::updateWidgets()
{ {
if (!cf) { // We only want to know when the file closes.
cap_file_ = NULL;
}
} }
void SequenceDialog::showEvent(QShowEvent *event) void SequenceDialog::showEvent(QShowEvent *event)
@ -315,7 +310,7 @@ void SequenceDialog::on_buttonBox_accepted()
.arg(png_filter) .arg(png_filter)
.arg(bmp_filter) .arg(bmp_filter)
.arg(jpeg_filter); .arg(jpeg_filter);
if (cap_file_) { if (!file_closed_) {
filter.append(QString(";;%5").arg(ascii_filter)); filter.append(QString(";;%5").arg(ascii_filter));
} }
@ -332,8 +327,8 @@ void SequenceDialog::on_buttonBox_accepted()
save_ok = ui->sequencePlot->saveBmp(file_name); save_ok = ui->sequencePlot->saveBmp(file_name);
} else if (extension.compare(jpeg_filter) == 0) { } else if (extension.compare(jpeg_filter) == 0) {
save_ok = ui->sequencePlot->saveJpg(file_name); save_ok = ui->sequencePlot->saveJpg(file_name);
} else if (extension.compare(ascii_filter) == 0 && cap_file_ && sainfo_) { } else if (extension.compare(ascii_filter) == 0 && !file_closed_ && sainfo_) {
save_ok = sequence_analysis_dump_to_file(file_name.toUtf8().constData(), sainfo_, cap_file_, 0); save_ok = sequence_analysis_dump_to_file(file_name.toUtf8().constData(), sainfo_, cap_file_.capFile(), 0);
} }
// else error dialog? // else error dialog?
if (save_ok) { if (save_ok) {
@ -345,7 +340,7 @@ void SequenceDialog::on_buttonBox_accepted()
void SequenceDialog::fillDiagram() void SequenceDialog::fillDiagram()
{ {
if (!sainfo_) return; if (!sainfo_ || file_closed_) return;
QCustomPlot *sp = ui->sequencePlot; QCustomPlot *sp = ui->sequencePlot;
@ -354,7 +349,7 @@ void SequenceDialog::fillDiagram()
} else { } else {
seq_diagram_->clearData(); seq_diagram_->clearData();
sequence_analysis_list_free(sainfo_); sequence_analysis_list_free(sainfo_);
sequence_analysis_list_get(cap_file_, sainfo_); sequence_analysis_list_get(cap_file_.capFile(), sainfo_);
num_items_ = sequence_analysis_get_nodes(sainfo_); num_items_ = sequence_analysis_get_nodes(sainfo_);
seq_diagram_->setData(sainfo_); seq_diagram_->setData(sainfo_);
} }
@ -431,7 +426,7 @@ void SequenceDialog::on_resetButton_clicked()
void SequenceDialog::on_actionGoToPacket_triggered() void SequenceDialog::on_actionGoToPacket_triggered()
{ {
if (cap_file_ && packet_num_ > 0) { if (!file_closed_ && packet_num_ > 0) {
emit goToPacket(packet_num_); emit goToPacket(packet_num_);
} }
} }

View File

@ -33,8 +33,8 @@
#include "ui/tap-sequence-analysis.h" #include "ui/tap-sequence-analysis.h"
#include "qcustomplot.h" #include "qcustomplot.h"
#include "wireshark_dialog.h"
#include <QDialog>
#include <QMenu> #include <QMenu>
namespace Ui { namespace Ui {
@ -43,20 +43,17 @@ class SequenceDialog;
class SequenceDiagram; class SequenceDiagram;
class SequenceDialog : public QDialog class SequenceDialog : public WiresharkDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit SequenceDialog(QWidget *parent = 0, capture_file *cf = NULL, seq_analysis_info_t *sainfo = NULL); explicit SequenceDialog(QWidget &parent, CaptureFile &cf, seq_analysis_info_t *sainfo = NULL);
~SequenceDialog(); ~SequenceDialog();
signals: signals:
void goToPacket(int packet_num); void goToPacket(int packet_num);
public slots:
void setCaptureFile(capture_file *cf);
protected: protected:
void showEvent(QShowEvent *event); void showEvent(QShowEvent *event);
void resizeEvent(QResizeEvent *event); void resizeEvent(QResizeEvent *event);
@ -64,6 +61,7 @@ protected:
void mouseReleaseEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event);
private slots: private slots:
void updateWidgets();
void hScrollBarChanged(int value); void hScrollBarChanged(int value);
void vScrollBarChanged(int value); void vScrollBarChanged(int value);
void xAxisChanged(QCPRange range); void xAxisChanged(QCPRange range);
@ -91,7 +89,6 @@ private slots:
private: private:
Ui::SequenceDialog *ui; Ui::SequenceDialog *ui;
SequenceDiagram *seq_diagram_; SequenceDiagram *seq_diagram_;
capture_file *cap_file_;
seq_analysis_info_t *sainfo_; seq_analysis_info_t *sainfo_;
int num_items_; int num_items_;
guint32 packet_num_; guint32 packet_num_;

View File

@ -10,9 +10,6 @@
<height>568</height> <height>568</height>
</rect> </rect>
</property> </property>
<property name="windowTitle">
<string>Flow</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,0,0,0"> <layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,0,0,0">
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
@ -46,7 +43,7 @@
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QLabel" name="hintLabel"> <widget class="ElidedLabel" name="hintLabel">
<property name="toolTip"> <property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt; <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;
@ -358,6 +355,11 @@
<header>qcustomplot.h</header> <header>qcustomplot.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget>
<class>ElidedLabel</class>
<extends>QLabel</extends>
<header>elided_label.h</header>
</customwidget>
</customwidgets> </customwidgets>
<resources/> <resources/>
<connections> <connections>

View File

@ -44,9 +44,7 @@
// - Add help // - Add help
// - Update to match bug 9452 / r53657 // - Update to match bug 9452 / r53657
#include <QDebug> const int item_col_ = 0;
const int item_col_ = 0;
const int expand_all_threshold_ = 100; // Arbitrary const int expand_all_threshold_ = 100; // Arbitrary
@ -72,15 +70,15 @@ public:
} }
}; };
StatsTreeDialog::StatsTreeDialog(QWidget *parent, capture_file *cf, const char *cfg_abbr) : StatsTreeDialog::StatsTreeDialog(QWidget &parent, CaptureFile &cf, const char *cfg_abbr) :
QDialog(parent), WiresharkDialog(parent, cf),
ui(new Ui::StatsTreeDialog), ui(new Ui::StatsTreeDialog),
st_(NULL), st_(NULL),
st_cfg_(NULL), st_cfg_(NULL)
cap_file_(cf)
{ {
ui->setupUi(this); ui->setupUi(this);
st_cfg_ = stats_tree_get_cfg_by_abbr(cfg_abbr); st_cfg_ = stats_tree_get_cfg_by_abbr(cfg_abbr);
memset(&cfg_pr_, 0, sizeof(struct _tree_cfg_pres));
if (!st_cfg_) { if (!st_cfg_) {
QMessageBox::critical(this, tr("Configuration not found"), QMessageBox::critical(this, tr("Configuration not found"),
@ -110,35 +108,19 @@ StatsTreeDialog::~StatsTreeDialog()
delete ui; delete ui;
} }
void StatsTreeDialog::setCaptureFile(capture_file *cf)
{
if (!cf) { // We only want to know when the file closes.
cap_file_ = NULL;
ui->displayFilterLineEdit->setEnabled(false);
ui->applyFilterButton->setEnabled(false);
}
}
void StatsTreeDialog::fillTree() void StatsTreeDialog::fillTree()
{ {
GString *error_string; GString *error_string;
if (!st_cfg_) return; if (!st_cfg_ || file_closed_) return;
gchar* display_name_temp = stats_tree_get_displayname(st_cfg_->name); gchar* display_name_temp = stats_tree_get_displayname(st_cfg_->name);
QString display_name(display_name_temp); QString display_name(display_name_temp);
g_free(display_name_temp); g_free(display_name_temp);
setWindowTitle(display_name + tr(" Stats Tree")); // The GTK+ UI appends "Stats Tree" to the window title. If we do the same
// here we should expand the name completely, e.g. to "Statistics Tree".
setWindowSubtitle(display_name);
if (!cap_file_) return;
if (st_cfg_->in_use) {
QMessageBox::warning(this, tr("%1 already open").arg(display_name),
tr("Each type of tree can only be generated one at time."));
reject();
}
st_cfg_->in_use = TRUE;
st_cfg_->pr = &cfg_pr_; st_cfg_->pr = &cfg_pr_;
cfg_pr_.st_dlg = this; cfg_pr_.st_dlg = this;
@ -174,13 +156,12 @@ void StatsTreeDialog::fillTree()
reject(); reject();
} }
cf_retap_packets(cap_file_); cf_retap_packets(cap_file_.capFile());
drawTreeItems(st_); drawTreeItems(st_);
ui->statsTreeWidget->setSortingEnabled(true); ui->statsTreeWidget->setSortingEnabled(true);
remove_tap_listener(st_); remove_tap_listener(st_);
st_cfg_->in_use = FALSE;
st_cfg_->pr = NULL; st_cfg_->pr = NULL;
} }
@ -250,6 +231,14 @@ void StatsTreeDialog::drawTreeItems(void *st_ptr)
} }
} }
void StatsTreeDialog::updateWidgets()
{
if (file_closed_) {
ui->displayFilterLineEdit->setEnabled(false);
ui->applyFilterButton->setEnabled(false);
}
}
void StatsTreeDialog::on_applyFilterButton_clicked() void StatsTreeDialog::on_applyFilterButton_clicked()
{ {
fillTree(); fillTree();

View File

@ -30,7 +30,7 @@
#include "epan/stats_tree_priv.h" #include "epan/stats_tree_priv.h"
#include <QDialog> #include "wireshark_dialog.h"
namespace Ui { namespace Ui {
class StatsTreeDialog; class StatsTreeDialog;
@ -41,17 +41,16 @@ struct _tree_cfg_pres {
class StatsTreeDialog* st_dlg; class StatsTreeDialog* st_dlg;
}; };
class StatsTreeDialog : public QDialog class StatsTreeDialog : public WiresharkDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit StatsTreeDialog(QWidget *parent = 0, capture_file *cf = NULL, const char *cfg_abbr = NULL); explicit StatsTreeDialog(QWidget &parent, CaptureFile &cf, const char *cfg_abbr = NULL);
~StatsTreeDialog(); ~StatsTreeDialog();
static void setupNode(stat_node* node); static void setupNode(stat_node* node);
public slots: public slots:
void setCaptureFile(capture_file *cf);
private: private:
Ui::StatsTreeDialog *ui; Ui::StatsTreeDialog *ui;
@ -59,13 +58,13 @@ private:
struct _tree_cfg_pres cfg_pr_; struct _tree_cfg_pres cfg_pr_;
stats_tree *st_; stats_tree *st_;
stats_tree_cfg *st_cfg_; stats_tree_cfg *st_cfg_;
capture_file *cap_file_;
void fillTree(); void fillTree();
static void resetTap(void *st_ptr); static void resetTap(void *st_ptr);
static void drawTreeItems(void *st_ptr); static void drawTreeItems(void *st_ptr);
private slots: private slots:
void updateWidgets();
void on_applyFilterButton_clicked(); void on_applyFilterButton_clicked();
void on_actionCopyToClipboard_triggered(); void on_actionCopyToClipboard_triggered();
void on_actionSaveAs_triggered(); void on_actionSaveAs_triggered();

View File

@ -157,13 +157,13 @@ public:
}; };
VoipCallsDialog::VoipCallsDialog(QWidget *parent, capture_file *cf, bool all_flows) : VoipCallsDialog::VoipCallsDialog(QWidget &parent, CaptureFile &cf, bool all_flows) :
QDialog(parent), WiresharkDialog(parent, cf),
ui(new Ui::VoipCallsDialog), ui(new Ui::VoipCallsDialog)
cap_file_(cf)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->callTreeWidget->sortByColumn(start_time_col_, Qt::AscendingOrder); ui->callTreeWidget->sortByColumn(start_time_col_, Qt::AscendingOrder);
setWindowSubtitle(all_flows ? tr("SIP Flows") : tr("VoIP Calls"));
ctx_menu_.addActions(QList<QAction *>() << ui->actionSelect_All); ctx_menu_.addActions(QList<QAction *>() << ui->actionSelect_All);
@ -173,9 +173,7 @@ VoipCallsDialog::VoipCallsDialog(QWidget *parent, capture_file *cf, bool all_flo
player_button_->setIcon(StockIcon("media-playback-start")); player_button_->setIcon(StockIcon("media-playback-start"));
// XXX Use recent settings instead // XXX Use recent settings instead
if (parent) { resize(parent.width() * 4 / 5, parent.height() * 2 / 3);
resize(parent->width() * 4 / 5, parent->height() * 2 / 3);
}
memset (&tapinfo_, 0, sizeof(tapinfo_)); memset (&tapinfo_, 0, sizeof(tapinfo_));
tapinfo_.tap_packet = tapPacket; tapinfo_.tap_packet = tapPacket;
@ -191,10 +189,8 @@ VoipCallsDialog::VoipCallsDialog(QWidget *parent, capture_file *cf, bool all_flo
updateWidgets(); updateWidgets();
if (cap_file_) { tapinfo_.session = cap_file_.capFile()->epan;
tapinfo_.session = cap_file_->epan; cap_file_.retapPackets();
cf_retap_packets(cap_file_);
}
} }
VoipCallsDialog::~VoipCallsDialog() VoipCallsDialog::~VoipCallsDialog()
@ -205,15 +201,11 @@ VoipCallsDialog::~VoipCallsDialog()
sequence_analysis_info_free(tapinfo_.graph_analysis); sequence_analysis_info_free(tapinfo_.graph_analysis);
} }
void VoipCallsDialog::setCaptureFile(capture_file *cf) void VoipCallsDialog::captureFileClosing()
{ {
if (!cf) { // We only want to know when the file closes. voip_calls_remove_all_tap_listeners(&tapinfo_);
voip_calls_remove_all_tap_listeners(&tapinfo_); tapinfo_.session = NULL;
cap_file_ = NULL; WiresharkDialog::captureFileClosing();
tapinfo_.session = NULL;
}
emit captureFileChanged(cap_file_);
updateWidgets();
} }
void VoipCallsDialog::contextMenuEvent(QContextMenuEvent *event) void VoipCallsDialog::contextMenuEvent(QContextMenuEvent *event)
@ -436,7 +428,7 @@ void VoipCallsDialog::prepareFilter()
void VoipCallsDialog::showSequence() void VoipCallsDialog::showSequence()
{ {
if (!cap_file_) return; if (file_closed_) return;
QSet<guint16> selected_calls; QSet<guint16> selected_calls;
foreach (QTreeWidgetItem *ti, ui->callTreeWidget->selectedItems()) { foreach (QTreeWidgetItem *ti, ui->callTreeWidget->selectedItems()) {
@ -452,12 +444,10 @@ void VoipCallsDialog::showSequence()
cur_ga_item = g_list_next(cur_ga_item); cur_ga_item = g_list_next(cur_ga_item);
} }
SequenceDialog *sequence_dialog = new SequenceDialog(this, cap_file_, tapinfo_.graph_analysis); SequenceDialog *sequence_dialog = new SequenceDialog(*parentWidget(), cap_file_, tapinfo_.graph_analysis);
// XXX This goes away when we close the VoIP Calls dialog. // XXX This goes away when we close the VoIP Calls dialog.
connect(sequence_dialog, SIGNAL(goToPacket(int)), connect(sequence_dialog, SIGNAL(goToPacket(int)),
this, SIGNAL(goToPacket(int))); this, SIGNAL(goToPacket(int)));
connect(this, SIGNAL(captureFileChanged(capture_file*)),
sequence_dialog, SLOT(setCaptureFile(capture_file*)));
sequence_dialog->show(); sequence_dialog->show();
} }

View File

@ -30,7 +30,8 @@
#include "ui/voip_calls.h" #include "ui/voip_calls.h"
#include <QDialog> #include "wireshark_dialog.h"
#include <QMenu> #include <QMenu>
class QAbstractButton; class QAbstractButton;
@ -41,16 +42,15 @@ class VoipCallsDialog;
} }
class QTreeWidgetItem; class QTreeWidgetItem;
class VoipCallsDialog : public QDialog class VoipCallsDialog : public WiresharkDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit VoipCallsDialog(QWidget *parent = 0, capture_file *cf = NULL, bool all_flows = false); explicit VoipCallsDialog(QWidget &parent, CaptureFile &cf, bool all_flows = false);
~VoipCallsDialog(); ~VoipCallsDialog();
public slots: public slots:
void setCaptureFile(capture_file *cf);
signals: signals:
void updateFilter(QString &filter, bool force = false); void updateFilter(QString &filter, bool force = false);
@ -66,7 +66,6 @@ protected slots:
private: private:
Ui::VoipCallsDialog *ui; Ui::VoipCallsDialog *ui;
capture_file *cap_file_;
voip_calls_tapinfo_t tapinfo_; voip_calls_tapinfo_t tapinfo_;
QPushButton *prepare_button_; QPushButton *prepare_button_;
QPushButton *sequence_button_; QPushButton *sequence_button_;
@ -84,6 +83,7 @@ private:
void showSequence(); void showSequence();
private slots: private slots:
void captureFileClosing();
void on_callTreeWidget_itemActivated(QTreeWidgetItem *item, int); void on_callTreeWidget_itemActivated(QTreeWidgetItem *item, int);
void on_callTreeWidget_itemSelectionChanged(); void on_callTreeWidget_itemSelectionChanged();
void on_actionSelect_All_triggered(); void on_actionSelect_All_triggered();

View File

@ -82,7 +82,6 @@ static char *last_open_dir = NULL;
static bool updated_last_open_dir = FALSE; static bool updated_last_open_dir = FALSE;
static QList<recent_item_status *> recent_items_; static QList<recent_item_status *> recent_items_;
QString WiresharkApplication::application_name_ = QString("Wireshark");
QString WiresharkApplication::window_title_separator_ = QString::fromUtf8(" " UTF8_MIDDLE_DOT " "); QString WiresharkApplication::window_title_separator_ = QString::fromUtf8(" " UTF8_MIDDLE_DOT " ");
void void
@ -382,7 +381,7 @@ const QString WiresharkApplication::windowTitleString(QStringList title_parts)
QString ti = tii.next(); QString ti = tii.next();
if (ti.isEmpty()) tii.remove(); if (ti.isEmpty()) tii.remove();
} }
title_parts.prepend(application_name_); title_parts.prepend(applicationName());
return title_parts.join(window_title_separator_); return title_parts.join(window_title_separator_);
} }
@ -478,6 +477,7 @@ WiresharkApplication::WiresharkApplication(int &argc, char **argv) :
initialized_(false) initialized_(false)
{ {
wsApp = this; wsApp = this;
setApplicationName("Wireshark");
Q_INIT_RESOURCE(about); Q_INIT_RESOURCE(about);
Q_INIT_RESOURCE(display_filter); Q_INIT_RESOURCE(display_filter);

View File

@ -93,7 +93,6 @@ public:
bool isInitialized() { return initialized_; } bool isInitialized() { return initialized_; }
const QIcon &normalIcon() const { return normal_icon_; } const QIcon &normalIcon() const { return normal_icon_; }
const QIcon &captureIcon() const { return capture_icon_; } const QIcon &captureIcon() const { return capture_icon_; }
const QString &applicationName() const { return application_name_; }
const QString &windowTitleSeparator() const { return window_title_separator_; } const QString &windowTitleSeparator() const { return window_title_separator_; }
const QString windowTitleString(QStringList title_parts); const QString windowTitleString(QStringList title_parts);
const QString windowTitleString(QString title_part) { return windowTitleString(QStringList() << title_part); } const QString windowTitleString(QString title_part) { return windowTitleString(QStringList() << title_part); }
@ -112,7 +111,6 @@ private:
QSocketNotifier *if_notifier_; QSocketNotifier *if_notifier_;
QIcon normal_icon_; QIcon normal_icon_;
QIcon capture_icon_; QIcon capture_icon_;
static QString application_name_;
static QString window_title_separator_; static QString window_title_separator_;
protected: protected: