aboutsummaryrefslogtreecommitdiffstats
path: root/ui/qt/tap_parameter_dialog.h
blob: 71268f82cb4d56fb0977264284d7e15d0b5e769c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* tap_parameter_dialog.h
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * SPDX-License-Identifier: GPL-2.0+*/

#ifndef TAP_PARAMETER_DIALOG_H
#define TAP_PARAMETER_DIALOG_H

/*
 * @file Base class for statistics and analysis dialogs.
 * Provides convenience classes for command-line tap parameters ("-z ...")
 * and general tapping.
 */

#include "config.h"

#include <glib.h>

#include <epan/stat_groups.h>
#include <epan/stat_tap_ui.h>

#include <QMenu>

#include "filter_action.h"
#include "wireshark_dialog.h"

class QHBoxLayout;
class QLineEdit;
class QTreeWidget;
class QTreeWidgetItem;
class QVBoxLayout;

namespace Ui {
class TapParameterDialog;
}

class TapParameterDialog;
typedef TapParameterDialog* (*tpdCreator)(QWidget &parent, const QString cfg_str, const QString arg, CaptureFile &cf);

class TapParameterDialog : public WiresharkDialog
{
    Q_OBJECT

public:
    explicit TapParameterDialog(QWidget &parent, CaptureFile &cf, int help_topic = 0);
    ~TapParameterDialog();

    static const QString &actionName() { return action_name_; }
    static void registerDialog(const QString title, const char *cfg_abbr, register_stat_group_t group, stat_tap_init_cb tap_init_cb, tpdCreator creator);

    static TapParameterDialog *showTapParameterStatistics(QWidget &parent, CaptureFile &cf, const QString cfg_str, const QString arg, void *);
    // Needed by static member functions in subclasses. Should we just make
    // "ui" available instead?
    QTreeWidget *statsTreeWidget();
    QLineEdit *displayFilterLineEdit();
    QPushButton *applyFilterButton();
    QVBoxLayout *verticalLayout();
    QHBoxLayout *filterLayout();

    void drawTreeItems();

signals:
    void filterAction(QString filter, FilterAction::Action action, FilterAction::ActionType type);
    void updateFilter(QString filter);

public slots:

protected:
    void contextMenuEvent(QContextMenuEvent *event);
    void addFilterActions();
    QString displayFilter();
    void setDisplayFilter(const QString &filter);
    void setHint(const QString &hint);
    // Retap packets on first display. RPC stats need to disable this.
    void setRetapOnShow(bool retap);

protected slots:
    void filterActionTriggered();
    void updateWidgets();

private:
    Ui::TapParameterDialog *ui;
    QMenu ctx_menu_;
    QList<QAction *> filter_actions_;
    int help_topic_;
    static const QString action_name_;
    QTimer *show_timer_;

    virtual const QString filterExpression() { return QString(); }
    QString itemDataToPlain(QVariant var, int width = 0);
    virtual QList<QVariant> treeItemData(QTreeWidgetItem *) const;
    virtual QByteArray getTreeAsString(st_format_type format);

private slots:
    // Called by the constructor. The subclass should tap packets here.
    virtual void fillTree() = 0;

    void on_applyFilterButton_clicked();
    void on_actionCopyToClipboard_triggered();
    void on_actionSaveAs_triggered();
    void on_buttonBox_helpRequested();
};

#endif // TAP_PARAMETER_DIALOG_H

/*
 * Editor modelines
 *
 * Local Variables:
 * c-basic-offset: 4
 * tab-width: 8
 * indent-tabs-mode: nil
 * End:
 *
 * ex: set shiftwidth=4 tabstop=8 expandtab:
 * :indentSize=4:tabSize=8:noTabs=true:
 */