diff options
author | Michael Mann <mmann78@netscape.net> | 2015-07-21 13:32:42 -0400 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2015-07-23 09:15:36 +0000 |
commit | 2c534a93acc64703921b4170023e4b8bae507bc7 (patch) | |
tree | d856b007879bb116cdd350f01396835f1a4b09a4 /ui | |
parent | bf3e1179d2f2c089074804f054d55a22dc3b1494 (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.txt | 3 | ||||
-rw-r--r-- | ui/qt/Makefile.am | 2 | ||||
-rw-r--r-- | ui/qt/Makefile.common | 4 | ||||
-rw-r--r-- | ui/qt/Wireshark.pro | 3 | ||||
-rw-r--r-- | ui/qt/enabled_protocols_dialog.cpp | 321 | ||||
-rw-r--r-- | ui/qt/enabled_protocols_dialog.h | 78 | ||||
-rw-r--r-- | ui/qt/enabled_protocols_dialog.ui | 144 | ||||
-rw-r--r-- | ui/qt/main_window.h | 1 | ||||
-rw-r--r-- | ui/qt/main_window.ui | 14 | ||||
-rw-r--r-- | ui/qt/main_window_slots.cpp | 7 |
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><small><i>Disabling a protocol prevents higher layer protocols from being displayed</i></small></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()); |