summaryrefslogtreecommitdiffstats
path: root/ui/qt/rtp_stream_dialog.h
blob: 4420094ab60b3651ea83fcb5800854d1a488d352 (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
121
122
123
124
125
126
127
128
129
130
131
132
133
/** @file
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#ifndef RTP_STREAM_DIALOG_H
#define RTP_STREAM_DIALOG_H

#include "wireshark_dialog.h"

#include <mutex>

#include "ui/rtp_stream.h"
#include "rtp_player_dialog.h"

#include <QToolButton>
#include <QMenu>

namespace Ui {
class RtpStreamDialog;
}

// Singleton by https://refactoring.guru/design-patterns/singleton/cpp/example#example-1
class RtpStreamDialog : public WiresharkDialog
{
    Q_OBJECT

public:
    /**
     * Returns singleton
     */
    static RtpStreamDialog *openRtpStreamDialog(QWidget &parent, CaptureFile &cf, QObject *packet_list);

    /**
     * Should not be clonnable and assignable
     */
    RtpStreamDialog(RtpStreamDialog &other) = delete;
    void operator=(const RtpStreamDialog &) = delete;

    // Caller must provide ids which are immutable to recap
    void selectRtpStream(QVector<rtpstream_id_t *> stream_ids);
    // Caller must provide ids which are immutable to recap
    void deselectRtpStream(QVector<rtpstream_id_t *> stream_ids);

signals:
    // Tells the packet list to redraw. An alternative might be to add a
    // cf_packet_marked callback to file.[ch] but that's synchronous and
    // might incur too much overhead.
    void packetsMarked();
    void updateFilter(QString filter, bool force = false);
    void goToPacket(int packet_num);
    void rtpPlayerDialogReplaceRtpStreams(QVector<rtpstream_id_t *> stream_ids);
    void rtpPlayerDialogAddRtpStreams(QVector<rtpstream_id_t *> stream_ids);
    void rtpPlayerDialogRemoveRtpStreams(QVector<rtpstream_id_t *> stream_ids);
    void rtpAnalysisDialogReplaceRtpStreams(QVector<rtpstream_id_t *> stream_infos);
    void rtpAnalysisDialogAddRtpStreams(QVector<rtpstream_id_t *> stream_infos);
    void rtpAnalysisDialogRemoveRtpStreams(QVector<rtpstream_id_t *> stream_infos);

public slots:
    void displayFilterSuccess(bool success);
    void rtpPlayerReplace();
    void rtpPlayerAdd();
    void rtpPlayerRemove();
    void rtpAnalysisReplace();
    void rtpAnalysisAdd();
    void rtpAnalysisRemove();

protected:
    explicit RtpStreamDialog(QWidget &parent, CaptureFile &cf);
    ~RtpStreamDialog();

    bool eventFilter(QObject *obj, QEvent *event);
    void captureFileClosing();
    void captureFileClosed();

private:
    static RtpStreamDialog *pinstance_;
    static std::mutex mutex_;

    Ui::RtpStreamDialog *ui;
    rtpstream_tapinfo_t tapinfo_;
    QToolButton *find_reverse_button_;
    QPushButton *prepare_button_;
    QPushButton *export_button_;
    QPushButton *copy_button_;
    QToolButton *analyze_button_;
    QToolButton *player_button_;
    QMenu ctx_menu_;
    bool need_redraw_;
    QList<rtpstream_id_t> last_selected_;

    static void tapReset(rtpstream_tapinfo_t *tapinfo);
    static void tapDraw(rtpstream_tapinfo_t *tapinfo);
    static void tapMarkPacket(rtpstream_tapinfo_t *tapinfo, frame_data *fd);

    void updateStreams();
    void updateWidgets();
    void showPlayer();

    void setRtpStreamSelection(rtpstream_id_t *id, bool state);

    QList<QVariant> streamRowData(int row) const;
    void freeLastSelected();
    void invertSelection();
    QVector<rtpstream_id_t *>getSelectedRtpIds();

private slots:
    void showStreamMenu(QPoint pos);
    void on_actionCopyAsCsv_triggered();
    void on_actionCopyAsYaml_triggered();
    void on_actionFindReverseNormal_triggered();
    void on_actionFindReversePair_triggered();
    void on_actionFindReverseSingle_triggered();
    void on_actionGoToSetup_triggered();
    void on_actionMarkPackets_triggered();
    void on_actionPrepareFilter_triggered();
    void on_streamTreeWidget_itemSelectionChanged();
    void on_buttonBox_helpRequested();
    void on_actionExportAsRtpDump_triggered();
    void captureEvent(CaptureEvent e);
    void displayFilterCheckBoxToggled(bool checked);
    void on_todCheckBox_toggled(bool checked);
    void on_actionSelectAll_triggered();
    void on_actionSelectInvert_triggered();
    void on_actionSelectNone_triggered();
    void on_actionAnalyze_triggered();
};

#endif // RTP_STREAM_DIALOG_H