1 /* main_window_slots.cpp
3 * Wireshark - Network traffic analyzer
4 * By Gerald Combs <gerald@wireshark.org>
5 * Copyright 1998 Gerald Combs
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 // Qt 5.5.0 + Visual C++ 2013
27 #pragma warning(disable:4996)
30 #include "main_window.h"
33 * The generated Ui_MainWindow::setupUi() can grow larger than our configured limit,
34 * so turn off -Wframe-larger-than= for ui_main_window.h.
36 DIAG_OFF(frame-larger-than=)
37 #include <ui_main_window.h>
38 DIAG_ON(frame-larger-than=)
44 #include "ui/dissect_opts.h"
47 #include "ui/capture.h"
50 #include "ui/commandline.h"
52 #include "epan/color_filters.h"
53 #include "epan/export_object.h"
55 #include "wsutil/file_util.h"
56 #include "wsutil/filesystem.h"
58 #include "epan/addr_resolv.h"
59 #include "epan/column.h"
60 #include "epan/dfilter/dfilter-macro.h"
61 #include "epan/dissector_filters.h"
62 #include "epan/epan_dissect.h"
63 #include "epan/filter_expressions.h"
64 #include "epan/prefs.h"
65 #include "epan/plugin_if.h"
67 #include "epan/value_string.h"
70 #include <epan/wslua/init_wslua.h>
73 #include "ui/alert_box.h"
75 #include "ui/capture_ui_utils.h"
78 #include "ui/capture_globals.h"
79 #include "ui/help_url.h"
80 #include "ui/main_statusbar.h"
81 #include "ui/preference_utils.h"
82 #include "ui/recent.h"
83 #include "ui/recent_utils.h"
84 #include "ui/ssl_key_export.h"
85 #include "ui/ui_util.h"
86 #include "ui/all_files_wildcard.h"
87 #include "ui/qt/simple_dialog.h"
89 #include <ui/qt/variant_pointer.h>
91 #ifdef HAVE_SOFTWARE_UPDATE
92 #include "ui/software_update.h"
95 #include "about_dialog.h"
96 #include "bluetooth_att_server_attributes_dialog.h"
97 #include "bluetooth_devices_dialog.h"
98 #include "bluetooth_hci_summary_dialog.h"
99 #include "capture_file_dialog.h"
100 #include "capture_file_properties_dialog.h"
102 #include "capture_interfaces_dialog.h"
104 #include "color_utils.h"
105 #include "coloring_rules_dialog.h"
106 #include "conversation_dialog.h"
107 #include "conversation_colorize_action.h"
108 #include "conversation_hash_tables_dialog.h"
109 #include "enabled_protocols_dialog.h"
110 #include "decode_as_dialog.h"
111 #include "display_filter_edit.h"
112 #include "display_filter_expression_dialog.h"
113 #include "dissector_tables_dialog.h"
114 #include "endpoint_dialog.h"
115 #include "expert_info_dialog.h"
116 #include "export_object_action.h"
117 #include "export_object_dialog.h"
118 #include "export_pdu_dialog.h"
120 #include "extcap_options_dialog.h"
122 #include "file_set_dialog.h"
123 #include "filter_action.h"
124 #include "filter_dialog.h"
125 #include "firewall_rules_dialog.h"
126 #include "funnel_statistics.h"
127 #include "gsm_map_summary_dialog.h"
128 #include "iax2_analysis_dialog.h"
129 #include "interface_toolbar.h"
130 #include "io_graph_dialog.h"
131 #include <additional_toolbar.h>
132 #include "lbm_stream_dialog.h"
133 #include "lbm_uimflow_dialog.h"
134 #include "lbm_lbtrm_transport_dialog.h"
135 #include "lbm_lbtru_transport_dialog.h"
136 #include "lte_mac_statistics_dialog.h"
137 #include "lte_rlc_statistics_dialog.h"
138 #include "lte_rlc_graph_dialog.h"
139 #include "mtp3_summary_dialog.h"
140 #include "multicast_statistics_dialog.h"
141 #include "packet_comment_dialog.h"
142 #include "packet_dialog.h"
143 #include "packet_list.h"
144 #include "preferences_dialog.h"
145 #include "print_dialog.h"
146 #include "profile_dialog.h"
147 #include "protocol_hierarchy_dialog.h"
148 #include "qt_ui_utils.h"
149 #include "resolved_addresses_dialog.h"
150 #include "rpc_service_response_time_dialog.h"
151 #include "rtp_stream_dialog.h"
152 #include "rtp_analysis_dialog.h"
153 #include "sctp_all_assocs_dialog.h"
154 #include "sctp_assoc_analyse_dialog.h"
155 #include "sctp_graph_dialog.h"
156 #include "sequence_dialog.h"
157 #include "show_packet_bytes_dialog.h"
158 #include "stats_tree_dialog.h"
159 #include "stock_icon.h"
160 #include "supported_protocols_dialog.h"
161 #include "tap_parameter_dialog.h"
162 #include "tcp_stream_dialog.h"
163 #include "time_shift_dialog.h"
164 #include "uat_dialog.h"
165 #include "voip_calls_dialog.h"
166 #include "wireshark_application.h"
167 #include "wlan_statistics_dialog.h"
168 #include "wireless_timeline.h"
170 #include <QClipboard>
172 #include <QMessageBox>
173 #include <QMetaObject>
175 #include <QDesktopServices>
178 // XXX You must uncomment QT_WINEXTRAS_LIB lines in CMakeList.txt and
180 // #if defined(QT_WINEXTRAS_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
181 // #include <QWinJumpList>
182 // #include <QWinJumpListCategory>
183 // #include <QWinJumpListItem>
190 static const char *dfe_property_ = "display filter expression"; //TODO : Fix Translate
192 bool MainWindow::openCaptureFile(QString cf_path, QString read_filter, unsigned int type, gboolean is_tempfile)
194 QString file_name = "";
195 dfilter_t *rfcode = NULL;
201 // was a file name given as function parameter?
202 name_param = !cf_path.isEmpty();
206 if (cf_path.isEmpty()) {
207 CaptureFileDialog open_dlg(this, capture_file_.capFile(), read_filter);
209 if (open_dlg.open(file_name, type)) {
217 QString before_what(tr(" before opening another file"));
218 if (!testCaptureFileClose(before_what)) {
223 if (dfilter_compile(read_filter.toUtf8().constData(), &rfcode, &err_msg)) {
224 cf_set_rfcode(CaptureFile::globalCapFile(), rfcode);
226 /* Not valid. Tell the user, and go back and run the file
227 selection box again once they dismiss the alert. */
228 //bad_dfilter_alert_box(top_level, read_filter->str);
229 QMessageBox::warning(this, tr("Invalid Display Filter"),
230 QString("The filter expression ") +
232 QString(" isn't a valid display filter. (") +
233 err_msg + QString(")."),
237 // go back to the selection dialogue only if the file
238 // was selected from this dialogue
244 /* Try to open the capture file. This closes the current file if it succeeds. */
245 CaptureFile::globalCapFile()->window = this;
246 if (cf_open(CaptureFile::globalCapFile(), cf_path.toUtf8().constData(), type, is_tempfile, &err) != CF_OK) {
247 /* We couldn't open it; don't dismiss the open dialog box,
248 just leave it around so that the user can, after they
249 dismiss the alert box popped up for the open error,
251 CaptureFile::globalCapFile()->window = NULL;
253 dfilter_free(rfcode);
258 switch (cf_read(CaptureFile::globalCapFile(), FALSE)) {
262 /* Just because we got an error, that doesn't mean we were unable
263 to read any of the file; we handle what we could get from the
267 case CF_READ_ABORTED:
268 /* The user bailed out of re-reading the capture file; the
269 capture file has been closed - just free the capture file name
270 string and return (without changing the last containing
272 capture_file_.setCapFile(NULL);
278 // get_dirname overwrites its path.
279 wsApp->setLastOpenDir(get_dirname(cf_path.toUtf8().data()));
281 main_ui_->statusBar->showExpert();
285 if (global_commandline_info.quit_after_cap)
291 void MainWindow::filterPackets(QString new_filter, bool force)
293 cf_status_t cf_status;
295 cf_status = cf_filter_packets(CaptureFile::globalCapFile(), new_filter.toUtf8().data(), force);
297 if (cf_status == CF_OK) {
298 emit displayFilterSuccess(true);
299 if (new_filter.length() > 0) {
300 int index = df_combo_box_->findText(new_filter);
302 df_combo_box_->insertItem(0, new_filter);
303 df_combo_box_->setCurrentIndex(0);
305 df_combo_box_->setCurrentIndex(index);
308 df_combo_box_->lineEdit()->clear();
311 emit displayFilterSuccess(false);
314 packet_list_->resetColumns();
318 // A new layout should be applied when it differs from the old layout AND
319 // at the following times:
321 // - When the preferences change
322 // - When the profile changes
323 void MainWindow::layoutPanes()
325 QVector<unsigned> new_layout = QVector<unsigned>() << prefs.gui_layout_type
326 << prefs.gui_layout_content_1
327 << prefs.gui_layout_content_2
328 << prefs.gui_layout_content_3
329 << recent.packet_list_show
330 << recent.tree_view_show
331 << recent.byte_view_show;
333 if (cur_layout_ == new_layout) return;
335 QSplitter *parents[3];
337 // Reparent all widgets and add them back in the proper order below.
338 // This hides each widget as well.
339 packet_list_->freeze(); // Clears tree and byte view tabs.
340 packet_list_->setParent(main_ui_->mainStack);
341 proto_tree_->setParent(main_ui_->mainStack);
342 byte_view_tab_->setParent(main_ui_->mainStack);
343 empty_pane_.setParent(main_ui_->mainStack);
344 extra_split_.setParent(main_ui_->mainStack);
346 // XXX We should try to preserve geometries if we can, e.g. by
347 // checking to see if the layout type is the same.
348 switch(prefs.gui_layout_type) {
351 extra_split_.setOrientation(Qt::Horizontal);
354 master_split_.setOrientation(Qt::Vertical);
359 extra_split_.setOrientation(Qt::Vertical);
362 master_split_.setOrientation(Qt::Horizontal);
366 g_assert_not_reached();
369 switch(prefs.gui_layout_type) {
372 parents[0] = &master_split_;
373 parents[1] = &master_split_;
374 parents[2] = &master_split_;
378 parents[0] = &master_split_;
379 parents[1] = &extra_split_;
380 parents[2] = &extra_split_;
384 parents[0] = &extra_split_;
385 parents[1] = &extra_split_;
386 parents[2] = &master_split_;
389 g_assert_not_reached();
392 if (parents[0] == &extra_split_) {
393 master_split_.addWidget(&extra_split_);
396 parents[0]->addWidget(getLayoutWidget(prefs.gui_layout_content_1));
398 if (parents[2] == &extra_split_) {
399 master_split_.addWidget(&extra_split_);
402 parents[1]->addWidget(getLayoutWidget(prefs.gui_layout_content_2));
403 parents[2]->addWidget(getLayoutWidget(prefs.gui_layout_content_3));
405 const QList<QWidget *> ms_children = master_split_.findChildren<QWidget *>();
407 extra_split_.setVisible(ms_children.contains(&extra_split_));
408 packet_list_->setVisible(ms_children.contains(packet_list_) && recent.packet_list_show);
409 proto_tree_->setVisible(ms_children.contains(proto_tree_) && recent.tree_view_show);
410 byte_view_tab_->setVisible(ms_children.contains(byte_view_tab_) && recent.byte_view_show);
412 packet_list_->thaw(true);
413 cur_layout_ = new_layout;
416 // The recent layout geometry should be applied after the layout has been
417 // applied AND at the following times:
419 // - When the profile changes
420 void MainWindow::applyRecentPaneGeometry()
422 // XXX This shrinks slightly each time the application is run. For some
423 // reason the master_split_ geometry is two pixels shorter when
424 // saveWindowGeometry is invoked.
426 // This is also an awful lot of trouble to go through to reuse the GTK+
427 // pane settings. We might want to add gui.geometry_main_master_sizes
428 // and gui.geometry_main_extra_sizes and save QSplitter::saveState in
431 // Force a geometry recalculation
432 QWidget *cur_w = main_ui_->mainStack->currentWidget();
433 main_ui_->mainStack->setCurrentWidget(&master_split_);
434 QRect geom = main_ui_->mainStack->geometry();
435 QList<int> master_sizes = master_split_.sizes();
436 QList<int> extra_sizes = extra_split_.sizes();
437 main_ui_->mainStack->setCurrentWidget(cur_w);
439 int master_last_size = master_split_.orientation() == Qt::Vertical ? geom.height() : geom.width();
440 master_last_size -= master_split_.handleWidth() * (master_sizes.length() - 1);
442 int extra_last_size = extra_split_.orientation() == Qt::Vertical ? geom.height() : geom.width();
443 extra_last_size -= extra_split_.handleWidth();
445 if (recent.gui_geometry_main_upper_pane > 0) {
446 master_sizes[0] = recent.gui_geometry_main_upper_pane;
447 master_last_size -= recent.gui_geometry_main_upper_pane;
449 master_sizes[0] = master_last_size / master_sizes.length();
450 master_last_size -= master_last_size / master_sizes.length();
453 if (recent.gui_geometry_main_lower_pane > 0) {
454 if (master_sizes.length() > 2) {
455 master_sizes[1] = recent.gui_geometry_main_lower_pane;
456 master_last_size -= recent.gui_geometry_main_lower_pane;
457 } else if (extra_sizes.length() > 0) {
458 extra_sizes[0] = recent.gui_geometry_main_lower_pane;
459 extra_last_size -= recent.gui_geometry_main_lower_pane;
460 extra_sizes.last() = extra_last_size;
463 if (master_sizes.length() > 2) {
464 master_sizes[1] = master_last_size / 2;
465 master_last_size -= master_last_size / 2;
467 extra_sizes[0] = extra_last_size / 2;
468 extra_last_size -= extra_last_size / 2;
469 extra_sizes.last() = extra_last_size;
473 master_sizes.last() = master_last_size;
475 master_split_.setSizes(master_sizes);
476 extra_split_.setSizes(extra_sizes);
479 void MainWindow::layoutToolbars()
481 Qt::ToolButtonStyle tbstyle = Qt::ToolButtonIconOnly;
482 switch (prefs.gui_toolbar_main_style) {
484 tbstyle = Qt::ToolButtonTextOnly;
487 tbstyle = Qt::ToolButtonTextUnderIcon;
491 main_ui_->mainToolBar->setToolButtonStyle(tbstyle);
493 main_ui_->mainToolBar->setVisible(recent.main_toolbar_show);
494 main_ui_->displayFilterToolBar->setVisible(recent.filter_toolbar_show);
495 main_ui_->wirelessToolBar->setVisible(recent.wireless_toolbar_show);
496 main_ui_->statusBar->setVisible(recent.statusbar_show);
498 foreach (QAction *action, main_ui_->menuInterfaceToolbars->actions()) {
499 QToolBar *toolbar = action->data().value<QToolBar *>();
500 if (g_list_find_custom(recent.interface_toolbars, action->text().toUtf8(), (GCompareFunc) strcmp)) {
501 toolbar->setVisible(true);
503 toolbar->setVisible(false);
507 QList<QToolBar *> toolbars = findChildren<QToolBar *>();
508 foreach (QToolBar *bar, toolbars) {
509 AdditionalToolBar *iftoolbar = dynamic_cast<AdditionalToolBar *>(bar);
511 bool visible = false;
512 if (g_list_find_custom(recent.gui_additional_toolbars, iftoolbar->menuName().toUtf8().constData(), (GCompareFunc) strcmp))
515 iftoolbar->setVisible(visible);
521 void MainWindow::updatePreferenceActions()
523 main_ui_->actionViewPacketList->setEnabled(prefs_has_layout_pane_content(layout_pane_content_plist));
524 main_ui_->actionViewPacketDetails->setEnabled(prefs_has_layout_pane_content(layout_pane_content_pdetails));
525 main_ui_->actionViewPacketBytes->setEnabled(prefs_has_layout_pane_content(layout_pane_content_pbytes));
527 main_ui_->actionViewNameResolutionPhysical->setChecked(gbl_resolv_flags.mac_name);
528 main_ui_->actionViewNameResolutionNetwork->setChecked(gbl_resolv_flags.network_name);
529 main_ui_->actionViewNameResolutionTransport->setChecked(gbl_resolv_flags.transport_name);
531 // Should this be a "recent" setting?
532 main_ui_->actionGoAutoScroll->setChecked(prefs.capture_auto_scroll);
535 void MainWindow::updateRecentActions()
537 main_ui_->actionViewMainToolbar->setChecked(recent.main_toolbar_show);
538 main_ui_->actionViewFilterToolbar->setChecked(recent.filter_toolbar_show);
539 main_ui_->actionViewWirelessToolbar->setChecked(recent.wireless_toolbar_show);
540 main_ui_->actionViewStatusBar->setChecked(recent.statusbar_show);
541 main_ui_->actionViewPacketList->setChecked(recent.packet_list_show && prefs_has_layout_pane_content(layout_pane_content_plist));
542 main_ui_->actionViewPacketDetails->setChecked(recent.tree_view_show && prefs_has_layout_pane_content(layout_pane_content_pdetails));
543 main_ui_->actionViewPacketBytes->setChecked(recent.byte_view_show && prefs_has_layout_pane_content(layout_pane_content_pbytes));
545 foreach (QAction *action, main_ui_->menuInterfaceToolbars->actions()) {
546 if (g_list_find_custom(recent.interface_toolbars, action->text().toUtf8(), (GCompareFunc) strcmp)) {
547 action->setChecked(true);
549 action->setChecked(false);
553 foreach (QAction * action, main_ui_->menuAdditionalToolbars->actions()) {
554 ext_toolbar_t * toolbar = VariantPointer<ext_toolbar_t>::asPtr(action->data());
555 bool checked = false;
556 if (toolbar && g_list_find_custom(recent.gui_additional_toolbars, toolbar->name, (GCompareFunc) strcmp))
559 action->setChecked(checked);
562 foreach (QAction* tda, td_actions.keys()) {
563 if (recent.gui_time_format == td_actions[tda]) {
564 tda->setChecked(true);
567 foreach (QAction* tpa, tp_actions.keys()) {
568 if (recent.gui_time_precision == tp_actions[tpa]) {
569 tpa->setChecked(true);
573 main_ui_->actionViewTimeDisplaySecondsWithHoursAndMinutes->setChecked(recent.gui_seconds_format == TS_SECONDS_HOUR_MIN_SEC);
575 main_ui_->actionViewColorizePacketList->setChecked(recent.packet_list_colorize);
578 // Don't connect to this directly. Connect to or emit fiterAction(...) instead.
579 void MainWindow::queuedFilterAction(QString action_filter, FilterAction::Action action, FilterAction::ActionType type)
581 QString cur_filter, new_filter;
583 if (!df_combo_box_) return;
584 cur_filter = df_combo_box_->lineEdit()->text();
587 case FilterAction::ActionTypePlain:
588 new_filter = action_filter;
590 case FilterAction::ActionTypeAnd:
591 if (cur_filter.length()) {
592 new_filter = "(" + cur_filter + ") && (" + action_filter + ")";
594 new_filter = action_filter;
597 case FilterAction::ActionTypeOr:
598 if (cur_filter.length()) {
599 new_filter = "(" + cur_filter + ") || (" + action_filter + ")";
601 new_filter = action_filter;
604 case FilterAction::ActionTypeNot:
605 new_filter = "!(" + action_filter + ")";
607 case FilterAction::ActionTypeAndNot:
608 if (cur_filter.length()) {
609 new_filter = "(" + cur_filter + ") && !(" + action_filter + ")";
611 new_filter = "!(" + action_filter + ")";
614 case FilterAction::ActionTypeOrNot:
615 if (cur_filter.length()) {
616 new_filter = "(" + cur_filter + ") || !(" + action_filter + ")";
618 new_filter = "!(" + action_filter + ")";
622 g_assert_not_reached();
627 case FilterAction::ActionApply:
628 df_combo_box_->lineEdit()->setText(new_filter);
629 df_combo_box_->applyDisplayFilter();
631 case FilterAction::ActionColorize:
632 colorizeWithFilter(new_filter.toUtf8());
634 case FilterAction::ActionCopy:
635 wsApp->clipboard()->setText(new_filter);
637 case FilterAction::ActionFind:
638 main_ui_->searchFrame->findFrameWithFilter(new_filter);
640 case FilterAction::ActionPrepare:
641 df_combo_box_->lineEdit()->setText(new_filter);
642 df_combo_box_->lineEdit()->setFocus();
644 case FilterAction::ActionWebLookup:
646 QString url = QString("https://www.google.com/search?q=") + new_filter;
647 QDesktopServices::openUrl(QUrl(url));
651 g_assert_not_reached();
658 void MainWindow::captureCapturePrepared(capture_session *session) {
660 setTitlebarForCaptureInProgress();
662 setWindowIcon(wsApp->captureIcon());
664 /* Disable menu items that make no sense if you're currently running
666 setForCaptureInProgress(true, session->capture_opts->ifaces);
667 // set_capture_if_dialog_for_capture_in_progress(TRUE);
669 // /* Don't set up main window for a capture file. */
670 // main_set_for_capture_file(FALSE);
671 main_ui_->mainStack->setCurrentWidget(&master_split_);
674 #endif // HAVE_LIBPCAP
677 void MainWindow::captureCaptureUpdateStarted(capture_session *session) {
680 /* We've done this in "prepared" above, but it will be cleared while
681 switching to the next multiple file. */
682 setTitlebarForCaptureInProgress();
684 setForCaptureInProgress(true, session->capture_opts->ifaces);
686 setForCapturedPackets(true);
689 #endif // HAVE_LIBPCAP
691 void MainWindow::captureCaptureUpdateFinished(capture_session *) {
694 /* The capture isn't stopping any more - it's stopped. */
695 capture_stopping_ = false;
697 /* Update the main window as appropriate */
698 updateForUnsavedChanges();
700 /* Enable menu items that make sense if you're not currently running
702 setForCaptureInProgress(false);
703 setMenusForCaptureFile();
705 setWindowIcon(wsApp->normalIcon());
707 if (global_commandline_info.quit_after_cap) {
708 // Command line asked us to quit after capturing.
709 // Don't pop up a dialog to ask for unsaved files etc.
712 #endif // HAVE_LIBPCAP
714 void MainWindow::captureCaptureFixedStarted(capture_session *) {
716 #endif // HAVE_LIBPCAP
718 void MainWindow::captureCaptureFixedFinished(capture_session *) {
721 /* The capture isn't stopping any more - it's stopped. */
722 capture_stopping_ = false;
724 /* Enable menu items that make sense if you're not currently running
726 setForCaptureInProgress(false);
727 setMenusForCaptureFile();
729 setWindowIcon(wsApp->normalIcon());
731 if (global_commandline_info.quit_after_cap) {
732 // Command line asked us to quit after capturing.
733 // Don't pop up a dialog to ask for unsaved files etc.
736 #endif // HAVE_LIBPCAP
738 void MainWindow::captureCaptureStopping(capture_session *) {
741 capture_stopping_ = true;
742 setMenusForCaptureStopping();
743 #endif // HAVE_LIBPCAP
745 void MainWindow::captureCaptureFailed(capture_session *) {
747 /* Capture isn't stopping any more. */
748 capture_stopping_ = false;
750 setForCaptureInProgress(false);
751 main_ui_->mainStack->setCurrentWidget(main_welcome_);
753 // Reset expert information indicator
754 main_ui_->statusBar->captureFileClosing();
755 main_ui_->statusBar->popFileStatus();
757 setWindowIcon(wsApp->normalIcon());
759 if (global_commandline_info.quit_after_cap) {
760 // Command line asked us to quit after capturing.
761 // Don't pop up a dialog to ask for unsaved files etc.
764 #endif // HAVE_LIBPCAP
768 // Callbacks from cfile.c and file.c via CaptureFile::captureFileCallback
770 void MainWindow::captureFileOpened() {
771 if (capture_file_.window() != this) return;
773 file_set_dialog_->fileOpened(capture_file_.capFile());
774 setMenusForFileSet(true);
775 emit setCaptureFile(capture_file_.capFile());
778 void MainWindow::captureFileReadStarted(const QString &action) {
779 // tap_param_dlg_update();
781 /* Set up main window for a capture file. */
782 // main_set_for_capture_file(TRUE);
784 main_ui_->statusBar->popFileStatus();
785 QString msg = QString(tr("%1: %2")).arg(action).arg(capture_file_.fileName());
786 QString msgtip = QString();
787 main_ui_->statusBar->pushFileStatus(msg, msgtip);
788 main_ui_->mainStack->setCurrentWidget(&master_split_);
789 main_ui_->actionAnalyzeReloadLuaPlugins->setEnabled(false);
790 main_ui_->wirelessTimelineWidget->captureFileReadStarted(capture_file_.capFile());
792 WiresharkApplication::processEvents();
795 void MainWindow::captureFileReadFinished() {
798 if (!capture_file_.capFile()->is_tempfile && capture_file_.capFile()->filename) {
799 /* Add this filename to the list of recent files in the "Recent Files" submenu */
800 add_menu_recent_capture_file(capture_file_.capFile()->filename);
802 /* Remember folder for next Open dialog and save it in recent */
803 dir_path = g_strdup(capture_file_.capFile()->filename);
804 wsApp->setLastOpenDir(get_dirname(dir_path));
808 /* Update the appropriate parts of the main window. */
809 updateForUnsavedChanges();
811 /* enable wireless timeline if capture allows it */
812 main_ui_->wirelessTimelineWidget->captureFileReadFinished();
814 /* Enable menu items that make sense if you have some captured packets. */
815 setForCapturedPackets(true);
817 main_ui_->statusBar->setFileName(capture_file_);
818 main_ui_->actionAnalyzeReloadLuaPlugins->setEnabled(true);
820 packet_list_->captureFileReadFinished();
822 emit setDissectedCaptureFile(capture_file_.capFile());
825 void MainWindow::captureFileRetapStarted()
827 // XXX Push a status message?
831 void MainWindow::captureFileRetapFinished()
836 void MainWindow::captureFileMergeStarted()
838 main_ui_->statusBar->popFileStatus();
839 QString msg = tr("Merging files");
840 QString msgtip = QString();
841 main_ui_->statusBar->pushFileStatus(msg, msgtip);
844 void MainWindow::captureFileMergeFinished()
846 main_ui_->statusBar->popFileStatus();
849 void MainWindow::captureFileFlushTapsData()
851 draw_tap_listeners(FALSE);
854 void MainWindow::captureFileClosing() {
855 setMenusForCaptureFile(true);
856 setForCapturedPackets(false);
857 setForCaptureInProgress(false);
859 // Reset expert information indicator
860 main_ui_->statusBar->captureFileClosing();
861 main_ui_->searchFrame->animatedHide();
862 main_ui_->goToFrame->animatedHide();
863 // gtk_widget_show(expert_info_none);
864 emit setCaptureFile(NULL);
865 emit setDissectedCaptureFile(NULL);
868 void MainWindow::captureFileClosed() {
869 packets_bar_update();
871 file_set_dialog_->fileClosed();
872 setMenusForFileSet(false);
873 setWindowModified(false);
875 // Reset expert information indicator
876 main_ui_->statusBar->captureFileClosing();
877 main_ui_->statusBar->popFileStatus();
880 setWindowIcon(wsApp->normalIcon());
881 setMenusForSelectedPacket();
882 setMenusForSelectedTreeRow();
885 if (!global_capture_opts.multi_files_on)
886 main_ui_->mainStack->setCurrentWidget(main_welcome_);
890 void MainWindow::captureFileSaveStarted(const QString &file_path)
892 QFileInfo file_info(file_path);
893 main_ui_->statusBar->popFileStatus();
894 main_ui_->statusBar->pushFileStatus(tr("Saving %1" UTF8_HORIZONTAL_ELLIPSIS).arg(file_info.baseName()));
897 struct filter_expression_data
903 gboolean MainWindow::filter_expression_add_action(const void *key _U_, void *value, void *user_data)
905 filter_expression_t* fe = (filter_expression_t*)value;
906 struct filter_expression_data* data = (filter_expression_data*)user_data;
911 QAction *dfb_action = new QAction(fe->label, data->window->filter_expression_toolbar_);
912 if (strlen(fe->comment) > 0)
914 QString tooltip = QString("%1, %2").arg(fe->expression).arg(fe->comment);
915 dfb_action->setToolTip(tooltip);
919 dfb_action->setToolTip(fe->expression);
921 dfb_action->setData(fe->expression);
922 dfb_action->setProperty(dfe_property_, true);
923 data->window->filter_expression_toolbar_->addAction(dfb_action);
924 connect(dfb_action, SIGNAL(data->window->triggered()), data->window, SLOT(data->window->displayFilterButtonClicked()));
925 data->actions_added = true;
929 void MainWindow::filterExpressionsChanged()
931 struct filter_expression_data data;
934 data.actions_added = false;
936 // Recreate filter buttons
937 foreach (QAction *act, filter_expression_toolbar_->actions()) {
938 // Permanent actions shouldn't have data
939 if (act->property(dfe_property_).isValid()) {
940 filter_expression_toolbar_->removeAction(act);
945 // XXX Add a context menu for removing and changing buttons.
946 filter_expression_iterate_expressions(filter_expression_add_action, &data);
948 if (data.actions_added) {
949 main_ui_->displayFilterToolBar->adjustSize();
957 // ui/gtk/capture_dlg.c:start_capture_confirmed
959 void MainWindow::startCapture() {
961 interface_options interface_opts;
964 /* did the user ever select a capture interface before? */
965 if(global_capture_opts.num_selected == 0) {
966 QString msg = QString(tr("No interface selected"));
967 main_ui_->statusBar->pushTemporaryStatus(msg);
968 main_ui_->actionCaptureStart->setChecked(false);
972 // Ideally we should have disabled the start capture
973 // toolbar buttons and menu items. This may not be the
974 // case, e.g. with QtMacExtras.
975 if(!capture_filter_valid_) {
976 QString msg = QString(tr("Invalid capture filter"));
977 main_ui_->statusBar->pushTemporaryStatus(msg);
978 main_ui_->actionCaptureStart->setChecked(false);
982 main_ui_->mainStack->setCurrentWidget(&master_split_);
984 /* XXX - we might need to init other pref data as well... */
986 /* XXX - can this ever happen? */
987 if (cap_session_.state != CAPTURE_STOPPED)
990 /* close the currently loaded capture file */
991 cf_close((capture_file *) cap_session_.cf);
993 /* Copy the selected interfaces to the set of interfaces to use for
995 collect_ifaces(&global_capture_opts);
997 CaptureFile::globalCapFile()->window = this;
998 if (capture_start(&global_capture_opts, &cap_session_, &info_data_, main_window_update)) {
999 capture_options *capture_opts = cap_session_.capture_opts;
1000 GString *interface_names;
1002 /* Add "interface name<live capture in progress>" on main status bar */
1003 interface_names = get_iface_list_string(capture_opts, 0);
1004 if (strlen (interface_names->str) > 0) {
1005 g_string_append(interface_names, ":");
1007 g_string_append(interface_names, " ");
1009 main_ui_->statusBar->popFileStatus();
1010 QString msg = QString().sprintf("%s<live capture in progress>", interface_names->str);
1011 QString msgtip = QString().sprintf("to file: %s", (capture_opts->save_file) ? capture_opts->save_file : "");
1012 main_ui_->statusBar->pushFileStatus(msg, msgtip);
1013 g_string_free(interface_names, TRUE);
1015 /* The capture succeeded, which means the capture filter syntax is
1016 valid; add this capture filter to the recent capture filter list. */
1017 QByteArray filter_ba;
1018 for (i = 0; i < global_capture_opts.ifaces->len; i++) {
1019 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
1020 if (interface_opts.cfilter) {
1021 recent_add_cfilter(interface_opts.name, interface_opts.cfilter);
1022 if (filter_ba.isEmpty()) {
1023 filter_ba = interface_opts.cfilter;
1025 /* Not the first selected interface; is its capture filter
1026 the same as the one the other interfaces we've looked
1028 if (strcmp(interface_opts.cfilter, filter_ba.constData()) != 0) {
1029 /* No, so not all selected interfaces have the same capture
1036 if (!filter_ba.isEmpty()) {
1037 recent_add_cfilter(NULL, filter_ba.constData());
1040 CaptureFile::globalCapFile()->window = NULL;
1042 #endif // HAVE_LIBPCAP
1045 // Copied from ui/gtk/gui_utils.c
1046 void MainWindow::pipeTimeout() {
1050 gboolean result, result1;
1052 gint iterations = 0;
1055 /* try to read data from the pipe only 5 times, to avoid blocking */
1056 while(iterations < 5) {
1057 /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: new iteration");*/
1059 /* Oddly enough although Named pipes don't work on win9x,
1060 PeekNamedPipe does !!! */
1061 handle = (HANDLE) _get_osfhandle (pipe_source_);
1062 result = PeekNamedPipe(handle, NULL, 0, NULL, &avail, NULL);
1064 /* Get the child process exit status */
1065 result1 = GetExitCodeProcess((HANDLE)*(pipe_child_process_),
1068 /* If the Peek returned an error, or there are bytes to be read
1069 or the childwatcher thread has terminated then call the normal
1071 if (!result || avail > 0 || childstatus != STILL_ACTIVE) {
1073 /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: data avail");*/
1075 /* And call the real handler */
1076 if (!pipe_input_cb_(pipe_source_, pipe_user_data_)) {
1077 g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: input pipe closed, iterations: %u", iterations);
1078 /* pipe closed, return false so that the old timer is not run again */
1084 /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: no data avail");*/
1085 /* No data, stop now */
1094 void MainWindow::pipeActivated(int source) {
1098 g_assert(source == pipe_source_);
1100 pipe_notifier_->setEnabled(false);
1101 if (pipe_input_cb_(pipe_source_, pipe_user_data_)) {
1102 pipe_notifier_->setEnabled(true);
1104 delete pipe_notifier_;
1109 void MainWindow::pipeNotifierDestroyed()
1111 /* Pop the "<live capture in progress>" message off the status bar. */
1112 main_ui_->statusBar->setFileName(capture_file_);
1117 pipe_notifier_ = NULL;
1121 void MainWindow::stopCapture() {
1122 //#ifdef HAVE_AIRPCAP
1123 // if (airpcap_if_active)
1124 // airpcap_set_toolbar_stop_capture(airpcap_if_active);
1128 capture_stop(&cap_session_);
1129 #endif // HAVE_LIBPCAP
1133 // Keep focus rects from showing through the welcome screen. Primarily for
1135 void MainWindow::mainStackChanged(int)
1137 for (int i = 0; i < main_ui_->mainStack->count(); i++) {
1138 main_ui_->mainStack->widget(i)->setEnabled(i == main_ui_->mainStack->currentIndex());
1142 // XXX - Copied from ui/gtk/menus.c
1145 * Add the capture filename (with an absolute path) to the "Recent Files" menu.
1147 // XXX - We should probably create a RecentFile class.
1148 void MainWindow::updateRecentCaptures() {
1150 QMenu *recentMenu = main_ui_->menuOpenRecentCaptureFile;
1151 QString action_cf_name;
1156 recentMenu->clear();
1158 // #if defined(QT_WINEXTRAS_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
1159 // QWinJumpList recent_jl(this);
1160 // QWinJumpListCategory *recent_jlc = recent_jl.recent();
1161 // if (recent_jlc) {
1162 // recent_jlc->clear();
1163 // recent_jlc->setVisible(true);
1166 #if defined(Q_OS_MAC) && QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
1168 dock_menu_ = new QMenu();
1169 dock_menu_->setAsDockMenu();
1171 dock_menu_->clear();
1174 /* Iterate through the actions in menuOpenRecentCaptureFile,
1175 * removing special items, a maybe duplicate entry and every item above count_max */
1176 int shortcut = Qt::Key_0;
1177 foreach (recent_item_status *ri, wsApp->recentItems()) {
1179 ra = new QAction(recentMenu);
1180 ra->setData(ri->filename);
1181 // XXX - Needs get_recent_item_status or equivalent
1182 ra->setEnabled(ri->accessible);
1183 recentMenu->insertAction(NULL, ra);
1184 action_cf_name = ra->data().toString();
1185 if (shortcut <= Qt::Key_9) {
1186 ra->setShortcut(Qt::META | shortcut);
1189 ra->setText(action_cf_name);
1190 connect(ra, SIGNAL(triggered()), this, SLOT(recentActionTriggered()));
1192 // This is slow, at least on my VM here. The added links also open Wireshark
1193 // in a new window. It might make more sense to add a recent item when we
1194 // open a capture file.
1195 // #if defined(QT_WINEXTRAS_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
1196 // if (recent_jlc) {
1197 // QFileInfo fi(ri->filename);
1198 // QWinJumpListItem *jli = recent_jlc->addLink(
1200 // QApplication::applicationFilePath(),
1201 // QStringList() << "-r" << ri->filename
1204 // jli->setWorkingDirectory(QDir::toNativeSeparators(QApplication::applicationDirPath()));
1207 #if defined(Q_OS_MAC) && QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
1208 QAction *rda = new QAction(dock_menu_);
1209 QFileInfo fi(ri->filename);
1210 rda->setText(fi.fileName());
1211 dock_menu_->insertAction(NULL, rda);
1212 connect(rda, SIGNAL(triggered()), ra, SLOT(trigger()));
1216 if (recentMenu->actions().count() > 0) {
1217 // Separator + "Clear"
1218 // XXX - Do we really need this?
1219 ra = new QAction(recentMenu);
1220 ra->setSeparator(true);
1221 recentMenu->insertAction(NULL, ra);
1223 ra = new QAction(recentMenu);
1224 ra->setText(tr("Clear Menu"));
1225 recentMenu->insertAction(NULL, ra);
1226 connect(ra, SIGNAL(triggered()), wsApp, SLOT(clearRecentCaptures()));
1228 if (main_ui_->actionDummyNoFilesFound) {
1229 recentMenu->addAction(main_ui_->actionDummyNoFilesFound);
1234 void MainWindow::recentActionTriggered() {
1235 QAction *ra = qobject_cast<QAction*>(sender());
1238 QString cfPath = ra->data().toString();
1239 openCaptureFile(cfPath);
1243 void MainWindow::setMenusForSelectedPacket()
1245 gboolean is_ip = FALSE, is_tcp = FALSE, is_udp = FALSE, is_sctp = FALSE, is_ssl = FALSE, is_rtp = FALSE, is_lte_rlc = FALSE, is_http = FALSE;
1247 /* Making the menu context-sensitive allows for easier selection of the
1248 desired item and has the added benefit, with large captures, of
1249 avoiding needless looping through huge lists for marked, ignored,
1250 or time-referenced packets. */
1252 /* We have one or more items in the packet list */
1253 bool have_frames = false;
1254 /* A frame is selected */
1255 bool frame_selected = false;
1256 /* A visible packet comes after this one in the selection history */
1257 bool next_selection_history = false;
1258 /* A visible packet comes before this one in the selection history */
1259 bool previous_selection_history = false;
1260 /* We have marked frames. (XXX - why check frame_selected?) */
1261 bool have_marked = false;
1262 /* We have a marked frame other than the current frame (i.e.,
1263 we have at least one marked frame, and either there's more
1264 than one marked frame or the current frame isn't marked). */
1265 bool another_is_marked = false;
1266 /* One or more frames are hidden by a display filter */
1267 bool have_filtered = false;
1268 /* One or more frames have been ignored */
1269 bool have_ignored = false;
1270 bool have_time_ref = false;
1271 /* We have a time reference frame other than the current frame (i.e.,
1272 we have at least one time reference frame, and either there's more
1273 than one time reference frame or the current frame isn't a
1274 time reference frame). (XXX - why check frame_selected?) */
1275 bool another_is_time_ref = false;
1276 /* We have a valid filter expression */
1277 bool have_filter_expr = false;
1279 QList<QAction *> cc_actions = QList<QAction *>()
1280 << main_ui_->actionViewColorizeConversation1 << main_ui_->actionViewColorizeConversation2
1281 << main_ui_->actionViewColorizeConversation3 << main_ui_->actionViewColorizeConversation4
1282 << main_ui_->actionViewColorizeConversation5 << main_ui_->actionViewColorizeConversation6
1283 << main_ui_->actionViewColorizeConversation7 << main_ui_->actionViewColorizeConversation8
1284 << main_ui_->actionViewColorizeConversation9 << main_ui_->actionViewColorizeConversation10;
1286 if (capture_file_.capFile()) {
1287 frame_selected = capture_file_.capFile()->current_frame != NULL;
1288 next_selection_history = packet_list_->haveNextHistory();
1289 previous_selection_history = packet_list_->havePreviousHistory();
1290 have_frames = capture_file_.capFile()->count > 0;
1291 have_marked = frame_selected && capture_file_.capFile()->marked_count > 0;
1292 another_is_marked = have_marked &&
1293 !(capture_file_.capFile()->marked_count == 1 && capture_file_.capFile()->current_frame->flags.marked);
1294 have_filtered = capture_file_.capFile()->displayed_count > 0 && capture_file_.capFile()->displayed_count != capture_file_.capFile()->count;
1295 have_ignored = capture_file_.capFile()->ignored_count > 0;
1296 have_time_ref = capture_file_.capFile()->ref_time_count > 0;
1297 another_is_time_ref = frame_selected && have_time_ref &&
1298 !(capture_file_.capFile()->ref_time_count == 1 && capture_file_.capFile()->current_frame->flags.ref_time);
1300 if (capture_file_.capFile()->edt)
1302 proto_get_frame_protocols(capture_file_.capFile()->edt->pi.layers,
1303 &is_ip, &is_tcp, &is_udp, &is_sctp,
1304 &is_ssl, &is_rtp, &is_lte_rlc);
1305 is_http = proto_is_frame_protocol(capture_file_.capFile()->edt->pi.layers, "http");
1309 have_filter_expr = !packet_list_->getFilterFromRowAndColumn().isEmpty();
1311 main_ui_->actionEditMarkPacket->setEnabled(frame_selected);
1312 main_ui_->actionEditMarkAllDisplayed->setEnabled(have_frames);
1313 /* Unlike un-ignore, do not allow unmark of all frames when no frames are displayed */
1314 main_ui_->actionEditUnmarkAllDisplayed->setEnabled(have_marked);
1315 main_ui_->actionEditNextMark->setEnabled(another_is_marked);
1316 main_ui_->actionEditPreviousMark->setEnabled(another_is_marked);
1318 #ifdef WANT_PACKET_EDITOR
1319 // set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/EditPacket",
1321 #endif // WANT_PACKET_EDITOR
1322 main_ui_->actionEditPacketComment->setEnabled(frame_selected && wtap_dump_can_write(capture_file_.capFile()->linktypes, WTAP_COMMENT_PER_PACKET));
1324 main_ui_->actionEditIgnorePacket->setEnabled(frame_selected);
1325 main_ui_->actionEditIgnoreAllDisplayed->setEnabled(have_filtered);
1326 /* Allow un-ignore of all frames even with no frames currently displayed */
1327 main_ui_->actionEditUnignoreAllDisplayed->setEnabled(have_ignored);
1329 main_ui_->actionEditSetTimeReference->setEnabled(frame_selected);
1330 main_ui_->actionEditUnsetAllTimeReferences->setEnabled(have_time_ref);
1331 main_ui_->actionEditNextTimeReference->setEnabled(another_is_time_ref);
1332 main_ui_->actionEditPreviousTimeReference->setEnabled(another_is_time_ref);
1333 main_ui_->actionEditTimeShift->setEnabled(have_frames);
1335 main_ui_->actionGoGoToLinkedPacket->setEnabled(false);
1336 main_ui_->actionGoNextHistoryPacket->setEnabled(next_selection_history);
1337 main_ui_->actionGoPreviousHistoryPacket->setEnabled(previous_selection_history);
1339 main_ui_->actionAnalyzeAAFSelected->setEnabled(have_filter_expr);
1340 main_ui_->actionAnalyzeAAFNotSelected->setEnabled(have_filter_expr);
1341 main_ui_->actionAnalyzeAAFAndSelected->setEnabled(have_filter_expr);
1342 main_ui_->actionAnalyzeAAFOrSelected->setEnabled(have_filter_expr);
1343 main_ui_->actionAnalyzeAAFAndNotSelected->setEnabled(have_filter_expr);
1344 main_ui_->actionAnalyzeAAFOrNotSelected->setEnabled(have_filter_expr);
1346 main_ui_->actionAnalyzePAFSelected->setEnabled(have_filter_expr);
1347 main_ui_->actionAnalyzePAFNotSelected->setEnabled(have_filter_expr);
1348 main_ui_->actionAnalyzePAFAndSelected->setEnabled(have_filter_expr);
1349 main_ui_->actionAnalyzePAFOrSelected->setEnabled(have_filter_expr);
1350 main_ui_->actionAnalyzePAFAndNotSelected->setEnabled(have_filter_expr);
1351 main_ui_->actionAnalyzePAFOrNotSelected->setEnabled(have_filter_expr);
1353 main_ui_->actionAnalyzeFollowTCPStream->setEnabled(is_tcp);
1354 main_ui_->actionAnalyzeFollowUDPStream->setEnabled(is_udp);
1355 main_ui_->actionAnalyzeFollowSSLStream->setEnabled(is_ssl);
1356 main_ui_->actionAnalyzeFollowHTTPStream->setEnabled(is_http);
1358 foreach (QAction *cc_action, cc_actions) {
1359 cc_action->setEnabled(frame_selected);
1361 main_ui_->actionViewColorizeNewColoringRule->setEnabled(frame_selected);
1363 main_ui_->actionViewColorizeResetColorization->setEnabled(tmp_color_filters_used());
1365 main_ui_->actionViewShowPacketInNewWindow->setEnabled(frame_selected);
1366 main_ui_->actionViewEditResolvedName->setEnabled(frame_selected && is_ip);
1368 emit packetInfoChanged(capture_file_.packetInfo());
1370 // set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/ResolveName",
1371 // frame_selected && (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
1372 // gbl_resolv_flags.transport_name));
1374 main_ui_->actionToolsFirewallAclRules->setEnabled(frame_selected);
1376 main_ui_->actionStatisticsTcpStreamRoundTripTime->setEnabled(is_tcp);
1377 main_ui_->actionStatisticsTcpStreamStevens->setEnabled(is_tcp);
1378 main_ui_->actionStatisticsTcpStreamTcptrace->setEnabled(is_tcp);
1379 main_ui_->actionStatisticsTcpStreamThroughput->setEnabled(is_tcp);
1380 main_ui_->actionStatisticsTcpStreamWindowScaling->setEnabled(is_tcp);
1382 main_ui_->actionSCTPAnalyseThisAssociation->setEnabled(is_sctp);
1383 main_ui_->actionSCTPShowAllAssociations->setEnabled(is_sctp);
1384 main_ui_->actionSCTPFilterThisAssociation->setEnabled(is_sctp);
1385 main_ui_->actionTelephonyRTPStreamAnalysis->setEnabled(is_rtp);
1386 main_ui_->actionTelephonyLteRlcGraph->setEnabled(is_lte_rlc);
1389 void MainWindow::setMenusForSelectedTreeRow(field_info *fi) {
1391 bool can_match_selected = false;
1392 bool is_framenum = false;
1393 bool have_field_info = false;
1394 bool have_subtree = false;
1395 bool can_open_url = false;
1396 bool have_packet_bytes = false;
1397 QByteArray field_filter;
1400 if (capture_file_.capFile()) {
1401 capture_file_.capFile()->finfo_selected = fi;
1403 if (fi && fi->tree_type != -1) {
1404 have_subtree = true;
1407 if (fi && fi->ds_tvb) {
1408 have_packet_bytes = true;
1412 if (capture_file_.capFile() != NULL && fi != NULL) {
1413 header_field_info *hfinfo = fi->hfinfo;
1414 int linked_frame = -1;
1416 have_field_info = true;
1417 can_match_selected = proto_can_match_selected(capture_file_.capFile()->finfo_selected, capture_file_.capFile()->edt);
1418 if (hfinfo && hfinfo->type == FT_FRAMENUM) {
1420 linked_frame = fvalue_get_uinteger(&fi->value);
1423 char *tmp_field = proto_construct_match_selected_string(fi, capture_file_.capFile()->edt);
1424 field_filter = tmp_field;
1425 wmem_free(NULL, tmp_field);
1427 field_id = fi->hfinfo->id;
1428 /* if the selected field isn't a protocol, get its parent */
1429 if (!proto_registrar_is_protocol(field_id)) {
1430 field_id = proto_registrar_get_parent(fi->hfinfo->id);
1433 if (field_id >= 0) {
1434 can_open_url = true;
1435 main_ui_->actionContextWikiProtocolPage->setData(field_id);
1436 main_ui_->actionContextFilterFieldReference->setData(field_id);
1438 main_ui_->actionContextWikiProtocolPage->setData(QVariant());
1439 main_ui_->actionContextFilterFieldReference->setData(QVariant());
1442 if (linked_frame > 0) {
1443 main_ui_->actionGoGoToLinkedPacket->setData(linked_frame);
1445 main_ui_->actionGoGoToLinkedPacket->setData(QVariant());
1449 // Always enable / disable the following items.
1450 main_ui_->actionFileExportPacketBytes->setEnabled(have_field_info);
1452 main_ui_->actionCopyAllVisibleItems->setEnabled(capture_file_.capFile() != NULL);
1453 main_ui_->actionCopyAllVisibleSelectedTreeItems->setEnabled(can_match_selected);
1454 main_ui_->actionEditCopyDescription->setEnabled(can_match_selected);
1455 main_ui_->actionEditCopyFieldName->setEnabled(can_match_selected);
1456 main_ui_->actionEditCopyValue->setEnabled(can_match_selected);
1457 main_ui_->actionEditCopyAsFilter->setEnabled(can_match_selected);
1459 main_ui_->actionContextShowPacketBytes->setEnabled(have_packet_bytes);
1460 main_ui_->actionFileExportPacketBytes->setEnabled(have_packet_bytes);
1462 main_ui_->actionViewExpandSubtrees->setEnabled(have_subtree);
1464 main_ui_->actionGoGoToLinkedPacket->setEnabled(is_framenum);
1466 main_ui_->actionAnalyzeCreateAColumn->setEnabled(can_match_selected);
1468 main_ui_->actionContextShowLinkedPacketInNewWindow->setEnabled(is_framenum);
1470 main_ui_->actionContextWikiProtocolPage->setEnabled(can_open_url);
1471 main_ui_->actionContextFilterFieldReference->setEnabled(can_open_url);
1474 // Only enable / disable the following items if we have focus so that we
1475 // don't clobber anything we may have set in setMenusForSelectedPacket.
1476 if (!proto_tree_ || !proto_tree_->hasFocus()) return;
1478 emit packetInfoChanged(capture_file_.packetInfo());
1479 emit fieldFilterChanged(field_filter);
1481 // set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ResolveName",
1482 // frame_selected && (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
1483 // gbl_resolv_flags.transport_name));
1485 main_ui_->actionAnalyzeAAFSelected->setEnabled(can_match_selected);
1486 main_ui_->actionAnalyzeAAFNotSelected->setEnabled(can_match_selected);
1487 main_ui_->actionAnalyzeAAFAndSelected->setEnabled(can_match_selected);
1488 main_ui_->actionAnalyzeAAFOrSelected->setEnabled(can_match_selected);
1489 main_ui_->actionAnalyzeAAFAndNotSelected->setEnabled(can_match_selected);
1490 main_ui_->actionAnalyzeAAFOrNotSelected->setEnabled(can_match_selected);
1492 main_ui_->actionAnalyzePAFSelected->setEnabled(can_match_selected);
1493 main_ui_->actionAnalyzePAFNotSelected->setEnabled(can_match_selected);
1494 main_ui_->actionAnalyzePAFAndSelected->setEnabled(can_match_selected);
1495 main_ui_->actionAnalyzePAFOrSelected->setEnabled(can_match_selected);
1496 main_ui_->actionAnalyzePAFAndNotSelected->setEnabled(can_match_selected);
1497 main_ui_->actionAnalyzePAFOrNotSelected->setEnabled(can_match_selected);
1500 void MainWindow::interfaceSelectionChanged()
1503 // XXX This doesn't disable the toolbar button when using
1505 if (global_capture_opts.num_selected > 0 && capture_filter_valid_) {
1506 main_ui_->actionCaptureStart->setEnabled(true);
1508 main_ui_->actionCaptureStart->setEnabled(false);
1510 #endif // HAVE_LIBPCAP
1513 void MainWindow::captureFilterSyntaxChanged(bool valid)
1515 capture_filter_valid_ = valid;
1516 interfaceSelectionChanged();
1519 void MainWindow::startInterfaceCapture(bool valid, const QString capture_filter)
1521 capture_filter_valid_ = valid;
1522 main_welcome_->setCaptureFilter(capture_filter);
1523 // The interface tree will update the selected interfaces via its timer
1524 // so no need to do anything here.
1528 void MainWindow::applyGlobalCommandLineOptions()
1530 if (global_dissect_options.time_format != TS_NOT_SET) {
1531 foreach (QAction* tda, td_actions.keys()) {
1532 if (global_dissect_options.time_format == td_actions[tda]) {
1533 tda->setChecked(true);
1534 recent.gui_time_format = global_dissect_options.time_format;
1535 timestamp_set_type(global_dissect_options.time_format);
1540 if (global_commandline_info.full_screen) {
1541 this->showFullScreen();
1545 void MainWindow::redissectPackets()
1547 if (capture_file_.capFile()) {
1548 cf_redissect_packets(capture_file_.capFile());
1549 main_ui_->statusBar->expertUpdate();
1552 proto_free_deregistered_fields();
1555 void MainWindow::checkDisplayFilter()
1557 if (!df_combo_box_->checkDisplayFilter()) {
1558 g_free(CaptureFile::globalCapFile()->dfilter);
1559 CaptureFile::globalCapFile()->dfilter = NULL;
1563 void MainWindow::fieldsChanged()
1565 gchar *err_msg = NULL;
1566 if (!color_filters_reload(&err_msg, color_filter_add_cb)) {
1567 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
1570 tap_listeners_dfilter_recompile();
1572 emit checkDisplayFilter();
1574 if (have_custom_cols(&CaptureFile::globalCapFile()->cinfo)) {
1575 // Recreate packet list columns according to new/changed/deleted fields
1576 packet_list_->fieldsChanged(CaptureFile::globalCapFile());
1579 emit reloadFields();
1582 void MainWindow::reloadLuaPlugins()
1585 if (wsApp->isReloadingLua())
1588 wsApp->setReloadingLua(true);
1590 wslua_reload_plugins(NULL, NULL);
1591 funnel_statistics_reload_menus();
1592 reloadDynamicMenus();
1593 closePacketDialogs();
1595 // Preferences may have been deleted so close all widgets using prefs
1596 proto_tree_->closeContextMenu();
1597 main_ui_->preferenceEditorFrame->animatedHide();
1599 wsApp->readConfigurationFiles(true);
1605 wsApp->setReloadingLua(false);
1606 SimpleDialog::displayQueuedMessages();
1610 void MainWindow::showAccordionFrame(AccordionFrame *show_frame, bool toggle)
1612 QList<AccordionFrame *>frame_list = QList<AccordionFrame *>()
1613 << main_ui_->goToFrame << main_ui_->searchFrame
1614 << main_ui_->addressEditorFrame << main_ui_->columnEditorFrame
1615 << main_ui_->preferenceEditorFrame << main_ui_->filterExpressionFrame;
1617 frame_list.removeAll(show_frame);
1618 foreach (AccordionFrame *af, frame_list) af->animatedHide();
1621 if (show_frame->isVisible()) {
1622 show_frame->animatedHide();
1626 show_frame->animatedShow();
1629 void MainWindow::showColumnEditor(int column)
1631 previous_focus_ = wsApp->focusWidget();
1632 connect(previous_focus_, SIGNAL(destroyed()), this, SLOT(resetPreviousFocus()));
1633 showAccordionFrame(main_ui_->columnEditorFrame);
1634 main_ui_->columnEditorFrame->editColumn(column);
1637 void MainWindow::showPreferenceEditor()
1639 showAccordionFrame(main_ui_->preferenceEditorFrame);
1642 void MainWindow::initViewColorizeMenu()
1644 QList<QAction *> cc_actions = QList<QAction *>()
1645 << main_ui_->actionViewColorizeConversation1 << main_ui_->actionViewColorizeConversation2
1646 << main_ui_->actionViewColorizeConversation3 << main_ui_->actionViewColorizeConversation4
1647 << main_ui_->actionViewColorizeConversation5 << main_ui_->actionViewColorizeConversation6
1648 << main_ui_->actionViewColorizeConversation7 << main_ui_->actionViewColorizeConversation8
1649 << main_ui_->actionViewColorizeConversation9 << main_ui_->actionViewColorizeConversation10;
1651 guint8 color_num = 1;
1653 foreach (QAction *cc_action, cc_actions) {
1654 cc_action->setData(color_num);
1655 connect(cc_action, SIGNAL(triggered()), this, SLOT(colorizeConversation()));
1657 const color_filter_t *colorf = color_filters_tmp_color(color_num);
1659 QColor bg = ColorUtils::fromColorT(colorf->bg_color);
1660 QColor fg = ColorUtils::fromColorT(colorf->fg_color);
1661 cc_action->setIcon(StockIcon::colorIcon(bg.rgb(), fg.rgb(), QString::number(color_num)));
1667 // Spotlight uses Cmd+Space
1668 main_ui_->actionViewColorizeResetColorization->setShortcut(QKeySequence("Meta+Space"));
1672 void MainWindow::addStatsPluginsToMenu() {
1673 GList *cfg_list = stats_tree_get_cfg_list();
1674 GList *iter = g_list_first(cfg_list);
1675 QAction *stats_tree_action;
1677 bool first_item = true;
1680 stats_tree_cfg *cfg = (stats_tree_cfg*)iter->data;
1683 main_ui_->menuStatistics->addSeparator();
1687 parent_menu = main_ui_->menuStatistics;
1688 // gtk/main_menubar.c compresses double slashes, hence SkipEmptyParts
1689 QStringList cfg_name_parts = QString(cfg->name).split("/", QString::SkipEmptyParts);
1690 if (cfg_name_parts.isEmpty()) continue;
1692 QString stat_name = cfg_name_parts.takeLast();
1693 if (!cfg_name_parts.isEmpty()) {
1694 QString menu_name = cfg_name_parts.join("/");
1695 parent_menu = findOrAddMenu(parent_menu, menu_name);
1698 stats_tree_action = new QAction(stat_name, this);
1699 stats_tree_action->setData(cfg->abbr);
1700 parent_menu->addAction(stats_tree_action);
1701 connect(stats_tree_action, SIGNAL(triggered()), this, SLOT(actionStatisticsPlugin_triggered()));
1703 iter = g_list_next(iter);
1705 g_list_free(cfg_list);
1708 void MainWindow::setFeaturesEnabled(bool enabled)
1710 main_ui_->menuBar->setEnabled(enabled);
1711 main_ui_->mainToolBar->setEnabled(enabled);
1712 main_ui_->displayFilterToolBar->setEnabled(enabled);
1715 main_ui_->statusBar->clearMessage();
1717 main_ui_->actionGoAutoScroll->setChecked(auto_scroll_live);
1722 main_ui_->statusBar->showMessage(tr("Please wait while Wireshark is initializing" UTF8_HORIZONTAL_ELLIPSIS));
1726 // Display Filter Toolbar
1728 void MainWindow::on_actionDisplayFilterExpression_triggered()
1730 DisplayFilterExpressionDialog *dfe_dialog = new DisplayFilterExpressionDialog(this);
1732 connect(dfe_dialog, SIGNAL(insertDisplayFilter(QString)),
1733 df_combo_box_->lineEdit(), SLOT(insertFilter(const QString &)));
1738 void MainWindow::on_actionNewDisplayFilterExpression_triggered()
1740 main_ui_->filterExpressionFrame->addExpression(df_combo_box_->lineEdit()->text());
1741 showAccordionFrame(main_ui_->filterExpressionFrame);
1744 // On Qt4 + macOS with unifiedTitleAndToolBarOnMac set it's possible to make
1745 // the main window obnoxiously wide.
1747 void MainWindow::displayFilterButtonClicked()
1749 QAction *dfb_action = qobject_cast<QAction*>(sender());
1752 df_combo_box_->lineEdit()->setText(dfb_action->data().toString());
1753 // Holding down the Alt key will only prepare filter.
1754 if (!(QApplication::keyboardModifiers() & Qt::AltModifier)) {
1755 df_combo_box_->applyDisplayFilter();
1757 df_combo_box_->lineEdit()->setFocus();
1761 void MainWindow::openStatCommandDialog(const QString &menu_path, const char *arg, void *userdata)
1763 QString slot = QString("statCommand%1").arg(menu_path);
1764 QMetaObject::invokeMethod(this, slot.toLatin1().constData(), Q_ARG(const char *, arg), Q_ARG(void *, userdata));
1767 void MainWindow::openTapParameterDialog(const QString cfg_str, const QString arg, void *userdata)
1769 TapParameterDialog *tp_dialog = TapParameterDialog::showTapParameterStatistics(*this, capture_file_, cfg_str, arg, userdata);
1770 if (!tp_dialog) return;
1772 connect(tp_dialog, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
1773 this, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)));
1774 connect(tp_dialog, SIGNAL(updateFilter(QString)),
1775 df_combo_box_->lineEdit(), SLOT(setText(QString)));
1779 void MainWindow::openTapParameterDialog()
1781 QAction *tpa = qobject_cast<QAction *>(QObject::sender());
1784 const QString cfg_str = tpa->data().toString();
1785 openTapParameterDialog(cfg_str, NULL, NULL);
1788 void MainWindow::byteViewTabChanged(int tab_index)
1790 QWidget *new_tab = byte_view_tab_->widget(tab_index);
1792 setTabOrder(proto_tree_, new_tab);
1793 setTabOrder(new_tab, df_combo_box_->lineEdit()); // XXX Toolbar instead?
1797 #ifdef HAVE_SOFTWARE_UPDATE
1798 void MainWindow::softwareUpdateRequested() {
1799 // We could call testCaptureFileClose here, but that would give us yet
1800 // another dialog. Just try again later.
1801 if (capture_file_.capFile() && capture_file_.capFile()->state != FILE_CLOSED) {
1802 wsApp->rejectSoftwareUpdate();
1810 void MainWindow::on_actionFileOpen_triggered()
1815 void MainWindow::on_actionFileMerge_triggered()
1820 void MainWindow::on_actionFileImportFromHexDump_triggered()
1822 importCaptureFile();
1825 void MainWindow::on_actionFileClose_triggered() {
1826 QString before_what(tr(" before closing the file"));
1827 if (testCaptureFileClose(before_what))
1828 main_ui_->mainStack->setCurrentWidget(main_welcome_);
1831 void MainWindow::on_actionFileSave_triggered()
1833 saveCaptureFile(capture_file_.capFile(), false);
1836 void MainWindow::on_actionFileSaveAs_triggered()
1838 saveAsCaptureFile(capture_file_.capFile());
1841 void MainWindow::on_actionFileSetListFiles_triggered()
1843 file_set_dialog_->show();
1846 void MainWindow::on_actionFileSetNextFile_triggered()
1848 fileset_entry *entry = fileset_get_next();
1851 QString new_cf_path = entry->fullname;
1852 openCaptureFile(new_cf_path);
1856 void MainWindow::on_actionFileSetPreviousFile_triggered()
1858 fileset_entry *entry = fileset_get_previous();
1861 QString new_cf_path = entry->fullname;
1862 openCaptureFile(new_cf_path);
1866 void MainWindow::on_actionFileExportPackets_triggered()
1868 exportSelectedPackets();
1871 void MainWindow::on_actionFileExportAsPlainText_triggered()
1873 exportDissections(export_type_text);
1876 void MainWindow::on_actionFileExportAsCSV_triggered()
1878 exportDissections(export_type_csv);
1881 void MainWindow::on_actionFileExportAsCArrays_triggered()
1883 exportDissections(export_type_carrays);
1886 void MainWindow::on_actionFileExportAsPSML_triggered()
1888 exportDissections(export_type_psml);
1891 void MainWindow::on_actionFileExportAsPDML_triggered()
1893 exportDissections(export_type_pdml);
1896 void MainWindow::on_actionFileExportAsJSON_triggered()
1898 exportDissections(export_type_json);
1901 void MainWindow::on_actionFileExportPacketBytes_triggered()
1905 if (!capture_file_.capFile() || !capture_file_.capFile()->finfo_selected) return;
1907 file_name = QFileDialog::getSaveFileName(this,
1908 wsApp->windowTitleString(tr("Export Selected Packet Bytes")),
1909 wsApp->lastOpenDir().canonicalPath(),
1910 tr("Raw data (*.bin *.dat *.raw);;All Files (" ALL_FILES_WILDCARD ")")
1913 if (file_name.length() > 0) {
1914 const guint8 *data_p;
1917 data_p = tvb_get_ptr(capture_file_.capFile()->finfo_selected->ds_tvb, 0, -1) +
1918 capture_file_.capFile()->finfo_selected->start;
1919 fd = ws_open(file_name.toUtf8().constData(), O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
1921 open_failure_alert_box(file_name.toUtf8().constData(), errno, TRUE);
1924 if (ws_write(fd, data_p, capture_file_.capFile()->finfo_selected->length) < 0) {
1925 write_failure_alert_box(file_name.toUtf8().constData(), errno);
1929 if (ws_close(fd) < 0) {
1930 write_failure_alert_box(file_name.toUtf8().constData(), errno);
1934 /* Save the directory name for future file dialogs. */
1935 wsApp->setLastOpenDir(&file_name);
1939 void MainWindow::on_actionContextShowPacketBytes_triggered()
1941 ShowPacketBytesDialog *spbd = new ShowPacketBytesDialog(*this, capture_file_);
1945 void MainWindow::on_actionFileExportPDU_triggered()
1947 ExportPDUDialog *exportpdu_dialog = new ExportPDUDialog(this);
1949 if (exportpdu_dialog->isMinimized() == true)
1951 exportpdu_dialog->showNormal();
1955 exportpdu_dialog->show();
1958 exportpdu_dialog->raise();
1959 exportpdu_dialog->activateWindow();
1962 void MainWindow::on_actionFileExportSSLSessionKeys_triggered()
1968 keylist_len = ssl_session_key_count();
1969 /* don't show up the dialog, if no data has to be saved */
1970 if (keylist_len < 1) {
1971 /* shouldn't happen as the menu item should have been greyed out */
1972 QMessageBox::warning(
1975 tr("There are no SSL Session Keys to save."),
1981 save_title.append(wsApp->windowTitleString(tr("Export SSL Session Keys (%Ln key(s))", "", keylist_len)));
1982 file_name = QFileDialog::getSaveFileName(this,
1984 wsApp->lastOpenDir().canonicalPath(),
1985 tr("SSL Session Keys (*.keys *.txt);;All Files (" ALL_FILES_WILDCARD ")")
1987 if (file_name.length() > 0) {
1991 keylist = ssl_export_sessions();
1992 fd = ws_open(file_name.toUtf8().constData(), O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
1994 open_failure_alert_box(file_name.toUtf8().constData(), errno, TRUE);
1999 * Thanks, Microsoft, for not using size_t for the third argument to
2000 * _write(). Presumably this string will be <= 4GiB long....
2002 if (ws_write(fd, keylist, (unsigned int)strlen(keylist)) < 0) {
2003 write_failure_alert_box(file_name.toUtf8().constData(), errno);
2008 if (ws_close(fd) < 0) {
2009 write_failure_alert_box(file_name.toUtf8().constData(), errno);
2014 /* Save the directory name for future file dialogs. */
2015 wsApp->setLastOpenDir(&file_name);
2020 void MainWindow::on_actionStatisticsHpfeeds_triggered()
2022 openStatisticsTreeDialog("hpfeeds");
2025 void MainWindow::on_actionFilePrint_triggered()
2027 PrintDialog pdlg(this, capture_file_.capFile());
2034 void MainWindow::recursiveCopyProtoTreeItems(QTreeWidgetItem *item, QString &clip, int ident_level) {
2035 if (!item->isExpanded()) return;
2037 for (int i_item = 0; i_item < item->childCount(); i_item += 1) {
2038 clip.append(QString(" ").repeated(ident_level));
2039 clip.append(item->child(i_item)->text(0));
2042 recursiveCopyProtoTreeItems(item->child(i_item), clip, ident_level + 1);
2046 // XXX This should probably be somewhere else.
2047 void MainWindow::actionEditCopyTriggered(MainWindow::CopySelected selection_type)
2049 char label_str[ITEM_LABEL_LENGTH];
2052 if (!capture_file_.capFile()) return;
2054 field_info *finfo_selected = capture_file_.capFile()->finfo_selected;
2056 switch(selection_type) {
2057 case CopySelectedDescription:
2058 if (finfo_selected && finfo_selected->rep
2059 && strlen (finfo_selected->rep->representation) > 0) {
2060 clip.append(finfo_selected->rep->representation);
2063 case CopySelectedFieldName:
2064 if (finfo_selected && finfo_selected->hfinfo->abbrev != 0) {
2065 clip.append(finfo_selected->hfinfo->abbrev);
2068 case CopySelectedValue:
2069 if (finfo_selected && capture_file_.capFile()->edt != 0) {
2070 gchar* field_str = get_node_field_value(finfo_selected, capture_file_.capFile()->edt);
2071 clip.append(field_str);
2075 case CopyAllVisibleItems:
2076 for (int i_item = 0; i_item < proto_tree_->topLevelItemCount(); i_item += 1) {
2077 clip.append(proto_tree_->topLevelItem(i_item)->text(0));
2080 recursiveCopyProtoTreeItems(proto_tree_->topLevelItem(i_item), clip, 1);
2084 case CopyAllVisibleSelectedTreeItems:
2085 if (proto_tree_->selectedItems().count() > 0) {
2086 clip.append(proto_tree_->currentItem()->text(0));
2089 recursiveCopyProtoTreeItems(proto_tree_->currentItem(), clip, 1);
2094 if (clip.length() == 0) {
2095 /* If no representation then... Try to read the value */
2096 proto_item_fill_label(capture_file_.capFile()->finfo_selected, label_str);
2097 clip.append(label_str);
2100 if (clip.length()) {
2101 wsApp->clipboard()->setText(clip);
2103 QString err = tr("Couldn't copy text. Try another item.");
2104 main_ui_->statusBar->pushTemporaryStatus(err);
2108 void MainWindow::on_actionCopyAllVisibleItems_triggered()
2110 actionEditCopyTriggered(CopyAllVisibleItems);
2113 void MainWindow::on_actionCopyAllVisibleSelectedTreeItems_triggered()
2115 actionEditCopyTriggered(CopyAllVisibleSelectedTreeItems);
2118 void MainWindow::on_actionEditCopyDescription_triggered()
2120 actionEditCopyTriggered(CopySelectedDescription);
2123 void MainWindow::on_actionEditCopyFieldName_triggered()
2125 actionEditCopyTriggered(CopySelectedFieldName);
2128 void MainWindow::on_actionEditCopyValue_triggered()
2130 actionEditCopyTriggered(CopySelectedValue);
2133 void MainWindow::on_actionEditCopyAsFilter_triggered()
2135 matchFieldFilter(FilterAction::ActionCopy, FilterAction::ActionTypePlain);
2138 void MainWindow::on_actionEditFindPacket_triggered()
2140 if (packet_list_->packetListModel()->rowCount() < 1) {
2143 previous_focus_ = wsApp->focusWidget();
2144 connect(previous_focus_, SIGNAL(destroyed()), this, SLOT(resetPreviousFocus()));
2145 if (! main_ui_->searchFrame->isVisible()) {
2146 showAccordionFrame(main_ui_->searchFrame, true);
2148 main_ui_->searchFrame->setFocus();
2151 void MainWindow::on_actionEditFindNext_triggered()
2153 main_ui_->searchFrame->findNext();
2156 void MainWindow::on_actionEditFindPrevious_triggered()
2158 main_ui_->searchFrame->findPrevious();
2161 void MainWindow::on_actionEditMarkPacket_triggered()
2164 packet_list_->markFrame();
2168 void MainWindow::on_actionEditMarkAllDisplayed_triggered()
2171 packet_list_->markAllDisplayedFrames(true);
2175 void MainWindow::on_actionEditUnmarkAllDisplayed_triggered()
2178 packet_list_->markAllDisplayedFrames(false);
2182 void MainWindow::on_actionEditNextMark_triggered()
2184 if (capture_file_.capFile())
2185 cf_find_packet_marked(capture_file_.capFile(), SD_FORWARD);
2188 void MainWindow::on_actionEditPreviousMark_triggered()
2190 if (capture_file_.capFile())
2191 cf_find_packet_marked(capture_file_.capFile(), SD_BACKWARD);
2194 void MainWindow::on_actionEditIgnorePacket_triggered()
2197 packet_list_->ignoreFrame();
2201 void MainWindow::on_actionEditIgnoreAllDisplayed_triggered()
2204 packet_list_->ignoreAllDisplayedFrames(true);
2208 void MainWindow::on_actionEditUnignoreAllDisplayed_triggered()
2211 packet_list_->ignoreAllDisplayedFrames(false);
2215 void MainWindow::on_actionEditSetTimeReference_triggered()
2217 packet_list_->setTimeReference();
2220 void MainWindow::on_actionEditUnsetAllTimeReferences_triggered()
2222 packet_list_->unsetAllTimeReferences();
2225 void MainWindow::on_actionEditNextTimeReference_triggered()
2227 if (!capture_file_.capFile()) return;
2228 cf_find_packet_time_reference(capture_file_.capFile(), SD_FORWARD);
2231 void MainWindow::on_actionEditPreviousTimeReference_triggered()
2233 if (!capture_file_.capFile()) return;
2234 cf_find_packet_time_reference(capture_file_.capFile(), SD_BACKWARD);
2237 void MainWindow::on_actionEditTimeShift_triggered()
2239 TimeShiftDialog ts_dialog(this, capture_file_.capFile());
2240 connect(this, SIGNAL(setCaptureFile(capture_file*)),
2241 &ts_dialog, SLOT(setCaptureFile(capture_file*)));
2242 connect(&ts_dialog, SIGNAL(timeShifted()), packet_list_, SLOT(applyTimeShift()));
2246 void MainWindow::on_actionEditPacketComment_triggered()
2248 PacketCommentDialog pc_dialog(this, packet_list_->packetComment());
2249 if (pc_dialog.exec() == QDialog::Accepted) {
2250 packet_list_->setPacketComment(pc_dialog.text());
2251 updateForUnsavedChanges();
2255 void MainWindow::on_actionEditConfigurationProfiles_triggered()
2257 ProfileDialog cp_dialog;
2262 void MainWindow::showPreferencesDialog(PreferencesDialog::PreferencesPane start_pane)
2264 PreferencesDialog pref_dialog(this);
2266 saveWindowGeometry(); // Save in case the layout panes are rearranged
2268 pref_dialog.setPane(start_pane);
2271 // Emitting PacketDissectionChanged directly from a QDialog can cause
2272 // problems on macOS.
2273 wsApp->flushAppSignals();
2276 void MainWindow::showPreferencesDialog(QString module_name)
2278 PreferencesDialog pref_dialog(this);
2280 saveWindowGeometry(); // Save in case the layout panes are rearranged
2282 pref_dialog.setPane(module_name);
2285 // Emitting PacketDissectionChanged directly from a QDialog can cause
2286 // problems on macOS.
2287 wsApp->flushAppSignals();
2290 void MainWindow::on_actionEditPreferences_triggered()
2292 showPreferencesDialog();
2297 void MainWindow::showHideMainWidgets(QAction *action)
2302 bool show = action->isChecked();
2303 QWidget *widget = action->data().value<QWidget*>();
2305 // We may have come from the toolbar context menu, so check/uncheck each
2307 if (widget == main_ui_->mainToolBar) {
2308 recent.main_toolbar_show = show;
2309 main_ui_->actionViewMainToolbar->setChecked(show);
2310 } else if (widget == main_ui_->displayFilterToolBar) {
2311 recent.filter_toolbar_show = show;
2312 main_ui_->actionViewFilterToolbar->setChecked(show);
2313 } else if (widget == main_ui_->wirelessToolBar) {
2314 recent.wireless_toolbar_show = show;
2315 main_ui_->actionViewWirelessToolbar->setChecked(show);
2316 } else if (widget == main_ui_->statusBar) {
2317 recent.statusbar_show = show;
2318 main_ui_->actionViewStatusBar->setChecked(show);
2319 } else if (widget == packet_list_) {
2320 recent.packet_list_show = show;
2321 main_ui_->actionViewPacketList->setChecked(show);
2322 } else if (widget == proto_tree_) {
2323 recent.tree_view_show = show;
2324 main_ui_->actionViewPacketDetails->setChecked(show);
2325 } else if (widget == byte_view_tab_) {
2326 recent.byte_view_show = show;
2327 main_ui_->actionViewPacketBytes->setChecked(show);
2329 foreach (QAction *action, main_ui_->menuInterfaceToolbars->actions()) {
2330 QToolBar *toolbar = action->data().value<QToolBar *>();
2331 if (widget == toolbar) {
2332 GList *entry = g_list_find_custom(recent.interface_toolbars, action->text().toUtf8(), (GCompareFunc) strcmp);
2333 if (show && !entry) {
2334 recent.interface_toolbars = g_list_append(recent.interface_toolbars, g_strdup(action->text().toUtf8()));
2335 } else if (!show && entry) {
2336 recent.interface_toolbars = g_list_remove(recent.interface_toolbars, entry->data);
2338 action->setChecked(show);
2342 ext_toolbar_t * toolbar = VariantPointer<ext_toolbar_t>::asPtr(action->data());
2344 GList *entry = g_list_find_custom(recent.gui_additional_toolbars, toolbar->name, (GCompareFunc) strcmp);
2345 if (show && !entry) {
2346 recent.gui_additional_toolbars = g_list_append(recent.gui_additional_toolbars, g_strdup(toolbar->name));
2347 } else if (!show && entry) {
2348 recent.gui_additional_toolbars = g_list_remove(recent.gui_additional_toolbars, entry->data);
2350 action->setChecked(show);
2352 QList<QToolBar *> toolbars = findChildren<QToolBar *>();
2353 foreach (QToolBar *bar, toolbars) {
2354 AdditionalToolBar *iftoolbar = dynamic_cast<AdditionalToolBar *>(bar);
2355 if (iftoolbar && iftoolbar->menuName().compare(toolbar->name) == 0) {
2356 iftoolbar->setVisible(show);
2363 widget->setVisible(show);
2367 void MainWindow::setTimestampFormat(QAction *action)
2372 ts_type tsf = action->data().value<ts_type>();
2373 if (recent.gui_time_format != tsf) {
2374 timestamp_set_type(tsf);
2375 recent.gui_time_format = tsf;
2378 packet_list_->resetColumns();
2380 if (capture_file_.capFile()) {
2381 /* This call adjusts column width */
2382 cf_timestamp_auto_precision(capture_file_.capFile());
2387 void MainWindow::setTimestampPrecision(QAction *action)
2392 ts_precision tsp = action->data().value<ts_precision>();
2393 if (recent.gui_time_precision != tsp) {
2394 /* the actual precision will be set in packet_list_queue_draw() below */
2395 timestamp_set_precision(tsp);
2396 recent.gui_time_precision = tsp;
2399 packet_list_->resetColumns();
2401 if (capture_file_.capFile()) {
2402 /* This call adjusts column width */
2403 cf_timestamp_auto_precision(capture_file_.capFile());
2408 void MainWindow::on_actionViewTimeDisplaySecondsWithHoursAndMinutes_triggered(bool checked)
2411 recent.gui_seconds_format = TS_SECONDS_HOUR_MIN_SEC;
2413 recent.gui_seconds_format = TS_SECONDS_DEFAULT;
2415 timestamp_set_seconds_type(recent.gui_seconds_format);
2418 packet_list_->resetColumns();
2420 if (capture_file_.capFile()) {
2421 /* This call adjusts column width */
2422 cf_timestamp_auto_precision(capture_file_.capFile());
2426 void MainWindow::on_actionViewEditResolvedName_triggered()
2428 // int column = packet_list_->selectedColumn();
2431 if (packet_list_->currentIndex().isValid()) {
2432 column = packet_list_->currentIndex().column();
2435 main_ui_->addressEditorFrame->editAddresses(capture_file_, column);
2436 showAccordionFrame(main_ui_->addressEditorFrame);
2439 void MainWindow::setNameResolution()
2441 gbl_resolv_flags.mac_name = main_ui_->actionViewNameResolutionPhysical->isChecked() ? TRUE : FALSE;
2442 gbl_resolv_flags.network_name = main_ui_->actionViewNameResolutionNetwork->isChecked() ? TRUE : FALSE;
2443 gbl_resolv_flags.transport_name = main_ui_->actionViewNameResolutionTransport->isChecked() ? TRUE : FALSE;
2446 packet_list_->resetColumns();
2448 wsApp->emitAppSignal(WiresharkApplication::NameResolutionChanged);
2451 void MainWindow::on_actionViewNameResolutionPhysical_triggered()
2453 setNameResolution();
2456 void MainWindow::on_actionViewNameResolutionNetwork_triggered()
2458 setNameResolution();
2461 void MainWindow::on_actionViewNameResolutionTransport_triggered()
2463 setNameResolution();
2466 void MainWindow::zoomText()
2468 // Scale by 10%, rounding to nearest half point, minimum 1 point.
2469 // XXX Small sizes repeat. It might just be easier to create a map of multipliers.
2470 mono_font_ = QFont(wsApp->monospaceFont());
2471 qreal zoom_size = wsApp->monospaceFont().pointSize() * 2 * qPow(qreal(1.1), recent.gui_zoom_level);
2472 zoom_size = qRound(zoom_size) / qreal(2.0);
2473 zoom_size = qMax(zoom_size, qreal(1.0));
2474 mono_font_.setPointSizeF(zoom_size);
2475 emit monospaceFontChanged(mono_font_);
2478 void MainWindow::on_actionViewZoomIn_triggered()
2480 recent.gui_zoom_level++;
2484 void MainWindow::on_actionViewZoomOut_triggered()
2486 recent.gui_zoom_level--;
2490 void MainWindow::on_actionViewNormalSize_triggered()
2492 recent.gui_zoom_level = 0;
2496 void MainWindow::on_actionWirelessTimelineZoomIn_triggered()
2498 main_ui_->wirelessTimelineWidget->zoomIn();
2501 void MainWindow::on_actionWirelessTimelineZoomOut_triggered()
2503 main_ui_->wirelessTimelineWidget->zoomOut();
2506 void MainWindow::on_actionWirelessTimelineZoomFullOut_triggered()
2508 main_ui_->wirelessTimelineWidget->zoomFullOut();
2511 void MainWindow::on_actionViewColorizePacketList_triggered(bool checked) {
2512 recent.packet_list_colorize = checked;
2513 packet_list_enable_color(checked);
2514 packet_list_->packetListModel()->resetColorized();
2517 void MainWindow::on_actionViewColoringRules_triggered()
2519 ColoringRulesDialog coloring_rules_dialog(this);
2520 connect(&coloring_rules_dialog, SIGNAL(accepted()),
2521 packet_list_, SLOT(recolorPackets()));
2522 coloring_rules_dialog.exec();
2525 // actionViewColorizeConversation1 - 10
2526 void MainWindow::colorizeConversation(bool create_rule)
2528 QAction *colorize_action = qobject_cast<QAction *>(sender());
2529 if (!colorize_action) return;
2531 if (capture_file_.capFile() && capture_file_.capFile()->current_frame) {
2532 packet_info *pi = capture_file_.packetInfo();
2533 guint8 cc_num = colorize_action->data().toUInt();
2534 gchar *filter = conversation_filter_from_packet(pi);
2535 if (filter == NULL) {
2536 main_ui_->statusBar->pushTemporaryStatus(tr("Unable to build conversation filter."));
2541 ColoringRulesDialog coloring_rules_dialog(this, filter);
2542 connect(&coloring_rules_dialog, SIGNAL(accepted()),
2543 packet_list_, SLOT(recolorPackets()));
2544 coloring_rules_dialog.exec();
2546 gchar *err_msg = NULL;
2547 if (!color_filters_set_tmp(cc_num, filter, FALSE, &err_msg)) {
2548 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
2551 packet_list_->recolorPackets();
2554 setMenusForSelectedPacket();
2557 void MainWindow::colorizeActionTriggered()
2560 int color_number = -1;
2562 ConversationAction *conv_action = qobject_cast<ConversationAction *>(sender());
2564 filter = conv_action->filter();
2565 color_number = conv_action->colorNumber();
2567 ColorizeAction *colorize_action = qobject_cast<ColorizeAction *>(sender());
2568 if (colorize_action) {
2569 filter = colorize_action->filter();
2570 color_number = colorize_action->colorNumber();
2574 colorizeWithFilter(filter, color_number);
2577 void MainWindow::colorizeWithFilter(QByteArray filter, int color_number)
2579 if (filter.isEmpty()) return;
2581 if (color_number > 0) {
2583 gchar *err_msg = NULL;
2584 if (!color_filters_set_tmp(color_number, filter.constData(), FALSE, &err_msg)) {
2585 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
2588 packet_list_->recolorPackets();
2590 // New coloring rule
2591 ColoringRulesDialog coloring_rules_dialog(window(), filter);
2592 connect(&coloring_rules_dialog, SIGNAL(accepted()),
2593 packet_list_, SLOT(recolorPackets()));
2594 coloring_rules_dialog.exec();
2596 main_ui_->actionViewColorizeResetColorization->setEnabled(tmp_color_filters_used());
2599 void MainWindow::on_actionViewColorizeResetColorization_triggered()
2601 gchar *err_msg = NULL;
2602 if (!color_filters_reset_tmp(&err_msg)) {
2603 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
2606 packet_list_->recolorPackets();
2607 setMenusForSelectedPacket();
2610 void MainWindow::on_actionViewColorizeNewColoringRule_triggered()
2612 colorizeConversation(true);
2615 void MainWindow::on_actionViewResetLayout_triggered()
2617 recent.gui_geometry_main_upper_pane = 0;
2618 recent.gui_geometry_main_lower_pane = 0;
2620 applyRecentPaneGeometry();
2623 void MainWindow::on_actionViewResizeColumns_triggered()
2625 for (int col = 0; col < packet_list_->packetListModel()->columnCount(); col++) {
2626 packet_list_->resizeColumnToContents(col);
2627 recent_set_column_width(col, packet_list_->columnWidth(col));
2631 void MainWindow::openPacketDialog(bool from_reference)
2635 /* Find the frame for which we're popping up a dialog */
2636 if(from_reference) {
2637 guint32 framenum = fvalue_get_uinteger(&(capture_file_.capFile()->finfo_selected->value));
2641 fdata = frame_data_sequence_find(capture_file_.capFile()->frames, framenum);
2643 fdata = capture_file_.capFile()->current_frame;
2646 /* If we have a frame, pop up the dialog */
2648 PacketDialog *packet_dialog = new PacketDialog(*this, capture_file_, fdata);
2650 connect(this, SIGNAL(monospaceFontChanged(QFont)),
2651 packet_dialog, SIGNAL(monospaceFontChanged(QFont)));
2652 connect(this, SIGNAL(closePacketDialogs()),
2653 packet_dialog, SLOT(close()));
2654 zoomText(); // Emits monospaceFontChanged
2656 packet_dialog->show();
2660 void MainWindow::on_actionViewInternalsConversationHashTables_triggered()
2662 ConversationHashTablesDialog *conversation_hash_tables_dlg = new ConversationHashTablesDialog(this);
2663 conversation_hash_tables_dlg->show();
2666 void MainWindow::on_actionViewInternalsDissectorTables_triggered()
2668 DissectorTablesDialog *dissector_tables_dlg = new DissectorTablesDialog(this);
2669 dissector_tables_dlg->show();
2672 void MainWindow::on_actionViewInternalsSupportedProtocols_triggered()
2674 SupportedProtocolsDialog *supported_protocols_dlg = new SupportedProtocolsDialog(this);
2675 supported_protocols_dlg->show();
2678 void MainWindow::on_actionViewShowPacketInNewWindow_triggered()
2683 // This is only used in ProtoTree. Defining it here makes more sense.
2684 void MainWindow::on_actionContextShowLinkedPacketInNewWindow_triggered()
2686 openPacketDialog(true);
2689 void MainWindow::on_actionViewReload_triggered()
2691 capture_file *cf = CaptureFile::globalCapFile();
2693 if (cf->unsaved_changes) {
2694 QString before_what(tr(" before reloading the file"));
2695 if (!testCaptureFileClose(before_what, Reload))
2702 void MainWindow::on_actionViewReload_as_File_Format_or_Capture_triggered()
2704 capture_file *cf = CaptureFile::globalCapFile();
2706 if (cf->unsaved_changes) {
2707 QString before_what(tr(" before reloading the file"));
2708 if (!testCaptureFileClose(before_what, Reload))
2712 if (cf->open_type == WTAP_TYPE_AUTO)
2713 cf->open_type = open_info_name_to_type("MIME Files Format");
2714 else /* TODO: This should be latest format chosen by user */
2715 cf->open_type = WTAP_TYPE_AUTO;
2721 // Expand / collapse slots in proto_tree
2727 void MainWindow::matchFieldFilter(FilterAction::Action action, FilterAction::ActionType filter_type)
2729 QString field_filter;
2731 if (packet_list_->contextMenuActive() || packet_list_->hasFocus()) {
2732 field_filter = packet_list_->getFilterFromRowAndColumn();
2733 } else if (capture_file_.capFile() && capture_file_.capFile()->finfo_selected) {
2734 char *tmp_field = proto_construct_match_selected_string(capture_file_.capFile()->finfo_selected,
2735 capture_file_.capFile()->edt);
2736 field_filter = QString(tmp_field);
2737 wmem_free(NULL, tmp_field);
2740 if (field_filter.isEmpty()) {
2741 QString err = tr("No filter available. Try another ");
2742 err.append(packet_list_->contextMenuActive() ? "column" : "item");
2744 main_ui_->statusBar->pushTemporaryStatus(err);
2748 emit filterAction(field_filter, action, filter_type);
2751 static FilterDialog *display_filter_dlg_ = NULL;
2752 void MainWindow::on_actionAnalyzeDisplayFilters_triggered()
2754 if (!display_filter_dlg_) {
2755 display_filter_dlg_ = new FilterDialog(this, FilterDialog::DisplayFilter);
2757 display_filter_dlg_->show();
2758 display_filter_dlg_->raise();
2759 display_filter_dlg_->activateWindow();
2763 void MainWindow::on_actionAnalyzeDisplayFilterMacros_triggered()
2765 struct epan_uat* dfm_uat;
2766 dfilter_macro_get_uat(&dfm_uat);
2767 UatDialog uat_dlg(parentWidget(), dfm_uat);
2770 // Emitting PacketDissectionChanged directly from a QDialog can cause
2771 // problems on macOS.
2772 wsApp->flushAppSignals();
2775 void MainWindow::on_actionAnalyzeCreateAColumn_triggered()
2779 if (capture_file_.capFile() != 0 && capture_file_.capFile()->finfo_selected != 0) {
2780 colnr = column_prefs_add_custom(COL_CUSTOM, capture_file_.capFile()->finfo_selected->hfinfo->name,
2781 capture_file_.capFile()->finfo_selected->hfinfo->abbrev,0);
2783 packet_list_->columnsChanged();
2784 packet_list_->resizeColumnToContents(colnr);
2790 void MainWindow::applyConversationFilter()
2792 ConversationAction *conv_action = qobject_cast<ConversationAction*>(sender());
2793 if (!conv_action) return;
2795 packet_info *pinfo = capture_file_.packetInfo();
2798 QByteArray conv_filter = conv_action->filter();
2799 if (conv_filter.isEmpty()) return;
2801 if (conv_action->isFilterValid(pinfo)) {
2803 df_combo_box_->lineEdit()->setText(conv_filter);
2804 df_combo_box_->applyDisplayFilter();
2808 void MainWindow::applyExportObject()
2810 ExportObjectAction *export_action = qobject_cast<ExportObjectAction*>(sender());
2814 new ExportObjectDialog(*this, capture_file_, export_action->exportObject());
2817 // XXX We could probably create the analyze and prepare actions
2818 // dynamically using FilterActions and consolidate the methods
2819 // below into one callback.
2820 void MainWindow::on_actionAnalyzeAAFSelected_triggered()
2822 matchFieldFilter(FilterAction::ActionApply, FilterAction::ActionTypePlain);
2825 void MainWindow::on_actionAnalyzeAAFNotSelected_triggered()
2827 matchFieldFilter(FilterAction::ActionApply, FilterAction::ActionTypeNot);
2830 void MainWindow::on_actionAnalyzeAAFAndSelected_triggered()
2832 matchFieldFilter(FilterAction::ActionApply, FilterAction::ActionTypeAnd);
2835 void MainWindow::on_actionAnalyzeAAFOrSelected_triggered()
2837 matchFieldFilter(FilterAction::ActionApply, FilterAction::ActionTypeOr);
2840 void MainWindow::on_actionAnalyzeAAFAndNotSelected_triggered()
2842 matchFieldFilter(FilterAction::ActionApply, FilterAction::ActionTypeAndNot);
2845 void MainWindow::on_actionAnalyzeAAFOrNotSelected_triggered()
2847 matchFieldFilter(FilterAction::ActionApply, FilterAction::ActionTypeOrNot);
2850 void MainWindow::on_actionAnalyzePAFSelected_triggered()
2852 matchFieldFilter(FilterAction::ActionPrepare, FilterAction::ActionTypePlain);
2855 void MainWindow::on_actionAnalyzePAFNotSelected_triggered()
2857 matchFieldFilter(FilterAction::ActionPrepare, FilterAction::ActionTypeNot);
2860 void MainWindow::on_actionAnalyzePAFAndSelected_triggered()
2862 matchFieldFilter(FilterAction::ActionPrepare, FilterAction::ActionTypeAnd);
2865 void MainWindow::on_actionAnalyzePAFOrSelected_triggered()
2867 matchFieldFilter(FilterAction::ActionPrepare, FilterAction::ActionTypeOr);
2870 void MainWindow::on_actionAnalyzePAFAndNotSelected_triggered()
2872 matchFieldFilter(FilterAction::ActionPrepare, FilterAction::ActionTypeAndNot);
2875 void MainWindow::on_actionAnalyzePAFOrNotSelected_triggered()
2877 matchFieldFilter(FilterAction::ActionPrepare, FilterAction::ActionTypeOrNot);
2880 void MainWindow::on_actionAnalyzeEnabledProtocols_triggered()
2882 EnabledProtocolsDialog enable_proto_dialog(this);
2883 enable_proto_dialog.exec();
2885 // Emitting PacketDissectionChanged directly from a QDialog can cause
2886 // problems on macOS.
2887 wsApp->flushAppSignals();
2890 void MainWindow::on_actionAnalyzeDecodeAs_triggered()
2892 QAction *da_action = qobject_cast<QAction*>(sender());
2893 bool create_new = false;
2894 if (da_action && da_action->data().toBool() == true) {
2898 DecodeAsDialog da_dialog(this, capture_file_.capFile(), create_new);
2899 connect(this, SIGNAL(setCaptureFile(capture_file*)),
2900 &da_dialog, SLOT(setCaptureFile(capture_file*)));
2903 // Emitting PacketDissectionChanged directly from a QDialog can cause
2904 // problems on macOS.
2905 wsApp->flushAppSignals();
2908 void MainWindow::on_actionAnalyzeReloadLuaPlugins_triggered()
2913 void MainWindow::openFollowStreamDialog(follow_type_t type) {
2914 FollowStreamDialog *fsd = new FollowStreamDialog(*this, capture_file_, type);
2915 connect(fsd, SIGNAL(updateFilter(QString, bool)), this, SLOT(filterPackets(QString, bool)));
2916 connect(fsd, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int)));
2919 fsd->follow(getFilter());
2922 void MainWindow::on_actionAnalyzeFollowTCPStream_triggered()
2924 openFollowStreamDialog(FOLLOW_TCP);
2927 void MainWindow::on_actionAnalyzeFollowUDPStream_triggered()
2929 openFollowStreamDialog(FOLLOW_UDP);
2932 void MainWindow::on_actionAnalyzeFollowSSLStream_triggered()
2934 openFollowStreamDialog(FOLLOW_SSL);
2937 void MainWindow::on_actionAnalyzeFollowHTTPStream_triggered()
2939 openFollowStreamDialog(FOLLOW_HTTP);
2942 void MainWindow::openSCTPAllAssocsDialog()
2944 SCTPAllAssocsDialog *sctp_dialog = new SCTPAllAssocsDialog(this, capture_file_.capFile());
2945 connect(sctp_dialog, SIGNAL(filterPackets(QString,bool)),
2946 this, SLOT(filterPackets(QString,bool)));
2947 connect(this, SIGNAL(setCaptureFile(capture_file*)),
2948 sctp_dialog, SLOT(setCaptureFile(capture_file*)));
2949 sctp_dialog->fillTable();
2951 if (sctp_dialog->isMinimized() == true)
2953 sctp_dialog->showNormal();
2957 sctp_dialog->show();
2960 sctp_dialog->raise();
2961 sctp_dialog->activateWindow();
2964 void MainWindow::on_actionSCTPShowAllAssociations_triggered()
2966 openSCTPAllAssocsDialog();
2969 void MainWindow::on_actionSCTPAnalyseThisAssociation_triggered()
2971 SCTPAssocAnalyseDialog *sctp_analyse = new SCTPAssocAnalyseDialog(this, NULL, capture_file_.capFile());
2972 connect(sctp_analyse, SIGNAL(filterPackets(QString,bool)),
2973 this, SLOT(filterPackets(QString,bool)));
2975 if (sctp_analyse->isMinimized() == true)
2977 sctp_analyse->showNormal();
2981 sctp_analyse->show();
2984 sctp_analyse->raise();
2985 sctp_analyse->activateWindow();
2988 void MainWindow::on_actionSCTPFilterThisAssociation_triggered()
2990 sctp_assoc_info_t* assoc = SCTPAssocAnalyseDialog::findAssocForPacket(capture_file_.capFile());
2992 QString newFilter = QString("sctp.assoc_index==%1").arg(assoc->assoc_id);
2994 emit filterPackets(newFilter, false);
2999 void MainWindow::statCommandWlanStatistics(const char *arg, void *)
3001 WlanStatisticsDialog *wlan_stats_dlg = new WlanStatisticsDialog(*this, capture_file_, arg);
3002 connect(wlan_stats_dlg, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
3003 this, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)));
3004 wlan_stats_dlg->show();
3007 void MainWindow::on_actionWirelessWlanStatistics_triggered()
3009 statCommandWlanStatistics(NULL, NULL);
3013 void MainWindow::statCommandExpertInfo(const char *, void *)
3015 ExpertInfoDialog *expert_dialog = new ExpertInfoDialog(*this, capture_file_);
3016 const DisplayFilterEdit *df_edit = dynamic_cast<DisplayFilterEdit *>(df_combo_box_->lineEdit());
3018 expert_dialog->setDisplayFilter(df_edit->text());
3020 connect(expert_dialog, SIGNAL(goToPacket(int, int)),
3021 packet_list_, SLOT(goToPacket(int, int)));
3022 connect(expert_dialog, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
3023 this, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)));
3025 expert_dialog->show();
3028 void MainWindow::on_actionAnalyzeExpertInfo_triggered()
3030 statCommandExpertInfo(NULL, NULL);
3034 // Next / previous / first / last slots in packet_list
3038 void MainWindow::on_actionStatisticsFlowGraph_triggered()
3040 SequenceDialog *sequence_dialog = new SequenceDialog(*this, capture_file_);
3041 connect(sequence_dialog, SIGNAL(goToPacket(int)),
3042 packet_list_, SLOT(goToPacket(int)));
3043 sequence_dialog->show();
3046 void MainWindow::openTcpStreamDialog(int graph_type)
3048 TCPStreamDialog *stream_dialog = new TCPStreamDialog(this, capture_file_.capFile(), (tcp_graph_type)graph_type);
3049 connect(stream_dialog, SIGNAL(goToPacket(int)),
3050 packet_list_, SLOT(goToPacket(int)));
3051 connect(this, SIGNAL(setCaptureFile(capture_file*)),
3052 stream_dialog, SLOT(setCaptureFile(capture_file*)));
3053 if (stream_dialog->result() == QDialog::Accepted) {
3054 stream_dialog->show();
3058 void MainWindow::on_actionStatisticsTcpStreamStevens_triggered()
3060 openTcpStreamDialog(GRAPH_TSEQ_STEVENS);
3063 void MainWindow::on_actionStatisticsTcpStreamTcptrace_triggered()
3065 openTcpStreamDialog(GRAPH_TSEQ_TCPTRACE);
3068 void MainWindow::on_actionStatisticsTcpStreamThroughput_triggered()
3070 openTcpStreamDialog(GRAPH_THROUGHPUT);
3073 void MainWindow::on_actionStatisticsTcpStreamRoundTripTime_triggered()
3075 openTcpStreamDialog(GRAPH_RTT);
3078 void MainWindow::on_actionStatisticsTcpStreamWindowScaling_triggered()
3080 openTcpStreamDialog(GRAPH_WSCALE);
3084 void MainWindow::statCommandMulticastStatistics(const char *arg, void *)
3086 MulticastStatisticsDialog *mcast_stats_dlg = new MulticastStatisticsDialog(*this, capture_file_, arg);
3087 connect(mcast_stats_dlg, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
3088 this, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)));
3089 mcast_stats_dlg->show();
3092 void MainWindow::on_actionStatisticsUdpMulticastStreams_triggered()
3094 statCommandMulticastStatistics(NULL, NULL);
3097 void MainWindow::openStatisticsTreeDialog(const gchar *abbr)
3099 StatsTreeDialog *st_dialog = new StatsTreeDialog(*this, capture_file_, abbr);
3100 // connect(st_dialog, SIGNAL(goToPacket(int)),
3101 // packet_list_, SLOT(goToPacket(int)));
3105 void MainWindow::on_actionStatistics29WestTopics_Advertisements_by_Topic_triggered()
3107 openStatisticsTreeDialog("lbmr_topic_ads_topic");
3110 void MainWindow::on_actionStatistics29WestTopics_Advertisements_by_Source_triggered()
3112 openStatisticsTreeDialog("lbmr_topic_ads_source");
3115 void MainWindow::on_actionStatistics29WestTopics_Advertisements_by_Transport_triggered()
3117 openStatisticsTreeDialog("lbmr_topic_ads_transport");
3120 void MainWindow::on_actionStatistics29WestTopics_Queries_by_Topic_triggered()
3122 openStatisticsTreeDialog("lbmr_topic_queries_topic");
3125 void MainWindow::on_actionStatistics29WestTopics_Queries_by_Receiver_triggered()
3127 openStatisticsTreeDialog("lbmr_topic_queries_receiver");
3130 void MainWindow::on_actionStatistics29WestTopics_Wildcard_Queries_by_Pattern_triggered()
3132 openStatisticsTreeDialog("lbmr_topic_queries_pattern");
3135 void MainWindow::on_actionStatistics29WestTopics_Wildcard_Queries_by_Receiver_triggered()
3137 openStatisticsTreeDialog("lbmr_topic_queries_pattern_receiver");
3140 void MainWindow::on_actionStatistics29WestQueues_Advertisements_by_Queue_triggered()
3142 openStatisticsTreeDialog("lbmr_queue_ads_queue");
3145 void MainWindow::on_actionStatistics29WestQueues_Advertisements_by_Source_triggered()
3147 openStatisticsTreeDialog("lbmr_queue_ads_source");
3150 void MainWindow::on_actionStatistics29WestQueues_Queries_by_Queue_triggered()
3152 openStatisticsTreeDialog("lbmr_queue_queries_queue");
3155 void MainWindow::on_actionStatistics29WestQueues_Queries_by_Receiver_triggered()
3157 openStatisticsTreeDialog("lbmr_queue_queries_receiver");
3160 void MainWindow::on_actionStatistics29WestUIM_Streams_triggered()
3162 LBMStreamDialog *stream_dialog = new LBMStreamDialog(this, capture_file_.capFile());
3163 // connect(stream_dialog, SIGNAL(goToPacket(int)),
3164 // packet_list_, SLOT(goToPacket(int)));
3165 connect(this, SIGNAL(setCaptureFile(capture_file*)),
3166 stream_dialog, SLOT(setCaptureFile(capture_file*)));
3167 stream_dialog->show();
3170 void MainWindow::on_actionStatistics29WestUIM_Stream_Flow_Graph_triggered()
3172 LBMUIMFlowDialog * uimflow_dialog = new LBMUIMFlowDialog(this, capture_file_.capFile());
3173 connect(uimflow_dialog, SIGNAL(goToPacket(int)),
3174 packet_list_, SLOT(goToPacket(int)));
3175 connect(this, SIGNAL(setCaptureFile(capture_file*)),
3176 uimflow_dialog, SLOT(setCaptureFile(capture_file*)));
3177 uimflow_dialog->show();
3180 void MainWindow::on_actionStatistics29WestLBTRM_triggered()
3182 LBMLBTRMTransportDialog * lbtrm_dialog = new LBMLBTRMTransportDialog(this, capture_file_.capFile());
3183 connect(lbtrm_dialog, SIGNAL(goToPacket(int)),
3184 packet_list_, SLOT(goToPacket(int)));
3185 connect(this, SIGNAL(setCaptureFile(capture_file*)),
3186 lbtrm_dialog, SLOT(setCaptureFile(capture_file*)));
3187 lbtrm_dialog->show();
3189 void MainWindow::on_actionStatistics29WestLBTRU_triggered()
3191 LBMLBTRUTransportDialog * lbtru_dialog = new LBMLBTRUTransportDialog(this, capture_file_.capFile());
3192 connect(lbtru_dialog, SIGNAL(goToPacket(int)),
3193 packet_list_, SLOT(goToPacket(int)));
3194 connect(this, SIGNAL(setCaptureFile(capture_file*)),
3195 lbtru_dialog, SLOT(setCaptureFile(capture_file*)));
3196 lbtru_dialog->show();
3199 void MainWindow::on_actionStatisticsANCP_triggered()
3201 openStatisticsTreeDialog("ancp");
3204 void MainWindow::on_actionStatisticsBACappInstanceId_triggered()
3206 openStatisticsTreeDialog("bacapp_instanceid");
3209 void MainWindow::on_actionStatisticsBACappIP_triggered()
3211 openStatisticsTreeDialog("bacapp_ip");
3214 void MainWindow::on_actionStatisticsBACappObjectId_triggered()
3216 openStatisticsTreeDialog("bacapp_objectid");
3219 void MainWindow::on_actionStatisticsBACappService_triggered()
3221 openStatisticsTreeDialog("bacapp_service");
3224 void MainWindow::on_actionStatisticsCollectd_triggered()
3226 openStatisticsTreeDialog("collectd");
3230 void MainWindow::statCommandConversations(const char *arg, void *userdata)
3232 ConversationDialog *conv_dialog = new ConversationDialog(*this, capture_file_, GPOINTER_TO_INT(userdata), arg);
3233 connect(conv_dialog, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
3234 this, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)));
3235 connect(conv_dialog, SIGNAL(openFollowStreamDialog(follow_type_t)),
3236 this, SLOT(openFollowStreamDialog(follow_type_t)));
3237 connect(conv_dialog, SIGNAL(openTcpStreamGraph(int)),
3238 this, SLOT(openTcpStreamDialog(int)));
3239 conv_dialog->show();
3242 void MainWindow::on_actionStatisticsConversations_triggered()
3244 statCommandConversations(NULL, NULL);
3248 void MainWindow::statCommandEndpoints(const char *arg, void *userdata)
3250 EndpointDialog *endp_dialog = new EndpointDialog(*this, capture_file_, GPOINTER_TO_INT(userdata), arg);
3251 connect(endp_dialog, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
3252 this, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)));
3253 connect(endp_dialog, SIGNAL(openFollowStreamDialog(follow_type_t)),
3254 this, SLOT(openFollowStreamDialog(follow_type_t)));
3255 connect(endp_dialog, SIGNAL(openTcpStreamGraph(int)),
3256 this, SLOT(openTcpStreamDialog(int)));
3257 endp_dialog->show();
3260 void MainWindow::on_actionStatisticsEndpoints_triggered()
3262 statCommandEndpoints(NULL, NULL);
3265 void MainWindow::on_actionStatisticsHART_IP_triggered()
3267 openStatisticsTreeDialog("hart_ip");
3270 void MainWindow::on_actionStatisticsHTTPPacketCounter_triggered()
3272 openStatisticsTreeDialog("http");
3275 void MainWindow::on_actionStatisticsHTTPRequests_triggered()
3277 openStatisticsTreeDialog("http_req");
3280 void MainWindow::on_actionStatisticsHTTPLoadDistribution_triggered()
3282 openStatisticsTreeDialog("http_srv");
3285 void MainWindow::on_actionStatisticsPacketLengths_triggered()
3287 openStatisticsTreeDialog("plen");
3291 void MainWindow::statCommandIOGraph(const char *, void *)
3293 IOGraphDialog *iog_dialog = new IOGraphDialog(*this, capture_file_);
3294 connect(iog_dialog, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int)));
3295 connect(this, SIGNAL(reloadFields()), iog_dialog, SLOT(reloadFields()));
3299 void MainWindow::on_actionStatisticsIOGraph_triggered()
3301 statCommandIOGraph(NULL, NULL);
3304 void MainWindow::on_actionStatisticsSametime_triggered()
3306 openStatisticsTreeDialog("sametime");
3309 void MainWindow::on_actionStatisticsDNS_triggered()
3311 openStatisticsTreeDialog("dns");
3314 void MainWindow::actionStatisticsPlugin_triggered()
3316 QAction* action = qobject_cast<QAction*>(sender());
3318 openStatisticsTreeDialog(action->data().toString().toUtf8());
3322 void MainWindow::on_actionStatisticsHTTP2_triggered()
3324 openStatisticsTreeDialog("http2");
3330 void MainWindow::openVoipCallsDialog(bool all_flows)
3332 VoipCallsDialog *voip_calls_dialog = new VoipCallsDialog(*this, capture_file_, all_flows);
3333 connect(voip_calls_dialog, SIGNAL(goToPacket(int)),
3334 packet_list_, SLOT(goToPacket(int)));
3335 connect(voip_calls_dialog, SIGNAL(updateFilter(QString, bool)),
3336 this, SLOT(filterPackets(QString, bool)));
3337 voip_calls_dialog->show();
3340 void MainWindow::on_actionTelephonyVoipCalls_triggered()
3342 openVoipCallsDialog();
3345 void MainWindow::on_actionTelephonyGsmMapSummary_triggered()
3347 GsmMapSummaryDialog *gms_dialog = new GsmMapSummaryDialog(*this, capture_file_);
3351 void MainWindow::on_actionTelephonyIax2StreamAnalysis_triggered()
3353 Iax2AnalysisDialog *iax2_analysis_dialog = new Iax2AnalysisDialog(*this, capture_file_);
3354 connect(iax2_analysis_dialog, SIGNAL(goToPacket(int)),
3355 packet_list_, SLOT(goToPacket(int)));
3356 iax2_analysis_dialog->show();
3359 void MainWindow::on_actionTelephonyISUPMessages_triggered()
3361 openStatisticsTreeDialog("isup_msg");
3365 void MainWindow::statCommandLteMacStatistics(const char *arg, void *)
3367 LteMacStatisticsDialog *lte_mac_stats_dlg = new LteMacStatisticsDialog(*this, capture_file_, arg);
3368 connect(lte_mac_stats_dlg, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
3369 this, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)));
3370 lte_mac_stats_dlg->show();
3373 void MainWindow::on_actionTelephonyLteMacStatistics_triggered()
3375 statCommandLteMacStatistics(NULL, NULL);
3378 void MainWindow::statCommandLteRlcStatistics(const char *arg, void *)
3380 LteRlcStatisticsDialog *lte_rlc_stats_dlg = new LteRlcStatisticsDialog(*this, capture_file_, arg);
3381 connect(lte_rlc_stats_dlg, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
3382 this, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)));
3383 // N.B. It is necessary for the RLC Statistics window to launch the RLC graph in this way, to ensure
3384 // that the goToPacket() signal/slot connection gets set up...
3385 connect(lte_rlc_stats_dlg, SIGNAL(launchRLCGraph(bool, guint16, guint8, guint16, guint16, guint8)),
3386 this, SLOT(launchRLCGraph(bool, guint16, guint8, guint16, guint16, guint8)));
3388 lte_rlc_stats_dlg->show();
3391 void MainWindow::on_actionTelephonyLteRlcStatistics_triggered()
3393 statCommandLteRlcStatistics(NULL, NULL);
3396 void MainWindow::launchRLCGraph(bool channelKnown,
3397 guint16 ueid, guint8 rlcMode,
3398 guint16 channelType, guint16 channelId, guint8 direction)
3400 LteRlcGraphDialog *lrg_dialog = new LteRlcGraphDialog(*this, capture_file_, channelKnown);
3401 connect(lrg_dialog, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int)));
3402 // This is a bit messy, but wanted to hide these parameters from users of
3403 // on_actionTelephonyLteRlcGraph_triggered().
3405 lrg_dialog->setChannelInfo(ueid, rlcMode, channelType, channelId, direction);
3410 void MainWindow::on_actionTelephonyLteRlcGraph_triggered()
3412 // We don't yet know the channel.
3413 launchRLCGraph(false, 0, 0, 0, 0, 0);
3416 void MainWindow::on_actionTelephonyMtp3Summary_triggered()
3418 Mtp3SummaryDialog *mtp3s_dialog = new Mtp3SummaryDialog(*this, capture_file_);
3419 mtp3s_dialog->show();
3422 void MainWindow::on_actionTelephonyOsmuxPacketCounter_triggered()
3424 openStatisticsTreeDialog("osmux");
3427 void MainWindow::on_actionTelephonyRTPStreams_triggered()
3429 RtpStreamDialog *rtp_stream_dialog = new RtpStreamDialog(*this, capture_file_);
3430 connect(rtp_stream_dialog, SIGNAL(packetsMarked()),
3431 packet_list_, SLOT(redrawVisiblePackets()));
3432 connect(rtp_stream_dialog, SIGNAL(goToPacket(int)),
3433 packet_list_, SLOT(goToPacket(int)));
3434 connect(rtp_stream_dialog, SIGNAL(updateFilter(QString, bool)),
3435 this, SLOT(filterPackets(QString, bool)));
3436 rtp_stream_dialog->show();
3439 void MainWindow::on_actionTelephonyRTPStreamAnalysis_triggered()
3441 RtpAnalysisDialog *rtp_analysis_dialog = new RtpAnalysisDialog(*this, capture_file_);
3442 connect(rtp_analysis_dialog, SIGNAL(goToPacket(int)),
3443 packet_list_, SLOT(goToPacket(int)));
3444 rtp_analysis_dialog->show();
3447 void MainWindow::on_actionTelephonyRTSPPacketCounter_triggered()
3449 openStatisticsTreeDialog("rtsp");
3452 void MainWindow::on_actionTelephonySMPPOperations_triggered()
3454 openStatisticsTreeDialog("smpp_commands");
3457 void MainWindow::on_actionTelephonyUCPMessages_triggered()
3459 openStatisticsTreeDialog("ucp_messages");
3462 void MainWindow::on_actionTelephonySipFlows_triggered()
3464 openVoipCallsDialog(true);
3469 void MainWindow::on_actionBluetoothATT_Server_Attributes_triggered()
3471 BluetoothAttServerAttributesDialog *bluetooth_att_sever_attributes_dialog = new BluetoothAttServerAttributesDialog(*this, capture_file_);
3472 connect(bluetooth_att_sever_attributes_dialog, SIGNAL(goToPacket(int)),
3473 packet_list_, SLOT(goToPacket(int)));
3474 connect(bluetooth_att_sever_attributes_dialog, SIGNAL(updateFilter(QString, bool)),
3475 this, SLOT(filterPackets(QString, bool)));
3476 bluetooth_att_sever_attributes_dialog->show();
3479 void MainWindow::on_actionBluetoothDevices_triggered()
3481 BluetoothDevicesDialog *bluetooth_devices_dialog = new BluetoothDevicesDialog(*this, capture_file_, packet_list_);
3482 connect(bluetooth_devices_dialog, SIGNAL(goToPacket(int)),
3483 packet_list_, SLOT(goToPacket(int)));
3484 connect(bluetooth_devices_dialog, SIGNAL(updateFilter(QString, bool)),
3485 this, SLOT(filterPackets(QString, bool)));
3486 bluetooth_devices_dialog->show();
3489 void MainWindow::on_actionBluetoothHCI_Summary_triggered()
3491 BluetoothHciSummaryDialog *bluetooth_hci_summary_dialog = new BluetoothHciSummaryDialog(*this, capture_file_);
3492 connect(bluetooth_hci_summary_dialog, SIGNAL(goToPacket(int)),
3493 packet_list_, SLOT(goToPacket(int)));
3494 connect(bluetooth_hci_summary_dialog, SIGNAL(updateFilter(QString, bool)),
3495 this, SLOT(filterPackets(QString, bool)));
3496 bluetooth_hci_summary_dialog->show();
3501 void MainWindow::on_actionToolsFirewallAclRules_triggered()
3503 FirewallRulesDialog *firewall_rules_dialog = new FirewallRulesDialog(*this, capture_file_);
3504 firewall_rules_dialog->show();
3509 void MainWindow::on_actionHelpContents_triggered() {
3511 wsApp->helpTopicAction(HELP_CONTENT);
3514 void MainWindow::on_actionHelpMPWireshark_triggered() {
3516 wsApp->helpTopicAction(LOCALPAGE_MAN_WIRESHARK);
3519 void MainWindow::on_actionHelpMPWireshark_Filter_triggered() {
3520 wsApp->helpTopicAction(LOCALPAGE_MAN_WIRESHARK_FILTER);
3523 void MainWindow::on_actionHelpMPCapinfos_triggered() {
3524 wsApp->helpTopicAction(LOCALPAGE_MAN_CAPINFOS);
3527 void MainWindow::on_actionHelpMPDumpcap_triggered() {
3528 wsApp->helpTopicAction(LOCALPAGE_MAN_DUMPCAP);
3531 void MainWindow::on_actionHelpMPEditcap_triggered() {
3532 wsApp->helpTopicAction(LOCALPAGE_MAN_EDITCAP);
3535 void MainWindow::on_actionHelpMPMergecap_triggered() {
3536 wsApp->helpTopicAction(LOCALPAGE_MAN_MERGECAP);
3539 void MainWindow::on_actionHelpMPRawShark_triggered() {
3540 wsApp->helpTopicAction(LOCALPAGE_MAN_RAWSHARK);
3543 void MainWindow::on_actionHelpMPReordercap_triggered() {
3544 wsApp->helpTopicAction(LOCALPAGE_MAN_REORDERCAP);
3547 void MainWindow::on_actionHelpMPText2cap_triggered() {
3548 wsApp->helpTopicAction(LOCALPAGE_MAN_TEXT2PCAP);
3551 void MainWindow::on_actionHelpMPTShark_triggered() {
3552 wsApp->helpTopicAction(LOCALPAGE_MAN_TSHARK);
3555 void MainWindow::on_actionHelpWebsite_triggered() {
3557 wsApp->helpTopicAction(ONLINEPAGE_HOME);
3560 void MainWindow::on_actionHelpFAQ_triggered() {
3562 wsApp->helpTopicAction(ONLINEPAGE_FAQ);
3565 void MainWindow::on_actionHelpAsk_triggered() {
3567 wsApp->helpTopicAction(ONLINEPAGE_ASK);
3570 void MainWindow::on_actionHelpDownloads_triggered() {
3572 wsApp->helpTopicAction(ONLINEPAGE_DOWNLOAD);
3575 void MainWindow::on_actionHelpWiki_triggered() {
3577 wsApp->helpTopicAction(ONLINEPAGE_WIKI);
3580 void MainWindow::on_actionHelpSampleCaptures_triggered() {
3582 wsApp->helpTopicAction(ONLINEPAGE_SAMPLE_FILES);
3585 #ifdef HAVE_SOFTWARE_UPDATE
3586 void MainWindow::checkForUpdates()
3588 software_update_check();
3592 void MainWindow::on_actionHelpAbout_triggered()
3594 AboutDialog *about_dialog = new AboutDialog(this);
3596 if (about_dialog->isMinimized() == true)
3598 about_dialog->showNormal();
3602 about_dialog->show();
3605 about_dialog->raise();
3606 about_dialog->activateWindow();
3609 void MainWindow::on_actionGoGoToPacket_triggered() {
3610 if (packet_list_->packetListModel()->rowCount() < 1) {
3613 previous_focus_ = wsApp->focusWidget();
3614 connect(previous_focus_, SIGNAL(destroyed()), this, SLOT(resetPreviousFocus()));
3616 showAccordionFrame(main_ui_->goToFrame, true);
3617 if (main_ui_->goToFrame->isVisible()) {
3618 main_ui_->goToLineEdit->clear();
3619 main_ui_->goToLineEdit->setFocus();
3623 void MainWindow::on_actionGoGoToLinkedPacket_triggered()
3625 QAction *gta = qobject_cast<QAction*>(sender());
3629 int packet_num = gta->data().toInt(&ok);
3632 packet_list_->goToPacket(packet_num);
3635 // gtk/main_menubar.c:goto_conversation_frame
3636 void MainWindow::goToConversationFrame(bool go_next) {
3637 gchar *filter = NULL;
3638 dfilter_t *dfcode = NULL;
3639 gboolean found_packet = FALSE;
3640 packet_info *pi = &(capture_file_.capFile()->edt->pi);
3642 /* Try to build a conversation
3643 * filter in the order TCP, UDP, IP, Ethernet and apply the
3645 filter = conversation_filter_from_packet(pi);
3646 if (filter == NULL) {
3647 main_ui_->statusBar->pushTemporaryStatus(tr("Unable to build conversation filter."));
3652 if (!dfilter_compile(filter, &dfcode, NULL)) {
3653 /* The attempt failed; report an error. */
3654 main_ui_->statusBar->pushTemporaryStatus(tr("Error compiling filter for this conversation."));
3659 found_packet = cf_find_packet_dfilter(capture_file_.capFile(), dfcode, go_next ? SD_FORWARD : SD_BACKWARD);
3661 if (!found_packet) {
3662 /* We didn't find a packet */
3663 main_ui_->statusBar->pushTemporaryStatus(tr("No previous/next packet in conversation."));
3666 dfilter_free(dfcode);
3670 void MainWindow::on_actionGoNextConversationPacket_triggered()
3672 goToConversationFrame(true);
3675 void MainWindow::on_actionGoPreviousConversationPacket_triggered()
3677 goToConversationFrame(false);
3680 void MainWindow::on_actionGoAutoScroll_toggled(bool checked)
3682 packet_list_->setVerticalAutoScroll(checked);
3685 void MainWindow::resetPreviousFocus() {
3686 previous_focus_ = NULL;
3689 void MainWindow::on_goToCancel_clicked()
3691 main_ui_->goToFrame->animatedHide();
3692 if (previous_focus_) {
3693 disconnect(previous_focus_, SIGNAL(destroyed()), this, SLOT(resetPreviousFocus()));
3694 previous_focus_->setFocus();
3695 resetPreviousFocus();
3699 void MainWindow::on_goToGo_clicked()
3701 gotoFrame(main_ui_->goToLineEdit->text().toInt());
3703 on_goToCancel_clicked();
3706 void MainWindow::on_goToLineEdit_returnPressed()
3708 on_goToGo_clicked();
3711 void MainWindow::on_actionCaptureStart_triggered()
3713 //#ifdef HAVE_AIRPCAP
3714 // airpcap_if_active = airpcap_if_selected;
3715 // if (airpcap_if_active)
3716 // airpcap_set_toolbar_start_capture(airpcap_if_active);
3719 // if (cap_open_w) {
3721 // * There's an options dialog; get the values from it and close it.
3723 // gboolean success;
3725 // /* Determine if "capture start" while building of the "capture options" window */
3726 // /* is in progress. If so, ignore the "capture start. */
3727 // /* XXX: Would it be better/cleaner for the "capture options" window code to */
3728 // /* disable the capture start button temporarily ? */
3729 // if (cap_open_complete == FALSE) {
3730 // return; /* Building options window: ignore "capture start" */
3732 // success = capture_dlg_prep(cap_open_w);
3733 // window_destroy(GTK_WIDGET(cap_open_w));
3735 // return; /* error in options dialog */
3739 if (global_capture_opts.num_selected == 0) {
3740 QString err_msg = tr("No Interface Selected");
3741 main_ui_->statusBar->pushTemporaryStatus(err_msg);
3742 main_ui_->actionCaptureStart->setChecked(false);
3746 /* XXX - will closing this remove a temporary file? */
3747 QString before_what(tr(" before starting a new capture"));
3748 if (testCaptureFileClose(before_what)) {
3751 // simply clicking the button sets it to 'checked' even though we've
3752 // decided to do nothing, so undo that
3753 main_ui_->actionCaptureStart->setChecked(false);
3755 #endif // HAVE_LIBPCAP
3758 void MainWindow::on_actionCaptureStop_triggered()
3763 void MainWindow::on_actionCaptureRestart_triggered()
3765 QString before_what(tr(" before restarting the capture"));
3766 if (!testCaptureFileClose(before_what, Restart))
3769 /* TODO: GTK use only this: capture_restart(&cap_session_); */
3773 static FilterDialog *capture_filter_dlg_ = NULL;
3774 void MainWindow::on_actionCaptureCaptureFilters_triggered()
3776 if (!capture_filter_dlg_) {
3777 capture_filter_dlg_ = new FilterDialog(this, FilterDialog::CaptureFilter);
3779 capture_filter_dlg_->show();
3780 capture_filter_dlg_->raise();
3781 capture_filter_dlg_->activateWindow();
3784 void MainWindow::on_actionStatisticsCaptureFileProperties_triggered()
3786 CaptureFilePropertiesDialog *capture_file_properties_dialog = new CaptureFilePropertiesDialog(*this, capture_file_);
3787 connect(capture_file_properties_dialog, SIGNAL(captureCommentChanged()),
3788 this, SLOT(updateForUnsavedChanges()));
3789 capture_file_properties_dialog->show();
3792 void MainWindow::on_actionStatisticsResolvedAddresses_triggered()
3794 ResolvedAddressesDialog *resolved_addresses_dialog = new ResolvedAddressesDialog(this, &capture_file_);
3795 resolved_addresses_dialog->show();
3798 void MainWindow::on_actionStatisticsProtocolHierarchy_triggered()
3800 ProtocolHierarchyDialog *phd = new ProtocolHierarchyDialog(*this, capture_file_);
3801 connect(phd, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
3802 this, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)));
3806 void MainWindow::on_actionCaptureOptions_triggered()
3809 if (!capture_interfaces_dialog_) {
3810 capture_interfaces_dialog_ = new CaptureInterfacesDialog(this);
3812 connect(capture_interfaces_dialog_, SIGNAL(startCapture()), this, SLOT(startCapture()));
3813 connect(capture_interfaces_dialog_, SIGNAL(stopCapture()), this, SLOT(stopCapture()));
3815 connect(capture_interfaces_dialog_, SIGNAL(getPoints(int,PointList*)),
3816 this->main_welcome_->getInterfaceFrame(), SLOT(getPoints(int,PointList*)));
3817 connect(capture_interfaces_dialog_, SIGNAL(interfacesChanged()),
3818 this->main_welcome_, SLOT(interfaceSelected()));
3819 connect(capture_interfaces_dialog_, SIGNAL(interfacesChanged()),
3820 this->main_welcome_->getInterfaceFrame(), SLOT(updateSelectedInterfaces()));
3821 connect(capture_interfaces_dialog_, SIGNAL(interfaceListChanged()),
3822 this->main_welcome_->getInterfaceFrame(), SLOT(interfaceListChanged()));
3823 connect(capture_interfaces_dialog_, SIGNAL(captureFilterTextEdited(QString)),
3824 this->main_welcome_, SLOT(setCaptureFilterText(QString)));
3825 // Propagate selection changes from main UI to dialog.
3826 connect(this->main_welcome_, SIGNAL(interfacesChanged()),
3827 capture_interfaces_dialog_, SLOT(interfaceSelected()));
3829 connect(capture_interfaces_dialog_, SIGNAL(setFilterValid(bool, const QString)),
3830 this, SLOT(startInterfaceCapture(bool, const QString)));
3832 capture_interfaces_dialog_->setTab(0);
3833 capture_interfaces_dialog_->updateInterfaces();
3835 if (capture_interfaces_dialog_->isMinimized()) {
3836 capture_interfaces_dialog_->showNormal();
3838 capture_interfaces_dialog_->show();
3841 capture_interfaces_dialog_->raise();
3842 capture_interfaces_dialog_->activateWindow();
3847 void MainWindow::on_actionCaptureRefreshInterfaces_triggered()
3849 main_ui_->actionCaptureRefreshInterfaces->setEnabled(false);
3850 wsApp->refreshLocalInterfaces();
3851 main_ui_->actionCaptureRefreshInterfaces->setEnabled(true);
3855 void MainWindow::externalMenuItem_triggered()
3857 QAction * triggerAction = NULL;
3859 ext_menubar_t * entry = NULL;
3861 if (QObject::sender()) {
3862 triggerAction = (QAction *)QObject::sender();
3863 v = triggerAction->data();
3865 if (v.canConvert<void *>()) {
3866 entry = (ext_menubar_t *)v.value<void *>();
3868 if (entry->type == EXT_MENUBAR_ITEM) {
3869 entry->callback(EXT_MENUBAR_QT_GUI, (gpointer) ((void *)main_ui_), entry->user_data);
3871 QDesktopServices::openUrl(QUrl(QString((gchar *)entry->user_data)));
3877 void MainWindow::gotoFrame(int packet_num)
3879 if (packet_num > 0) {
3880 packet_list_->goToPacket(packet_num);
3885 void MainWindow::extcap_options_finished(int result)
3887 if (result == QDialog::Accepted) {
3890 this->main_welcome_->getInterfaceFrame()->interfaceListChanged();
3893 void MainWindow::showExtcapOptionsDialog(QString &device_name)
3895 ExtcapOptionsDialog * extcap_options_dialog = ExtcapOptionsDialog::createForDevice(device_name, this);
3896 /* The dialog returns null, if the given device name is not a valid extcap device */
3897 if (extcap_options_dialog) {
3898 connect(extcap_options_dialog, SIGNAL(finished(int)),
3899 this, SLOT(extcap_options_finished(int)));
3900 extcap_options_dialog->show();
3905 void MainWindow::on_actionContextCopyBytesHexTextDump_triggered()
3907 QAction *ca = qobject_cast<QAction*>(sender());
3910 field_info *fi = VariantPointer<field_info>::asPtr(ca->data());
3912 byte_view_tab_->copyData(ByteViewTab::copyDataHexTextDump, fi);
3915 void MainWindow::on_actionContextCopyBytesHexDump_triggered()
3917 QAction *ca = qobject_cast<QAction*>(sender());
3920 field_info *fi = VariantPointer<field_info>::asPtr(ca->data());
3922 byte_view_tab_->copyData(ByteViewTab::copyDataHexDump, fi);
3925 void MainWindow::on_actionContextCopyBytesPrintableText_triggered()
3927 QAction *ca = qobject_cast<QAction*>(sender());
3930 field_info *fi = VariantPointer<field_info>::asPtr(ca->data());
3932 byte_view_tab_->copyData(ByteViewTab::copyDataPrintableText, fi);
3935 void MainWindow::on_actionContextCopyBytesHexStream_triggered()
3937 QAction *ca = qobject_cast<QAction*>(sender());
3940 field_info *fi = VariantPointer<field_info>::asPtr(ca->data());
3942 byte_view_tab_->copyData(ByteViewTab::copyDataHexStream, fi);
3945 void MainWindow::on_actionContextCopyBytesBinary_triggered()
3947 QAction *ca = qobject_cast<QAction*>(sender());
3950 field_info *fi = VariantPointer<field_info>::asPtr(ca->data());
3952 byte_view_tab_->copyData(ByteViewTab::copyDataBinary, fi);
3955 void MainWindow::on_actionContextCopyBytesEscapedString_triggered()
3957 QAction *ca = qobject_cast<QAction*>(sender());
3960 field_info *fi = VariantPointer<field_info>::asPtr(ca->data());
3962 byte_view_tab_->copyData(ByteViewTab::copyDataEscapedString, fi);
3965 void MainWindow::on_actionContextWikiProtocolPage_triggered()
3967 QAction *wa = qobject_cast<QAction*>(sender());
3971 int field_id = wa->data().toInt(&ok);
3974 const QString proto_abbrev = proto_registrar_get_abbrev(field_id);
3976 int ret = QMessageBox::question(this, wsApp->windowTitleString(tr("Wiki Page for %1").arg(proto_abbrev)),
3977 tr("<p>The Wireshark Wiki is maintained by the community.</p>"
3978 "<p>The page you are about to load might be wonderful, "
3979 "incomplete, wrong, or nonexistent.</p>"
3980 "<p>Proceed to the wiki?</p>"),
3981 QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
3983 if (ret != QMessageBox::Yes) return;
3985 QUrl wiki_url = QString("https://wiki.wireshark.org/Protocols/%1").arg(proto_abbrev);
3986 QDesktopServices::openUrl(wiki_url);
3989 void MainWindow::on_actionContextFilterFieldReference_triggered()
3991 QAction *wa = qobject_cast<QAction*>(sender());
3995 int field_id = wa->data().toInt(&ok);
3998 const QString proto_abbrev = proto_registrar_get_abbrev(field_id);
4000 QUrl dfref_url = QString("https://www.wireshark.org/docs/dfref/%1/%2")
4001 .arg(proto_abbrev[0])
4003 QDesktopServices::openUrl(dfref_url);
4006 void MainWindow::on_actionViewFullScreen_triggered(bool checked)
4009 // Save the state for future restore
4010 was_maximized_ = this->isMaximized();
4011 this->showFullScreen();
4013 // Restore the previous state
4015 this->showMaximized();
4021 void MainWindow::activatePluginIFToolbar(bool)
4023 QAction *sendingAction = dynamic_cast<QAction *>(sender());
4024 if (!sendingAction || !sendingAction->data().isValid())
4027 ext_toolbar_t *toolbar = VariantPointer<ext_toolbar_t>::asPtr(sendingAction->data());
4029 QList<QToolBar *> toolbars = findChildren<QToolBar *>();
4030 foreach (QToolBar *bar, toolbars) {
4031 AdditionalToolBar *iftoolbar = dynamic_cast<AdditionalToolBar *>(bar);
4032 if (iftoolbar && iftoolbar->menuName().compare(toolbar->name) == 0) {
4033 if (iftoolbar->isVisible()) {
4034 iftoolbar->setVisible(false);
4035 sendingAction->setChecked(true);
4037 iftoolbar->setVisible(true);
4038 sendingAction->setChecked(true);
4045 #pragma warning(pop)
4054 * indent-tabs-mode: nil
4057 * ex: set shiftwidth=4 tabstop=8 expandtab:
4058 * :indentSize=4:tabSize=8:noTabs=true: