aboutsummaryrefslogtreecommitdiffstats
path: root/ui/qt/wireshark_application.h
blob: 43dc0fce83491972420a52d7da748f6bea2d402f (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
/* wireshark_application.h
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef WIRESHARK_APPLICATION_H
#define WIRESHARK_APPLICATION_H

#include <config.h>

#include <glib.h>

#include "register.h"

#include "ui/help_url.h"

#include <QApplication>
#include <QDir>
#include <QFont>
#include <QIcon>
#include <QTimer>
#include <QTranslator>

struct _e_prefs;

class QAction;
class QSocketNotifier;

// Recent items:
// - Read from prefs
// - Add from open file
// - Check current list
// - Signal updated item
// -
typedef struct _recent_item_status {
    QString filename;
    qint64 size;
    bool accessible;
    bool in_thread;
} recent_item_status;

class WiresharkApplication : public QApplication
{
    Q_OBJECT
public:
    explicit WiresharkApplication(int &argc,  char **argv);
    ~WiresharkApplication();

    enum AppSignal {
        CaptureFilterListChanged,
        ColumnsChanged,
        DisplayFilterListChanged,
        FieldsChanged,
        FilterExpressionsChanged,
        LocalInterfacesChanged,
        NameResolutionChanged,
        PacketDissectionChanged,
        PreferencesChanged,
        RecentCapturesChanged,
        RecentPreferencesRead
    };

    enum MainMenuItem {
        FileOpenDialog,
        CaptureOptionsDialog
    };

    void registerUpdate(register_action_e action, const char *message);
    void emitAppSignal(AppSignal signal);
    // Emitting app signals (PacketDissectionChanged in particular) from
    // dialogs on macOS can be problematic. Dialogs should call queueAppSignal
    // instead.
    void queueAppSignal(AppSignal signal) { app_signals_ << signal; }
    // Flush queued app signals. Should be called from the main window after
    // each dialog that calls queueAppSignal closes.
    void flushAppSignals();
    void emitStatCommandSignal(const QString &menu_path, const char *arg, void *userdata);
    void emitTapParameterSignal(const QString cfg_abbr, const QString arg, void *userdata);
    void addDynamicMenuGroupItem(int group, QAction *sg_action);
    void appendDynamicMenuGroupItem(int group, QAction *sg_action);
    void removeDynamicMenuGroupItem(int group, QAction *sg_action);
    QList<QAction *> dynamicMenuGroupItems(int group);
    QList<QAction *> addedMenuGroupItems(int group);
    QList<QAction *> removedMenuGroupItems(int group);
    void clearAddedMenuGroupItems();
    void clearRemovedMenuGroupItems();

    void allSystemsGo();
    void refreshLocalInterfaces();
    struct _e_prefs * readConfigurationFiles(bool reset);
    QList<recent_item_status *> recentItems() const;
    void addRecentItem(const QString filename, qint64 size, bool accessible);
    void removeRecentItem(const QString &filename);
    QDir lastOpenDir();
    void setLastOpenDir(const char *dir_name);
    void setLastOpenDir(QString *dir_str);
    void helpTopicAction(topic_action_e action);
    const QFont monospaceFont() const { return mono_font_; }
    void setMonospaceFont(const char *font_string);
    int monospaceTextSize(const char *str);
    void setConfigurationProfile(const gchar *profile_name, bool write_recent = true);
    void reloadLuaPluginsDelayed();
    bool isInitialized() { return initialized_; }
    void setReloadingLua(bool is_reloading) { is_reloading_lua_ = is_reloading; }
    bool isReloadingLua() { return is_reloading_lua_; }
    const QIcon &normalIcon() const { return normal_icon_; }
    const QIcon &captureIcon() const { return capture_icon_; }
    const QString &windowTitleSeparator() const { return window_title_separator_; }
    const QString windowTitleString(QStringList title_parts);
    const QString windowTitleString(QString title_part) { return windowTitleString(QStringList() << title_part); }
    void applyCustomColorsFromRecent();
#ifdef HAVE_SOFTWARE_UPDATE
    void rejectSoftwareUpdate() { software_update_ok_ = false; }
    bool softwareUpdateCanShutdown();
    void softwareUpdateShutdownRequest();
#endif
    QWidget *mainWindow();

    QTranslator translator;
    QTranslator translatorQt;
    void loadLanguage(const QString language);

    void doTriggerMenuItem(MainMenuItem menuItem);

private:
    bool initialized_;
    bool is_reloading_lua_;
    QFont mono_font_;
    QTimer recent_timer_;
    QTimer addr_resolv_timer_;
    QTimer tap_update_timer_;
    QList<QString> pending_open_files_;
    QSocketNotifier *if_notifier_;
    QIcon normal_icon_;
    QIcon capture_icon_;
    static QString window_title_separator_;
    QList<AppSignal> app_signals_;
    int active_captures_;
#ifdef HAVE_SOFTWARE_UPDATE
    bool software_update_ok_;
#endif

    void storeCustomColorsInRecent();
#ifdef _WIN32
    unsigned int fileVersion(QString file_path);
    void checkForDbar();
#endif

protected:
    bool event(QEvent *event);

signals:
    void appInitialized();
    void localInterfaceListChanged();
    void openCaptureFile(QString cf_path, QString display_filter, unsigned int type);
    void openCaptureOptions();
    void recentPreferencesRead();
    void updateRecentCaptureStatus(const QString &filename, qint64 size, bool accessible);
    void splashUpdate(register_action_e action, const char *message);
    void profileChanging();
    void profileNameChanged(const gchar *profile_name);

    void columnsChanged(); // XXX This recreates the packet list. We might want to rename it accordingly.
    void captureFilterListChanged();
    void displayFilterListChanged();
    void filterExpressionsChanged();
    void packetDissectionChanged();
    void preferencesChanged();
    void addressResolutionChanged();
    void checkDisplayFilter();
    void fieldsChanged();
    void reloadLuaPlugins();
#ifdef HAVE_SOFTWARE_UPDATE
    // Each of these are called from a separate thread.
    void softwareUpdateRequested();
    void softwareUpdateClose();
    void softwareUpdateQuit();
#endif

    void openStatCommandDialog(const QString &menu_path, const char *arg, void *userdata);
    void openTapParameterDialog(const QString cfg_str, const QString arg, void *userdata);

    /* Signals activation and stop of a capture. The value provides the number of active captures */
    void captureActive(int);

public slots:
    void clearRecentCaptures();
    void captureFileReadStarted();
    void captureStarted();
    void captureFinished();
    void updateTaps();

private slots:
    void cleanup();
    void ifChangeEventsAvailable();
    void itemStatusFinished(const QString filename = "", qint64 size = 0, bool accessible = false);
    void refreshRecentCaptures(void);
    void refreshAddressResolution(void);
};

extern WiresharkApplication *wsApp;

/** Global compile time version string */
extern void get_wireshark_qt_compiled_info(GString *str);
extern void get_gui_compiled_info(GString *str);
/** Global runtime version string */
extern void get_wireshark_runtime_info(GString *str);
#endif // WIRESHARK_APPLICATION_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:
 */