149 lines
5.1 KiB
C++
149 lines
5.1 KiB
C++
/* supported_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.
|
|
*/
|
|
|
|
// warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data
|
|
#ifdef _MSC_VER
|
|
#pragma warning(push)
|
|
#pragma warning(disable : 4267)
|
|
#endif
|
|
|
|
#include "supported_protocols_dialog.h"
|
|
#include "ui_supported_protocols_dialog.h"
|
|
|
|
#include "config.h"
|
|
|
|
#include <algorithm>
|
|
#include <glib.h>
|
|
|
|
#include <epan/proto.h>
|
|
|
|
#include <QTreeWidgetItem>
|
|
#include <QElapsedTimer>
|
|
|
|
#include "wireshark_application.h"
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning(pop)
|
|
#endif
|
|
|
|
enum { name_col_, filter_col_, type_col_, descr_col_ };
|
|
|
|
SupportedProtocolsDialog::SupportedProtocolsDialog(QWidget *parent) :
|
|
QDialog(parent),
|
|
ui(new Ui::SupportedProtocolsDialog),
|
|
field_count_(0)
|
|
{
|
|
ui->setupUi(this);
|
|
setWindowTitle(wsApp->windowTitleString(tr("Supported Protocols")));
|
|
|
|
// XXX Use recent settings instead
|
|
if (parent) resize(parent->width() * 3 / 4, parent->height());
|
|
|
|
// Some of our names are unreasonably long.
|
|
int one_em = fontMetrics().height();
|
|
ui->protoTreeWidget->setColumnWidth(name_col_, one_em * 15);
|
|
ui->protoTreeWidget->setColumnWidth(filter_col_, one_em * 10);
|
|
ui->protoTreeWidget->setColumnWidth(type_col_, one_em * 12);
|
|
ui->protoTreeWidget->setColumnWidth(descr_col_, one_em * 30);
|
|
|
|
QTimer::singleShot(0, this, SLOT(fillTree()));
|
|
}
|
|
|
|
SupportedProtocolsDialog::~SupportedProtocolsDialog()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void SupportedProtocolsDialog::updateStatistics()
|
|
{
|
|
QLocale locale = QLocale::system();
|
|
QString hint = tr("%1 protocols, %2 fields.")
|
|
.arg(locale.toString(ui->protoTreeWidget->topLevelItemCount()))
|
|
.arg(locale.toString(field_count_));
|
|
ui->hintLabel->setText(hint);
|
|
wsApp->processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers, 1);
|
|
}
|
|
|
|
void SupportedProtocolsDialog::fillTree()
|
|
{
|
|
void *proto_cookie;
|
|
QList <QTreeWidgetItem *> proto_list;
|
|
|
|
for (int proto_id = proto_get_first_protocol(&proto_cookie); proto_id != -1;
|
|
proto_id = proto_get_next_protocol(&proto_cookie)) {
|
|
protocol_t *protocol = find_protocol_by_id(proto_id);
|
|
QTreeWidgetItem *proto_ti = new QTreeWidgetItem();
|
|
proto_ti->setText(name_col_, proto_get_protocol_short_name(protocol));
|
|
proto_ti->setText(filter_col_, proto_get_protocol_filter_name(proto_id));
|
|
// type_col_ empty
|
|
proto_ti->setText(descr_col_, proto_get_protocol_long_name(protocol));
|
|
proto_ti->setData(name_col_, Qt::UserRole, proto_id);
|
|
proto_list << proto_ti;
|
|
}
|
|
|
|
updateStatistics();
|
|
ui->protoTreeWidget->invisibleRootItem()->addChildren(proto_list);
|
|
ui->protoTreeWidget->sortByColumn(name_col_, Qt::AscendingOrder);
|
|
|
|
foreach (QTreeWidgetItem *proto_ti, proto_list) {
|
|
void *field_cookie;
|
|
int proto_id = proto_ti->data(name_col_, Qt::UserRole).toInt();
|
|
QList <QTreeWidgetItem *> field_list;
|
|
for (header_field_info *hfinfo = proto_get_first_protocol_field(proto_id, &field_cookie); hfinfo != NULL;
|
|
hfinfo = proto_get_next_protocol_field(proto_id, &field_cookie)) {
|
|
if (hfinfo->same_name_prev_id != -1) continue;
|
|
|
|
QTreeWidgetItem *field_ti = new QTreeWidgetItem();
|
|
field_ti->setText(name_col_, hfinfo->name);
|
|
field_ti->setText(filter_col_, hfinfo->abbrev);
|
|
field_ti->setText(type_col_, ftype_pretty_name(hfinfo->type));
|
|
field_ti->setText(descr_col_, hfinfo->blurb);
|
|
field_list << field_ti;
|
|
|
|
field_count_++;
|
|
if (field_count_ % 10000 == 0) updateStatistics();
|
|
}
|
|
std::sort(field_list.begin(), field_list.end());
|
|
proto_ti->addChildren(field_list);
|
|
}
|
|
|
|
updateStatistics();
|
|
ui->protoTreeWidget->sortByColumn(name_col_, Qt::AscendingOrder);
|
|
}
|
|
|
|
// Copied from DisplayFilterExpressionDialog
|
|
void SupportedProtocolsDialog::on_searchLineEdit_textChanged(const QString &search_re)
|
|
{
|
|
QTreeWidgetItemIterator it(ui->protoTreeWidget);
|
|
QRegExp regex(search_re, Qt::CaseInsensitive);
|
|
while (*it) {
|
|
bool hidden = true;
|
|
if (search_re.isEmpty() || (*it)->text(0).contains(regex)) {
|
|
hidden = false;
|
|
}
|
|
(*it)->setHidden(hidden);
|
|
if (!hidden && (*it)->parent()) {
|
|
(*it)->parent()->setHidden(false);
|
|
}
|
|
++it;
|
|
}
|
|
}
|