Wireshark  4.3.0
The Wireshark network protocol analyzer
logray_main_window.h
Go to the documentation of this file.
1 
10 #ifndef LOGRAY_MAIN_WINDOW_H
11 #define LOGRAY_MAIN_WINDOW_H
12 
39 #include <stdio.h>
40 
41 #include <config.h>
42 
43 #include "file.h"
44 
45 #include "ui/ws_ui_util.h"
46 #include "ui/iface_toolbar.h"
47 
48 #include <epan/plugin_if.h>
49 #include <epan/timestamp.h>
50 
51 #ifdef HAVE_LIBPCAP
52 #include "capture_opts.h"
53 #endif
55 
56 #include <QMainWindow>
57 #include <QPointer>
58 #include <QTextCodec>
59 
60 #ifdef _WIN32
61 # include <QTimer>
62 #else
63 # include <QSocketNotifier>
64 #endif
65 
66 #include "capture_file.h"
67 #include "capture_file_dialog.h"
71 #include "main_window.h"
72 
73 class AccordionFrame;
74 class ByteViewTab;
75 class CaptureOptionsDialog;
76 class PrintDialog;
77 class FileSetDialog;
78 class FilterDialog;
79 class FunnelStatistics;
80 class WelcomePage;
82 class PacketList;
83 class ProtoTree;
86 
87 class QAction;
88 class QActionGroup;
89 
90 namespace Ui {
91  class LograyMainWindow;
92 }
93 
94 Q_DECLARE_METATYPE(ts_type)
95 Q_DECLARE_METATYPE(ts_precision)
96 
98 {
99  Q_OBJECT
100 
101 public:
102  explicit LograyMainWindow(QWidget *parent = nullptr);
103  ~LograyMainWindow();
104 
105 #ifdef HAVE_LIBPCAP
106  capture_session *captureSession() { return &cap_session_; }
107  info_data_t *captureInfoData() { return &info_data_; }
108 #endif
109 
110  virtual QMenu *createPopupMenu();
111 
112  CaptureFile *captureFile() { return &capture_file_; }
113 
114  void removeAdditionalToolbar(QString toolbarName);
115 
116  void addInterfaceToolbar(const iface_toolbar *toolbar_entry);
117  void removeInterfaceToolbar(const char *menu_title);
118 
119  QString getMwFileName();
120  void setMwFileName(QString fileName);
121 
122 protected:
123  virtual bool eventFilter(QObject *obj, QEvent *event);
124  virtual bool event(QEvent *event);
125  virtual void keyPressEvent(QKeyEvent *event);
126  virtual void closeEvent(QCloseEvent *event);
127  virtual void dragEnterEvent(QDragEnterEvent *event);
128  virtual void dropEvent(QDropEvent *event);
129  virtual void changeEvent(QEvent* event);
130 
131 private:
132  // XXX Move to FilterUtils
133  enum MatchSelected {
134  MatchSelectedReplace,
135  MatchSelectedAnd,
136  MatchSelectedOr,
137  MatchSelectedNot,
138  MatchSelectedAndNot,
139  MatchSelectedOrNot
140  };
141 
142  enum FileCloseContext {
143  Default,
144  Quit,
145  Restart,
146  Reload,
147  Update
148  };
149 
150  Ui::LograyMainWindow *main_ui_;
151  CaptureFile capture_file_;
152  QFont mono_font_;
153  QMap<QString, QTextCodec *> text_codec_map_;
154  QWidget *previous_focus_;
155  FileSetDialog *file_set_dialog_;
156  QActionGroup *show_hide_actions_;
157  QActionGroup *time_display_actions_;
158  QActionGroup *time_precision_actions_;
159  FunnelStatistics *funnel_statistics_;
160  QList<QPair<QAction *, bool> > freeze_actions_;
161  QPointer<QWidget> freeze_focus_;
162  QMap<QAction *, ts_type> td_actions;
163  QMap<QAction *, ts_precision> tp_actions;
164  bool was_maximized_;
165 
166  /* the following values are maintained so that the capture file name and status
167  is available when there is no cf structure available */
168  QString mwFileName_;
169 
170  bool capture_stopping_;
171  bool capture_filter_valid_;
172  bool use_capturing_title_;
173 #ifdef HAVE_LIBPCAP
174  capture_session cap_session_;
175  CaptureOptionsDialog *capture_options_dialog_;
176  info_data_t info_data_;
177 #endif
178 
179 #if defined(Q_OS_MAC)
180  QMenu *dock_menu_;
181 #endif
182 
183 #ifdef HAVE_SOFTWARE_UPDATE
184  QAction *update_action_;
185 #endif
186 
187  QPoint dragStartPosition;
188 
189  void freeze();
190  void thaw();
191 
192  void mergeCaptureFile();
193  void importCaptureFile();
194  bool saveCaptureFile(capture_file *cf, bool dont_reopen);
195  bool saveAsCaptureFile(capture_file *cf, bool must_support_comments = false, bool dont_reopen = false);
196  void exportSelectedPackets();
197  void exportDissections(export_type_e export_type);
198 
199 #ifdef Q_OS_WIN
200  void fileAddExtension(QString &file_name, int file_type, wtap_compression_type compression_type);
201 #endif // Q_OS_WIN
202  bool testCaptureFileClose(QString before_what, FileCloseContext context = Default);
203  void captureStop();
204 
205  void findTextCodecs();
206 
207  void initMainToolbarIcons();
208  void initShowHideMainWidgets();
209  void initTimeDisplayFormatMenu();
210  void initTimePrecisionFormatMenu();
211  void initFreezeActions();
212 
213  void setTitlebarForCaptureInProgress();
214  void setMenusForCaptureFile(bool force_disable = false);
215  void setMenusForCaptureInProgress(bool capture_in_progress = false);
216  void setMenusForCaptureStopping();
217  void setForCapturedPackets(bool have_captured_packets);
218  void setMenusForFileSet(bool enable_list_files);
219  void setWindowIcon(const QIcon &icon);
220  QString replaceWindowTitleVariables(QString title);
221 
222  void externalMenuHelper(ext_menu_t * menu, QMenu * subMenu, int depth);
223 
224  void setForCaptureInProgress(bool capture_in_progress = false, bool handle_toolbars = false, GArray *ifaces = NULL);
225  QMenu* findOrAddMenu(QMenu *parent_menu, QString& menu_text);
226 
227  void captureFileReadStarted(const QString &action);
228 
229  void addMenuActions(QList<QAction *> &actions, int menu_group);
230  void removeMenuActions(QList<QAction *> &actions, int menu_group);
231  void goToConversationFrame(bool go_next);
232  void colorizeWithFilter(QByteArray filter, int color_number = -1);
233 
234 signals:
235  void setDissectedCaptureFile(capture_file *cf);
236  void closePacketDialogs();
237  void reloadFields();
238  void packetInfoChanged(struct _packet_info *pinfo);
239  void fieldFilterChanged(const QByteArray field_filter);
240 
241  void fieldHighlight(FieldInformation *);
242 
243  void captureActive(int);
244 
245 #ifdef HAVE_LIBPCAP
246  void showExtcapOptions(QString &device_name, bool startCaptureOnClose);
247 #endif
248 
249 public slots:
250  // in main_window_slots.cpp
259  // XXX We might want to return a cf_read_status_t or a CaptureFile.
260  bool openCaptureFile(QString cf_path, QString display_filter, unsigned int type, bool is_tempfile = false);
261  bool openCaptureFile(QString cf_path = QString(), QString display_filter = QString()) { return openCaptureFile(cf_path, display_filter, WTAP_TYPE_AUTO); }
262  void filterPackets(QString new_filter = QString(), bool force = false);
263  void updateForUnsavedChanges();
264  void layoutToolbars();
265  void updatePreferenceActions();
266  void updateRecentActions();
267 
268  void setTitlebarForCaptureFile();
269  void setWSWindowTitle(QString title = QString());
270 
271  void showCaptureOptionsDialog();
272 
273 #ifdef HAVE_LIBPCAP
274  void captureCapturePrepared(capture_session *);
275  void captureCaptureUpdateStarted(capture_session *);
276  void captureCaptureUpdateFinished(capture_session *);
277  void captureCaptureFixedFinished(capture_session *cap_session);
278  void captureCaptureFailed(capture_session *);
279 #endif
280 
281  void captureFileOpened();
282  void captureFileReadFinished();
283  void captureFileClosing();
284  void captureFileClosed();
285 
286 private slots:
287 
288  void captureEventHandler(CaptureEvent ev);
289 
290  // Manually connected slots (no "on_<object>_<signal>").
291 
292  void initViewColorizeMenu();
293  void initConversationMenus();
294  static bool addFollowStreamMenuItem(const void *key, void *value, void *userdata);
295  void initFollowStreamMenus();
296 
297  // in main_window_slots.cpp
303  void startCapture(QStringList);
304  void startCapture();
305  void pushLiveCaptureInProgress();
306  void popLiveCaptureInProgress();
307  void stopCapture();
308 
309  void loadWindowGeometry();
310  void saveWindowGeometry();
311  void mainStackChanged(int);
312  void updateRecentCaptures();
313  void recentActionTriggered();
314  void addPacketComment();
315  void editPacketComment();
316  void deletePacketComment();
317  void deleteCommentsFromPackets();
318  QString commentToMenuText(QString text, int max_len = 40);
319  void setEditCommentsMenu();
320  void setMenusForSelectedPacket();
321  void setMenusForSelectedTreeRow(FieldInformation *fi = NULL);
322  void interfaceSelectionChanged();
323  void captureFilterSyntaxChanged(bool valid);
324  void redissectPackets();
325  void checkDisplayFilter();
326  void fieldsChanged();
327  void reloadLuaPlugins();
328  void showAccordionFrame(AccordionFrame *show_frame, bool toggle = false);
329  void showColumnEditor(int column);
330  void showPreferenceEditor(); // module_t *, pref *
331  void addStatsPluginsToMenu();
332  void addDynamicMenus();
333  void reloadDynamicMenus();
334  void addPluginIFStructures();
335  QMenu * searchSubMenu(QString objectName);
336  void activatePluginIFToolbar(bool);
337  void updateTitlebar();
338 
339  void startInterfaceCapture(bool valid, const QString capture_filter);
340 
341  void applyGlobalCommandLineOptions();
342  void setFeaturesEnabled(bool enabled = true);
343 
344  void on_actionNewDisplayFilterExpression_triggered();
345  void onFilterSelected(QString, bool);
346  void onFilterPreferences();
347  void onFilterEdit(int uatIndex);
348 
349  // Handle FilterAction signals
350  void queuedFilterAction(QString filter, FilterAction::Action action, FilterAction::ActionType type);
351 
357  void openStatCommandDialog(const QString &menu_path, const char *arg, void *userdata);
358 
364  void openTapParameterDialog(const QString cfg_str, const QString arg, void *userdata);
365  void openTapParameterDialog();
366 
367 #if defined(HAVE_SOFTWARE_UPDATE) && defined(Q_OS_WIN)
368  void softwareUpdateRequested();
369 #endif
370 
371  // Automatically connected slots ("on_<object>_<signal>").
372  //
373  // The slots below follow the naming conventaion described in
374  // https://doc.qt.io/archives/qt-4.8/qmetaobject.html#connectSlotsByName
375  // and are automatically connected at initialization time via
376  // main_ui_->setupUi, which in turn calls connectSlotsByName.
377  //
378  // If you're manually connecting a signal to a slot, don't prefix its name
379  // with "on_". Otherwise you'll get runtime warnings.
380 
381  // We might want move these to main_window_actions.cpp similar to
382  // gtk/main_menubar.c
383 
384  void connectFileMenuActions();
385  void printFile();
386 
387  void connectEditMenuActions();
388  void copySelectedItems(LograyMainWindow::CopySelected selection_type);
389  void findPacket();
390  void editTimeShift();
391  void editConfigurationProfiles();
392  void editTimeShiftFinished(int);
393  void addPacketCommentFinished(PacketCommentDialog* pc_dialog, int result);
394  void editPacketCommentFinished(PacketCommentDialog* pc_dialog, int result, unsigned nComment);
395  void deleteAllPacketComments();
396  void deleteAllPacketCommentsFinished(int result);
397  void showPreferencesDialog(QString module_name);
398 
399  void connectViewMenuActions();
400  void showHideMainWidgets(QAction *action);
401  void setTimestampFormat(QAction *action);
402  void setTimestampPrecision(QAction *action);
403  void setTimeDisplaySecondsWithHoursAndMinutes(bool checked);
404  void editResolvedName();
405  void setNameResolution();
406  void zoomText();
407  void showColoringRulesDialog();
408  void colorizeConversation(bool create_rule = false);
409  void colorizeActionTriggered();
410  void openPacketDialog(bool from_reference = false);
411  void reloadCaptureFileAsFormatOrCapture();
412  void reloadCaptureFile();
413 
414  void connectGoMenuActions();
415 
416  void setPreviousFocus();
417  void resetPreviousFocus();
418 
419  void connectCaptureMenuActions();
420  void startCaptureTriggered();
421 
422  void connectAnalyzeMenuActions();
423 
424  void matchFieldFilter(FilterAction::Action action, FilterAction::ActionType filter_type);
425  void applyFieldAsColumn();
426 
427  void filterMenuAboutToShow();
428 
429  void applyConversationFilter();
430 
431  void openFollowStreamDialog(int proto_id, unsigned stream_num, unsigned sub_stream_num, bool use_stream_index = true);
432  void openFollowStreamDialog(int proto_id);
433 
434  void statCommandExpertInfo(const char *, void *);
435 
436  void connectToolsMenuActions();
437 
438  void connectHelpMenuActions();
439 
440 #ifdef HAVE_SOFTWARE_UPDATE
441  void checkForUpdates();
442 #endif
443 
444  void goToCancelClicked();
445  void goToGoClicked();
446  void goToLineEditReturnPressed();
447 
448  void connectStatisticsMenuActions();
449 
450  void showResolvedAddressesDialog();
451  void showConversationsDialog();
452  void showEndpointsDialog();
453 
454  void openStatisticsTreeDialog(const char *abbr);
455  void statCommandIOGraph(const char *, void *);
456  void showIOGraphDialog(io_graph_item_unit_t, QString);
457 
458  void externalMenuItemTriggered();
459 
460  void on_actionContextWikiProtocolPage_triggered();
461  void on_actionContextFilterFieldReference_triggered();
462 
463  void extcap_options_finished(int result);
464  void showExtcapOptionsDialog(QString & device_name, bool startCaptureOnClose);
465 
466  friend class MainApplication;
467 };
468 
469 #endif // LOGRAY_MAIN_WINDOW_H
Definition: accordion_frame.h:18
Definition: byte_view_tab.h:29
Definition: capture_event.h:21
Definition: capture_file.h:21
Definition: field_information.h:23
Definition: file_set_dialog.h:29
Definition: filter_dialog.h:28
Definition: filter_expression_toolbar.h:18
Definition: funnel_statistics.h:32
Definition: logray_main_window.h:98
bool openCaptureFile(QString cf_path, QString display_filter, unsigned int type, bool is_tempfile=false)
Definition: logray_main_window_slots.cpp:157
Definition: main_application.h:49
Definition: main_window.h:45
Definition: packet_comment_dialog.h:20
Definition: packet_list.h:40
Definition: print_dialog.h:27
Definition: proto_tree.h:29
Definition: welcome_page.h:27
Definition: wireshark_application.h:16
Definition: cfile.h:67
Definition: capture_session.h:137
Definition: plugin_if.h:55
Definition: iface_toolbar.h:60
Definition: capture_info.h:40
Definition: packet_info.h:44