From 2c534a93acc64703921b4170023e4b8bae507bc7 Mon Sep 17 00:00:00 2001 From: Michael Mann Date: Tue, 21 Jul 2015 13:32:42 -0400 Subject: 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 Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman --- ui/qt/CMakeLists.txt | 3 + ui/qt/Makefile.am | 2 + ui/qt/Makefile.common | 4 + ui/qt/Wireshark.pro | 3 + ui/qt/enabled_protocols_dialog.cpp | 321 +++++++++++++++++++++++++++++++++++++ ui/qt/enabled_protocols_dialog.h | 78 +++++++++ ui/qt/enabled_protocols_dialog.ui | 144 +++++++++++++++++ ui/qt/main_window.h | 1 + ui/qt/main_window.ui | 14 +- ui/qt/main_window_slots.cpp | 7 + 10 files changed, 576 insertions(+), 1 deletion(-) create mode 100644 ui/qt/enabled_protocols_dialog.cpp create mode 100644 ui/qt/enabled_protocols_dialog.h create mode 100644 ui/qt/enabled_protocols_dialog.ui (limited to 'ui') 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 + * 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 + +#include +#include +#include +#include +#include + +#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 rowData() { +// return QList() << 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(*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 + * 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 @@ + + + EnabledProtocolsDialog + + + + 0 + 0 + 987 + 595 + + + + Dialog + + + + + + + Protocol + + + + + Description + + + + + + + + + + + + + + + + <small><i>Disabling a protocol prevents higher layer protocols from being displayed</i></small> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + Search: + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Enable All + + + + + + + Disable All + + + + + + + Invert + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok|QDialogButtonBox::Save + + + + + + + + + buttonBox + accepted() + EnabledProtocolsDialog + accept() + + + 6 + 559 + + + 157 + 274 + + + + + buttonBox + rejected() + EnabledProtocolsDialog + reject() + + + 32 + 559 + + + 286 + 274 + + + + + 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 @@ 0 0 960 - 22 + 18 @@ -383,6 +383,7 @@ + @@ -2563,6 +2564,17 @@ Manually edit a name resolution entry. + + + Enable Protocols... + + + Enable and disable specific protocols + + + Ctrl+Shift+E + + 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(sender()); -- cgit v1.2.3