diff options
author | Roland Knall <rknall@gmail.com> | 2019-08-29 17:30:29 +0200 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2019-09-01 09:02:51 +0000 |
commit | 743f8598cd0b156c195b906400cdd0d3fcdeafe3 (patch) | |
tree | 7d99b7d258fda9ef9a4e14eb021eb38ade38720a /ui/qt/resolved_addresses_dialog.cpp | |
parent | b28952afd401926849a03b9537d08a989284bc25 (diff) |
Qt: Rework Resolved Addresses dialog
This is a refactoring/redesign of the "Resolved Addresses" dialog,
allowing for sorting/filtering and searching within the addresses
and ports.
Change-Id: I5071e92ff699323b6c93fc533eeaf92e0db334de
Reviewed-on: https://code.wireshark.org/review/34398
Reviewed-by: Roland Knall <rknall@gmail.com>
Petri-Dish: Roland Knall <rknall@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'ui/qt/resolved_addresses_dialog.cpp')
-rw-r--r-- | ui/qt/resolved_addresses_dialog.cpp | 426 |
1 files changed, 80 insertions, 346 deletions
diff --git a/ui/qt/resolved_addresses_dialog.cpp b/ui/qt/resolved_addresses_dialog.cpp index 6ac7c17965..c6c669cccc 100644 --- a/ui/qt/resolved_addresses_dialog.cpp +++ b/ui/qt/resolved_addresses_dialog.cpp @@ -22,150 +22,23 @@ #include <QMenu> #include <QPushButton> #include <QTextCursor> +#include <QSortFilterProxyModel> #include "capture_file.h" #include "wireshark_application.h" -// To do: -// - We do a *lot* of string copying. -// - We end up with a lot of numeric entries here. +#include <ui/qt/models/astringlist_list_model.h> +#include <ui/qt/models/resolved_addresses_models.h> -extern "C" { - -static void -ipv4_hash_table_resolved_to_qstringlist(gpointer, gpointer value, gpointer sl_ptr) -{ - QStringList *string_list = (QStringList *) sl_ptr; - hashipv4_t *ipv4_hash_table_entry = (hashipv4_t *) value; - - if((ipv4_hash_table_entry->flags & NAME_RESOLVED)) { - QString entry = QString("%1\t%2") - .arg(ipv4_hash_table_entry->ip) - .arg(ipv4_hash_table_entry->name); - *string_list << entry; - } -} - -static void -ipv6_hash_table_resolved_to_qstringlist(gpointer, gpointer value, gpointer sl_ptr) -{ - QStringList *string_list = (QStringList *) sl_ptr; - hashipv6_t *ipv6_hash_table_entry = (hashipv6_t *) value; - - if((ipv6_hash_table_entry->flags & NAME_RESOLVED)) { - QString entry = QString("%1\t%2") - .arg(ipv6_hash_table_entry->ip6) - .arg(ipv6_hash_table_entry->name); - *string_list << entry; - } -} - -static void -ipv4_hash_table_to_qstringlist(gpointer key, gpointer value, gpointer sl_ptr) -{ - QStringList *string_list = (QStringList *) sl_ptr; - hashipv4_t *ipv4_hash_table_entry = (hashipv4_t *)value; - guint addr = GPOINTER_TO_UINT(key); - - QString entry = QString("Key: 0x%1 IPv4: %2, Name: %3") - .arg(QString::number(addr, 16)) - .arg(ipv4_hash_table_entry->ip) - .arg(ipv4_hash_table_entry->name); - - *string_list << entry; -} - -static void -ipv6_hash_table_to_qstringlist(gpointer key, gpointer value, gpointer sl_ptr) -{ - QStringList *string_list = (QStringList *) sl_ptr; - hashipv6_t *ipv6_hash_table_entry = (hashipv6_t *)value; - guint addr = GPOINTER_TO_UINT(key); - - QString entry = QString("Key: 0x%1 IPv4: %2, Name: %3") - .arg(QString::number(addr, 16)) - .arg(ipv6_hash_table_entry->ip6) - .arg(ipv6_hash_table_entry->name); - - *string_list << entry; -} - -static void -serv_port_hash_to_qstringlist(gpointer key, gpointer value, gpointer sl_ptr) -{ - QStringList *string_list = (QStringList *) sl_ptr; - serv_port_t *serv_port = (serv_port_t *)value; - guint port = GPOINTER_TO_UINT(key); - - QStringList entries; - - if (serv_port->tcp_name) entries << QString("%1\t%2/tcp").arg(serv_port->tcp_name).arg(port); - if (serv_port->udp_name) entries << QString("%1\t%2/udp").arg(serv_port->udp_name).arg(port); - if (serv_port->sctp_name) entries << QString("%1\t%2/sctp").arg(serv_port->sctp_name).arg(port); - if (serv_port->dccp_name) entries << QString("%1\t%2/dccp").arg(serv_port->dccp_name).arg(port); - - if (!entries.isEmpty()) *string_list << entries.join("\n"); -} - -static void -eth_hash_to_qstringlist(gpointer, gpointer value, gpointer sl_ptr) -{ - QStringList *string_list = (QStringList *) sl_ptr; - hashether_t* tp = (hashether_t*)value; - - QString entry = QString("%1 %2") - .arg(get_hash_ether_hexaddr(tp)) - .arg(get_hash_ether_resolved_name(tp)); - - *string_list << entry; -} - -static void -manuf_hash_to_qstringlist(gpointer key, gpointer value, gpointer sl_ptr) -{ - QStringList *string_list = (QStringList *) sl_ptr; - hashmanuf_t *manuf = (hashmanuf_t*)value; - guint eth_as_guint = GPOINTER_TO_UINT(key); - - QString entry = QString("%1:%2:%3 %4") - .arg((eth_as_guint >> 16 & 0xff), 2, 16, QChar('0')) - .arg((eth_as_guint >> 8 & 0xff), 2, 16, QChar('0')) - .arg((eth_as_guint & 0xff), 2, 16, QChar('0')) - .arg(get_hash_manuf_resolved_name(manuf)); - - *string_list << entry; -} - -static void -wka_hash_to_qstringlist(gpointer key, gpointer value, gpointer sl_ptr) -{ - QStringList *string_list = (QStringList *) sl_ptr; - gchar *name = (gchar *)value; - guint8 *eth_addr = (guint8*)key; - - QString entry = QString("%1:%2:%3:%4:%5:%6 %7") - .arg(eth_addr[0], 2, 16, QChar('0')) - .arg(eth_addr[1], 2, 16, QChar('0')) - .arg(eth_addr[2], 2, 16, QChar('0')) - .arg(eth_addr[3], 2, 16, QChar('0')) - .arg(eth_addr[4], 2, 16, QChar('0')) - .arg(eth_addr[5], 2, 16, QChar('0')) - .arg(name); - - *string_list << entry; -} - -} const QString no_entries_ = QObject::tr("No entries."); const QString entry_count_ = QObject::tr("%1 entries."); ResolvedAddressesDialog::ResolvedAddressesDialog(QWidget *parent, CaptureFile *capture_file) : - GeometryStateDialog(NULL), + GeometryStateDialog(parent), ui(new Ui::ResolvedAddressesDialog), file_name_(tr("[no file]")) { ui->setupUi(this); - if (parent) loadGeometry(parent->width() * 2 / 3, parent->height()); setAttribute(Qt::WA_DeleteOnClose, true); QStringList title_parts = QStringList() << tr("Resolved Addresses"); @@ -203,45 +76,92 @@ ResolvedAddressesDialog::ResolvedAddressesDialog(QWidget *parent, CaptureFile *c } } - wmem_map_t *ipv4_hash_table = get_ipv4_hash_table(); - if (ipv4_hash_table) { - wmem_map_foreach(ipv4_hash_table, ipv4_hash_table_resolved_to_qstringlist, &host_addresses_); - wmem_map_foreach(ipv4_hash_table, ipv4_hash_table_to_qstringlist, &v4_hash_addrs_); - } + fillBlocks(); - wmem_map_t *ipv6_hash_table = get_ipv6_hash_table(); - if (ipv6_hash_table) { - wmem_map_foreach(ipv6_hash_table, ipv6_hash_table_resolved_to_qstringlist, &host_addresses_); - wmem_map_foreach(ipv6_hash_table, ipv6_hash_table_to_qstringlist, &v6_hash_addrs_); - } + ethSortModel = new AStringListListSortFilterProxyModel(this); + ethTypeModel = new AStringListListSortFilterProxyModel(this); + EthernetAddressModel * ethModel = new EthernetAddressModel(this); + ethSortModel->setSourceModel(ethModel); + ethSortModel->setColumnToFilter(1); + ethSortModel->setColumnToFilter(2); + ethSortModel->setFilterCaseSensitivity(Qt::CaseInsensitive); + ethTypeModel->setSourceModel(ethSortModel); + ethTypeModel->setColumnToFilter(0); + ethTypeModel->setColumnToHide(0); + ui->tblAddresses->setModel(ethTypeModel); + ui->tblAddresses->resizeColumnsToContents(); + ui->tblAddresses->horizontalHeader()->setStretchLastSection(true); + ui->tblAddresses->sortByColumn(1, Qt::AscendingOrder); + ui->cmbDataType->addItems(ethModel->filterValues()); + + portSortModel = new AStringListListSortFilterProxyModel(this); + portTypeModel = new AStringListListSortFilterProxyModel(this); + PortsModel * portModel = new PortsModel(this); + portSortModel->setSourceModel(portModel); + portSortModel->setColumnAsNumeric(1); + portSortModel->setColumnToFilter(0); + portSortModel->setColumnToFilter(1); + portSortModel->setFilterCaseSensitivity(Qt::CaseInsensitive); + portTypeModel->setSourceModel(portSortModel); + portTypeModel->setColumnToFilter(2); + ui->tblPorts->setModel(portTypeModel); + ui->tblPorts->resizeColumnsToContents(); + ui->tblPorts->horizontalHeader()->setStretchLastSection(true); + ui->tblPorts->sortByColumn(1, Qt::AscendingOrder); + ui->cmbPortFilterType->addItems(portModel->filterValues()); +} - wmem_map_t *serv_port_hashtable = get_serv_port_hashtable(); - if(serv_port_hashtable){ - wmem_map_foreach(serv_port_hashtable, serv_port_hash_to_qstringlist, &service_ports_); - } +ResolvedAddressesDialog::~ResolvedAddressesDialog() +{ + delete ui; +} - wmem_map_t *eth_hashtable = get_eth_hashtable(); - if (eth_hashtable){ - wmem_map_foreach(eth_hashtable, eth_hash_to_qstringlist, ðernet_addresses_); - } +void ResolvedAddressesDialog::on_cmbDataType_currentIndexChanged(QString) +{ + if ( ! ethSortModel ) + return; - wmem_map_t *manuf_hashtable = get_manuf_hashtable(); - if (manuf_hashtable){ - wmem_map_foreach(manuf_hashtable, manuf_hash_to_qstringlist, ðernet_manufacturers_); + QString filter = ui->cmbDataType->currentText(); + if ( ui->cmbDataType->currentIndex() == 0 ) + { + filter.clear(); + ethTypeModel->setFilterType(AStringListListSortFilterProxyModel::FilterNone, 0); } + else + ethTypeModel->setFilterType(AStringListListSortFilterProxyModel::FilterByEquivalent, 0); + ethTypeModel->setFilter(filter); +} - wmem_map_t *wka_hashtable = get_wka_hashtable(); - if(wka_hashtable){ - wmem_map_foreach(wka_hashtable, wka_hash_to_qstringlist, ðernet_well_known_); - } +void ResolvedAddressesDialog::on_txtSearchFilter_textChanged(QString) +{ + if ( ! ethSortModel || ui->txtSearchFilter->text().length() < 3 ) + return; - fillShowMenu(); - fillBlocks(); + ethSortModel->setFilter(ui->txtSearchFilter->text()); } -ResolvedAddressesDialog::~ResolvedAddressesDialog() +void ResolvedAddressesDialog::on_cmbPortFilterType_currentIndexChanged(QString) { - delete ui; + if ( ! portSortModel ) + return; + + QString filter = ui->cmbPortFilterType->currentText(); + if ( ui->cmbPortFilterType->currentIndex() == 0 ) + { + filter.clear(); + portTypeModel->setFilterType(AStringListListSortFilterProxyModel::FilterNone, 2); + } + else + portTypeModel->setFilterType(AStringListListSortFilterProxyModel::FilterByEquivalent, 2); + portTypeModel->setFilter(filter); +} + +void ResolvedAddressesDialog::on_txtPortFilter_textChanged(QString val) +{ + if ( ! portSortModel ) + return; + + portSortModel->setFilter(val); } void ResolvedAddressesDialog::changeEvent(QEvent *event) @@ -252,7 +172,6 @@ void ResolvedAddressesDialog::changeEvent(QEvent *event) { case QEvent::LanguageChange: ui->retranslateUi(this); - fillShowMenu(); fillBlocks(); break; default: @@ -262,32 +181,6 @@ void ResolvedAddressesDialog::changeEvent(QEvent *event) QDialog::changeEvent(event); } -void ResolvedAddressesDialog::fillShowMenu() -{ - QPushButton *show_bt = ui->buttonBox->button(QDialogButtonBox::Apply); - show_bt->setText(tr("Show")); - - if (!show_bt->menu()) { - show_bt->setMenu(new QMenu(show_bt)); - } - - QMenu *show_menu = show_bt->menu(); - show_menu->clear(); - - show_menu->addAction(ui->actionAddressesHosts); - show_menu->addAction(ui->actionComment); - show_menu->addAction(ui->actionIPv4HashTable); - show_menu->addAction(ui->actionIPv6HashTable); - show_menu->addAction(ui->actionPortNames); - show_menu->addAction(ui->actionEthernetAddresses); - show_menu->addAction(ui->actionEthernetManufacturers); - show_menu->addAction(ui->actionEthernetWKA); - - show_menu->addSeparator(); - show_menu->addAction(ui->actionShowAll); - show_menu->addAction(ui->actionHideAll); -} - void ResolvedAddressesDialog::fillBlocks() { setUpdatesEnabled(false); @@ -309,169 +202,10 @@ void ResolvedAddressesDialog::fillBlocks() ui->plainTextEdit->appendPlainText(lines); } - if (ui->actionAddressesHosts->isChecked()) { - lines = "\n"; - lines.append(tr("# Hosts\n#\n# ")); - if (!host_addresses_.isEmpty()) { - lines.append(entry_count_.arg(host_addresses_.length())); - lines.append("\n\n"); - lines.append(host_addresses_.join("\n")); - } else { - lines.append(no_entries_); - } - ui->plainTextEdit->appendPlainText(lines); - } - - if (ui->actionIPv4HashTable->isChecked()) { - lines = "\n"; - lines.append(tr("# IPv4 Hash Table\n#\n# ")); - if (!v4_hash_addrs_.isEmpty()) { - lines.append(entry_count_.arg(v4_hash_addrs_.length())); - lines.append(tr("\n\n")); - lines.append(v4_hash_addrs_.join("\n")); - } else { - lines.append(no_entries_); - } - ui->plainTextEdit->appendPlainText(lines); - } - - if (ui->actionIPv6HashTable->isChecked()) { - lines = "\n"; - lines.append(tr("# IPv6 Hash Table\n#\n# ")); - if (!v6_hash_addrs_.isEmpty()) { - lines.append(entry_count_.arg(v6_hash_addrs_.length())); - lines.append(tr("\n\n")); - lines.append(v6_hash_addrs_.join("\n")); - } else { - lines.append(no_entries_); - } - ui->plainTextEdit->appendPlainText(lines); - } - - if (ui->actionPortNames->isChecked()) { - lines = "\n"; - lines.append(tr("# Services\n#\n# ")); - if (!service_ports_.isEmpty()) { - lines.append(entry_count_.arg(service_ports_.length())); - lines.append(tr("\n\n")); - lines.append(service_ports_.join("\n")); - } else { - lines.append(no_entries_); - } - ui->plainTextEdit->appendPlainText(lines); - } - - if (ui->actionEthernetAddresses->isChecked()) { - lines = "\n"; - lines.append(tr("# Ethernet addresses\n#\n# ")); - if (!ethernet_addresses_.isEmpty()) { - lines.append(entry_count_.arg(ethernet_addresses_.length())); - lines.append(tr("\n\n")); - lines.append(ethernet_addresses_.join("\n")); - } else { - lines.append(no_entries_); - } - ui->plainTextEdit->appendPlainText(lines); - } - - if (ui->actionEthernetManufacturers->isChecked()) { - lines = "\n"; - lines.append(tr("# Ethernet manufacturers\n#\n# ")); - if (!ethernet_manufacturers_.isEmpty()) { - lines.append(entry_count_.arg(ethernet_manufacturers_.length())); - lines.append(tr("\n\n")); - lines.append(ethernet_manufacturers_.join("\n")); - } else { - lines.append(no_entries_); - } - ui->plainTextEdit->appendPlainText(lines); - } - - if (ui->actionEthernetWKA->isChecked()) { - lines = "\n"; - lines.append(tr("# Well known Ethernet addresses\n#\n# ")); - if (!ethernet_well_known_.isEmpty()) { - lines.append(entry_count_.arg(ethernet_well_known_.length())); - lines.append(tr("\n\n")); - lines.append(ethernet_well_known_.join("\n")); - } else { - lines.append(no_entries_); - } - ui->plainTextEdit->appendPlainText(lines); - } - ui->plainTextEdit->moveCursor(QTextCursor::Start); setUpdatesEnabled(true); } -void ResolvedAddressesDialog::on_actionAddressesHosts_triggered() -{ - fillBlocks(); -} - -void ResolvedAddressesDialog::on_actionComment_triggered() -{ - fillBlocks(); -} - -void ResolvedAddressesDialog::on_actionIPv4HashTable_triggered() -{ - fillBlocks(); -} - -void ResolvedAddressesDialog::on_actionIPv6HashTable_triggered() -{ - fillBlocks(); -} - -void ResolvedAddressesDialog::on_actionPortNames_triggered() -{ - fillBlocks(); -} - -void ResolvedAddressesDialog::on_actionEthernetAddresses_triggered() -{ - fillBlocks(); -} - -void ResolvedAddressesDialog::on_actionEthernetManufacturers_triggered() -{ - fillBlocks(); -} - -void ResolvedAddressesDialog::on_actionEthernetWKA_triggered() -{ - fillBlocks(); -} - -void ResolvedAddressesDialog::on_actionShowAll_triggered() -{ - ui->actionAddressesHosts->setChecked(true); - ui->actionComment->setChecked(true); - ui->actionIPv4HashTable->setChecked(true); - ui->actionIPv6HashTable->setChecked(true); - ui->actionPortNames->setChecked(true); - ui->actionEthernetAddresses->setChecked(true); - ui->actionEthernetManufacturers->setChecked(true); - ui->actionEthernetWKA->setChecked(true); - - fillBlocks(); -} - -void ResolvedAddressesDialog::on_actionHideAll_triggered() -{ - ui->actionAddressesHosts->setChecked(false); - ui->actionComment->setChecked(false); - ui->actionIPv4HashTable->setChecked(false); - ui->actionIPv6HashTable->setChecked(false); - ui->actionPortNames->setChecked(false); - ui->actionEthernetAddresses->setChecked(false); - ui->actionEthernetManufacturers->setChecked(false); - ui->actionEthernetWKA->setChecked(false); - - fillBlocks(); -} - /* * Editor modelines * |