aboutsummaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2015-07-21 13:32:42 -0400
committerAnders Broman <a.broman58@gmail.com>2015-07-23 09:15:36 +0000
commit2c534a93acc64703921b4170023e4b8bae507bc7 (patch)
treed856b007879bb116cdd350f01396835f1a4b09a4 /ui
parentbf3e1179d2f2c089074804f054d55a22dc3b1494 (diff)
Add Enabled Protocols dialog for Qt
This dialog combines the "protocols" and heuristic dissectors (from GTK) into a single tree view where heuristic dissectors are children of their protocol. Change-Id: I107656afd079c1d1c8a98161b736e4b4ad84f813 Reviewed-on: https://code.wireshark.org/review/9739 Petri-Dish: Gerald Combs <gerald@wireshark.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'ui')
-rw-r--r--ui/qt/CMakeLists.txt3
-rw-r--r--ui/qt/Makefile.am2
-rw-r--r--ui/qt/Makefile.common4
-rw-r--r--ui/qt/Wireshark.pro3
-rw-r--r--ui/qt/enabled_protocols_dialog.cpp321
-rw-r--r--ui/qt/enabled_protocols_dialog.h78
-rw-r--r--ui/qt/enabled_protocols_dialog.ui144
-rw-r--r--ui/qt/main_window.h1
-rw-r--r--ui/qt/main_window.ui14
-rw-r--r--ui/qt/main_window_slots.cpp7
10 files changed, 576 insertions, 1 deletions
diff --git a/ui/qt/CMakeLists.txt b/ui/qt/CMakeLists.txt
index b46d7714e7..bda0bd541b 100644
--- a/ui/qt/CMakeLists.txt
+++ b/ui/qt/CMakeLists.txt
@@ -51,6 +51,7 @@ set(WIRESHARK_QT_HEADERS
display_filter_edit.h
display_filter_expression_dialog.h
elided_label.h
+ enabled_protocols_dialog.h
endpoint_dialog.h
expert_info_dialog.h
export_dissection_dialog.h
@@ -182,6 +183,7 @@ set(WIRESHARK_QT_SRC
display_filter_edit.cpp
display_filter_expression_dialog.cpp
elided_label.cpp
+ enabled_protocols_dialog.cpp
expert_info_dialog.cpp
export_dissection_dialog.cpp
export_object_dialog.cpp
@@ -306,6 +308,7 @@ set(WIRESHARK_QT_UI
compiled_filter_output.ui
decode_as_dialog.ui
display_filter_expression_dialog.ui
+ enabled_protocols_dialog.ui
expert_info_dialog.ui
export_object_dialog.ui
export_pdu_dialog.ui
diff --git a/ui/qt/Makefile.am b/ui/qt/Makefile.am
index caf64516a6..a6d1021d75 100644
--- a/ui/qt/Makefile.am
+++ b/ui/qt/Makefile.am
@@ -156,6 +156,8 @@ decode_as_dialog.$(OBJEXT): ui_decode_as_dialog.h
display_filter_expression_dialog.$(OBJEXT): ui_display_filter_expression_dialog.h
+enabled_protocols_dialog.$(OBJEXT): ui_enabled_protocols_dialog.h
+
expert_info_dialog.$(OBJEXT): ui_expert_info_dialog.h
export_object_dialog.$(OBJEXT): ui_export_object_dialog.h
diff --git a/ui/qt/Makefile.common b/ui/qt/Makefile.common
index 89ad33e293..ed7140f552 100644
--- a/ui/qt/Makefile.common
+++ b/ui/qt/Makefile.common
@@ -43,6 +43,7 @@ NODIST_GENERATED_HEADER_FILES = \
ui_compiled_filter_output.h \
ui_decode_as_dialog.h \
ui_display_filter_expression_dialog.h \
+ ui_enabled_protocols_dialog.h \
ui_expert_info_dialog.h \
ui_export_object_dialog.h \
ui_export_pdu_dialog.h \
@@ -161,6 +162,7 @@ MOC_HDRS = \
display_filter_edit.h \
display_filter_expression_dialog.h \
elided_label.h \
+ enabled_protocols_dialog.h \
endpoint_dialog.h \
expert_info_dialog.h \
export_dissection_dialog.h \
@@ -263,6 +265,7 @@ UI_FILES = \
compiled_filter_output.ui \
decode_as_dialog.ui \
display_filter_expression_dialog.ui \
+ enabled_protocols_dialog.ui \
expert_info_dialog.ui \
export_object_dialog.ui \
export_pdu_dialog.ui \
@@ -396,6 +399,7 @@ WIRESHARK_QT_SRC = \
display_filter_edit.cpp \
display_filter_expression_dialog.cpp \
elided_label.cpp \
+ enabled_protocols_dialog.cpp \
endpoint_dialog.cpp \
expert_info_dialog.cpp \
export_dissection_dialog.cpp \
diff --git a/ui/qt/Wireshark.pro b/ui/qt/Wireshark.pro
index 6ac3ebd58c..eba443cd5a 100644
--- a/ui/qt/Wireshark.pro
+++ b/ui/qt/Wireshark.pro
@@ -219,6 +219,7 @@ FORMS += \
compiled_filter_output.ui \
decode_as_dialog.ui \
display_filter_expression_dialog.ui \
+ enabled_protocols_dialog.ui \
expert_info_dialog.ui \
export_object_dialog.ui \
export_pdu_dialog.ui \
@@ -293,6 +294,7 @@ HEADERS += $$HEADERS_WS_C \
decode_as_dialog.h \
display_filter_expression_dialog.h \
elided_label.h \
+ enabled_protocols_dialog.h \
endpoint_dialog.h \
expert_info_dialog.h \
export_dissection_dialog.h \
@@ -664,6 +666,7 @@ SOURCES += \
display_filter_edit.cpp \
display_filter_expression_dialog.cpp \
elided_label.cpp \
+ enabled_protocols_dialog.cpp \
endpoint_dialog.cpp \
expert_info_dialog.cpp \
export_dissection_dialog.cpp \
diff --git a/ui/qt/enabled_protocols_dialog.cpp b/ui/qt/enabled_protocols_dialog.cpp
new file mode 100644
index 0000000000..105c8a0b8c
--- /dev/null
+++ b/ui/qt/enabled_protocols_dialog.cpp
@@ -0,0 +1,321 @@
+/* enabled_protocols_dialog.cpp
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "enabled_protocols_dialog.h"
+#include "ui_enabled_protocols_dialog.h"
+
+#include <errno.h>
+
+#include <epan/proto.h>
+#include <epan/packet.h>
+#include <epan/prefs.h>
+#include <epan/disabled_protos.h>
+#include <wsutil/filesystem.h>
+
+#include "wireshark_application.h"
+#include "ui/simple_dialog.h"
+
+enum
+{
+ PROTOCOL_COLUMN,
+ DESCRIPTION_COLUMN
+};
+
+class EnableProtocolTreeWidgetItem : public QTreeWidgetItem
+{
+public:
+ EnableProtocolTreeWidgetItem(QTreeWidgetItem *parent, QString proto_name, QString short_name, bool enable) :
+ QTreeWidgetItem (parent),
+ short_name_(short_name),
+ proto_name_(proto_name),
+ enable_(enable)
+ {
+ setCheckState(PROTOCOL_COLUMN, enable_ ? Qt::Checked : Qt::Unchecked);
+ setText(PROTOCOL_COLUMN, short_name_);
+ setText(DESCRIPTION_COLUMN, proto_name_);
+ }
+
+ virtual bool applyValue(bool value)
+ {
+ bool change = (value != enable_);
+ enable_ = value;
+ applyValuePrivate(value);
+ return change;
+ }
+
+ // Useful if we ever add "save as" / "copy as".
+// QList<QVariant> rowData() {
+// return QList<QVariant>() << short_name_ << proto_name_ << enable_;
+// }
+
+protected:
+ virtual void applyValuePrivate(gboolean value) = 0;
+
+private:
+ QString short_name_;
+ QString proto_name_;
+ bool enable_;
+};
+
+class ProtocolTreeWidgetItem : public EnableProtocolTreeWidgetItem
+{
+public:
+ ProtocolTreeWidgetItem(QTreeWidgetItem *parent, const protocol_t *protocol) :
+ EnableProtocolTreeWidgetItem (parent, proto_get_protocol_long_name(protocol), proto_get_protocol_short_name(protocol), proto_is_protocol_enabled(protocol)),
+ protocol_(protocol)
+ {
+ }
+
+protected:
+ virtual void applyValuePrivate(gboolean value)
+ {
+ proto_set_decoding(proto_get_id(protocol_), value);
+ }
+
+private:
+ const protocol_t *protocol_;
+};
+
+class HeuristicTreeWidgetItem : public EnableProtocolTreeWidgetItem
+{
+public:
+ HeuristicTreeWidgetItem(QTreeWidgetItem *parent, heur_dtbl_entry_t *heuristic) :
+ EnableProtocolTreeWidgetItem (parent, heuristic->display_name, heuristic->short_name, heuristic->enabled),
+ heuristic_(heuristic)
+ {
+ }
+
+protected:
+ virtual void applyValuePrivate(gboolean value)
+ {
+ heuristic_->enabled = value;
+ }
+
+private:
+ heur_dtbl_entry_t *heuristic_;
+};
+
+EnabledProtocolsDialog::EnabledProtocolsDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::EnabledProtocolsDialog)
+{
+ ui->setupUi(this);
+ setWindowTitle(wsApp->windowTitleString(tr("Enabled Protocols")));
+
+ void *cookie;
+ protocol_t *protocol;
+
+ //Remove "original" item
+ ui->protocol_tree_->takeTopLevelItem(0);
+
+ // Iterate over all the protocols
+ for (gint i = proto_get_first_protocol(&cookie);
+ i != -1;
+ i = proto_get_next_protocol(&cookie))
+ {
+ if (proto_can_toggle_protocol(i))
+ {
+ protocol = find_protocol_by_id(i);
+ ProtocolTreeWidgetItem* protocol_row = new ProtocolTreeWidgetItem(ui->protocol_tree_->invisibleRootItem(), protocol);
+ ui->protocol_tree_->addTopLevelItem(protocol_row);
+
+ proto_heuristic_dissector_foreach(protocol, addHeuristicItem, protocol_row);
+ }
+ }
+
+ //make sortable
+ ui->protocol_tree_->setSortingEnabled(true);
+ ui->protocol_tree_->sortByColumn(PROTOCOL_COLUMN, Qt::AscendingOrder);
+
+ for (int i = 0; i < ui->protocol_tree_->columnCount() - 1; i++) {
+ ui->protocol_tree_->resizeColumnToContents(i);
+ }
+
+ //"Remove" Save button
+ if (!prefs.gui_use_pref_save)
+ ui->buttonBox->button(QDialogButtonBox::Save)->setHidden(true);
+}
+
+EnabledProtocolsDialog::~EnabledProtocolsDialog()
+{
+ delete ui;
+}
+
+void EnabledProtocolsDialog::addHeuristicItem(gpointer data, gpointer user_data)
+{
+ heur_dtbl_entry_t* heur = (heur_dtbl_entry_t*)data;
+ ProtocolTreeWidgetItem* protocol_item = (ProtocolTreeWidgetItem*)user_data;
+
+ new HeuristicTreeWidgetItem(protocol_item, heur);
+}
+
+void EnabledProtocolsDialog::on_invert_button__clicked()
+{
+ QTreeWidgetItemIterator it(ui->protocol_tree_->invisibleRootItem());
+ while (*it)
+ {
+ if ((*it)->checkState(PROTOCOL_COLUMN) == Qt::Unchecked)
+ {
+ (*it)->setCheckState(PROTOCOL_COLUMN, Qt::Checked);
+ }
+ else
+ {
+ (*it)->setCheckState(PROTOCOL_COLUMN, Qt::Unchecked);
+ }
+
+ ++it;
+ }
+}
+
+void EnabledProtocolsDialog::on_enable_all_button__clicked()
+{
+ QTreeWidgetItemIterator it(ui->protocol_tree_->invisibleRootItem());
+ while (*it)
+ {
+ (*it)->setCheckState(PROTOCOL_COLUMN, Qt::Checked);
+ ++it;
+ }
+}
+
+void EnabledProtocolsDialog::on_disable_all_button__clicked()
+{
+ QTreeWidgetItemIterator it(ui->protocol_tree_->invisibleRootItem());
+ while (*it)
+ {
+ (*it)->setCheckState(PROTOCOL_COLUMN, Qt::Unchecked);
+ ++it;
+ }
+}
+
+bool EnabledProtocolsDialog::applyChanges()
+{
+ bool redissect = false;
+
+ QTreeWidgetItemIterator it(ui->protocol_tree_);
+ while (*it)
+ {
+ EnableProtocolTreeWidgetItem* it_cast = dynamic_cast<EnableProtocolTreeWidgetItem *>(*it);
+
+ if ((*it)->checkState(PROTOCOL_COLUMN) == Qt::Checked)
+ {
+ redissect |= it_cast->applyValue(TRUE);
+ }
+ else
+ {
+ redissect |= it_cast->applyValue(FALSE);
+ }
+ ++it;
+ }
+
+ return redissect;
+}
+
+void EnabledProtocolsDialog::writeChanges()
+{
+ char *pf_dir_path;
+ char *pf_path;
+ int pf_save_errno;
+
+ /* Create the directory that holds personal configuration files, if necessary. */
+ if (create_persconffile_dir(&pf_dir_path) == -1) {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+ "Can't create directory\n\"%s\"\nfor disabled protocols file: %s.", pf_dir_path,
+ g_strerror(errno));
+ g_free(pf_dir_path);
+ }
+ else
+ {
+ save_disabled_protos_list(&pf_path, &pf_save_errno);
+ if (pf_path != NULL)
+ {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+ "Could not save to your disabled protocols file\n\"%s\": %s.",
+ pf_path, g_strerror(pf_save_errno));
+ g_free(pf_path);
+ }
+
+ save_disabled_heur_dissector_list(&pf_path, &pf_save_errno);
+ if (pf_path != NULL)
+ {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+ "Could not save to your disabled heuristic protocol file\n\"%s\": %s.",
+ pf_path, g_strerror(pf_save_errno));
+ g_free(pf_path);
+ }
+ }
+}
+
+void EnabledProtocolsDialog::on_search_line_edit__textChanged(const QString &search_re)
+{
+ QTreeWidgetItemIterator it(ui->protocol_tree_);
+ QRegExp regex(search_re, Qt::CaseInsensitive);
+ while (*it) {
+ bool hidden = true;
+ if (search_re.isEmpty() || (*it)->text(PROTOCOL_COLUMN).contains(regex) || (*it)->text(DESCRIPTION_COLUMN).contains(regex)) {
+ hidden = false;
+ }
+ (*it)->setHidden(hidden);
+ ++it;
+ }
+}
+
+void EnabledProtocolsDialog::on_buttonBox_accepted()
+{
+ if (applyChanges())
+ {
+ writeChanges();
+ wsApp->emitAppSignal(WiresharkApplication::PacketDissectionChanged);
+ }
+}
+
+void EnabledProtocolsDialog::on_buttonBox_clicked(QAbstractButton *button)
+{
+ if (button == ui->buttonBox->button(QDialogButtonBox::Apply))
+ {
+ if (applyChanges())
+ {
+ // if we don't have a Save button, just save the settings now
+ if (!prefs.gui_use_pref_save)
+ writeChanges();
+
+ wsApp->emitAppSignal(WiresharkApplication::PacketDissectionChanged);
+ }
+ }
+
+}
+
+void EnabledProtocolsDialog::on_buttonBox_helpRequested()
+{
+ wsApp->helpTopicAction(HELP_ENABLED_PROTOCOLS_DIALOG);
+}
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/ui/qt/enabled_protocols_dialog.h b/ui/qt/enabled_protocols_dialog.h
new file mode 100644
index 0000000000..129b856135
--- /dev/null
+++ b/ui/qt/enabled_protocols_dialog.h
@@ -0,0 +1,78 @@
+#ifndef ENABLED_PROTOCOLS_DIALOG_H
+/* enabled_protocols_dialog.h
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#define ENABLED_PROTOCOLS_DIALOG_H
+
+#include "wireshark_dialog.h"
+
+namespace Ui {
+class EnabledProtocolsDialog;
+}
+
+class QAbstractButton;
+
+class EnabledProtocolsDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit EnabledProtocolsDialog(QWidget *parent);
+ ~EnabledProtocolsDialog();
+
+private slots:
+ void on_invert_button__clicked();
+
+ void on_enable_all_button__clicked();
+
+ void on_disable_all_button__clicked();
+
+ void on_search_line_edit__textChanged(const QString &search_re);
+
+ void on_buttonBox_accepted();
+
+ void on_buttonBox_clicked(QAbstractButton *button);
+
+ void on_buttonBox_helpRequested();
+
+private:
+ Ui::EnabledProtocolsDialog *ui;
+
+ static void addHeuristicItem(gpointer data, gpointer user_data);
+ bool applyChanges();
+ void writeChanges();
+
+};
+
+#endif // ENABLED_PROTOCOLS_DIALOG_H
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/ui/qt/enabled_protocols_dialog.ui b/ui/qt/enabled_protocols_dialog.ui
new file mode 100644
index 0000000000..e52c1a127d
--- /dev/null
+++ b/ui/qt/enabled_protocols_dialog.ui
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>EnabledProtocolsDialog</class>
+ <widget class="QDialog" name="EnabledProtocolsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>987</width>
+ <height>595</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Dialog</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTreeWidget" name="protocol_tree_">
+ <column>
+ <property name="text">
+ <string>Protocol</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ </column>
+ <item>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="disable_notice_text_">
+ <property name="text">
+ <string>&lt;small&gt;&lt;i&gt;Disabling a protocol prevents higher layer protocols from being displayed&lt;/i&gt;&lt;/small&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Search:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="search_line_edit_"/>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="enable_all_button_">
+ <property name="text">
+ <string>Enable All</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="disable_all_button_">
+ <property name="text">
+ <string>Disable All</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="invert_button_">
+ <property name="text">
+ <string>Invert</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok|QDialogButtonBox::Save</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>EnabledProtocolsDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>6</x>
+ <y>559</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>EnabledProtocolsDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>32</x>
+ <y>559</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h
index f593b782b8..e176081c3f 100644
--- a/ui/qt/main_window.h
+++ b/ui/qt/main_window.h
@@ -415,6 +415,7 @@ private slots:
void applyConversationFilter();
+ void on_actionAnalyzeEnabledProtocols_triggered();
void on_actionAnalyzeDecodeAs_triggered();
void openFollowStreamDialog(follow_type_t type);
diff --git a/ui/qt/main_window.ui b/ui/qt/main_window.ui
index a2fa8cf7f9..019acb70ec 100644
--- a/ui/qt/main_window.ui
+++ b/ui/qt/main_window.ui
@@ -116,7 +116,7 @@
<x>0</x>
<y>0</y>
<width>960</width>
- <height>22</height>
+ <height>18</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@@ -383,6 +383,7 @@
<addaction name="menuPrepareAFilter"/>
<addaction name="menuConversationFilter"/>
<addaction name="separator"/>
+ <addaction name="actionAnalyzeEnabledProtocols"/>
<addaction name="actionAnalyzeDecodeAs"/>
<addaction name="separator"/>
<addaction name="menuSCTP"/>
@@ -2563,6 +2564,17 @@
<string>Manually edit a name resolution entry.</string>
</property>
</action>
+ <action name="actionAnalyzeEnabledProtocols">
+ <property name="text">
+ <string>Enable Protocols...</string>
+ </property>
+ <property name="toolTip">
+ <string>Enable and disable specific protocols</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+Shift+E</string>
+ </property>
+ </action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp
index 38598614e2..bbbed3db8d 100644
--- a/ui/qt/main_window_slots.cpp
+++ b/ui/qt/main_window_slots.cpp
@@ -82,6 +82,7 @@
#include "color_utils.h"
#include "coloring_rules_dialog.h"
#include "conversation_dialog.h"
+#include "enabled_protocols_dialog.h"
#include "decode_as_dialog.h"
#include "display_filter_edit.h"
#include "display_filter_expression_dialog.h"
@@ -2500,6 +2501,12 @@ void MainWindow::on_actionAnalyzePAFOrNotSelected_triggered()
matchFieldFilter(FilterAction::ActionPrepare, FilterAction::ActionTypeOrNot);
}
+void MainWindow::on_actionAnalyzeEnabledProtocols_triggered()
+{
+ EnabledProtocolsDialog enable_proto_dialog(this);
+ enable_proto_dialog.exec();
+}
+
void MainWindow::on_actionAnalyzeDecodeAs_triggered()
{
QAction *da_action = qobject_cast<QAction*>(sender());