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/qt/enabled_protocols_dialog.cpp | |
parent | bf3e1179d2f2c089074804f054d55a22dc3b1494 (diff) | |
download | wireshark-2c534a93acc64703921b4170023e4b8bae507bc7.tar.gz |
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/qt/enabled_protocols_dialog.cpp')
-rw-r--r-- | ui/qt/enabled_protocols_dialog.cpp | 321 |
1 files changed, 321 insertions, 0 deletions
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: + */ |