diff options
Diffstat (limited to 'ui/qt/packet_dialog.cpp')
-rw-r--r-- | ui/qt/packet_dialog.cpp | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/ui/qt/packet_dialog.cpp b/ui/qt/packet_dialog.cpp new file mode 100644 index 0000000000..c9b9c1176a --- /dev/null +++ b/ui/qt/packet_dialog.cpp @@ -0,0 +1,163 @@ +/* packet_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 "packet_dialog.h" +#include "ui_packet_dialog.h" + +#include "epan/column.h" +#include "epan/ftypes/ftypes.h" + +#include "frame_tvbuff.h" + +#include "byte_view_tab.h" +#include "proto_tree.h" +#include "wireshark_application.h" + +#include <QTreeWidgetItemIterator> + +// To do: +// - Find a way to preserve the byte view after the file closes. +// - Copy over experimental packet editing code. +// - Fix ElidedText width. + +PacketDialog::PacketDialog(QWidget &parent, CaptureFile &cf, bool from_reference) : + WiresharkDialog(parent, cf), + ui(new Ui::PacketDialog), + packet_data_(NULL) +{ + ui->setupUi(this); + + // XXX Use recent settings instead + resize(parent.width() * 4 / 5, parent.height() * 4 / 5); + + frame_data * fdata = cap_file_.capFile()->current_frame; + + if(from_reference) { + guint32 framenum = fvalue_get_uinteger(&(cap_file_.capFile()->finfo_selected->value)); + if (framenum < 1) reject(); + + fdata = frame_data_sequence_find(cap_file_.capFile()->frames, framenum); + } + if (!fdata) reject(); + + setWindowSubtitle(tr("Packet %1").arg(fdata->num)); + + phdr_ = cap_file_.capFile()->phdr; + packet_data_ = (guint8 *) g_memdup(ws_buffer_start_ptr(&(cap_file_.capFile()->buf)), fdata->cap_len); + + if (!cf_read_record(cap_file_.capFile(), fdata)) reject(); + /* proto tree, visible. We need a proto tree if there's custom columns */ + epan_dissect_init(&edt_, cap_file_.capFile()->epan, TRUE, TRUE); + col_custom_prime_edt(&edt_, &(cap_file_.capFile()->cinfo)); + + epan_dissect_run(&edt_, cap_file_.capFile()->cd_t, &phdr_, + frame_tvbuff_new(fdata, packet_data_), + fdata, &(cap_file_.capFile()->cinfo)); + epan_dissect_fill_in_columns(&edt_, TRUE, TRUE); + + proto_tree_ = new ProtoTree(ui->packetSplitter); + proto_tree_->fillProtocolTree(edt_.tree); + proto_tree_->expandAll(); + + byte_view_tab_ = new ByteViewTab(ui->packetSplitter); + byte_view_tab_->setCaptureFile(cap_file_.capFile()); + byte_view_tab_->clear(); + + GSList *src_le; + for (src_le = edt_.pi.data_src; src_le != NULL; src_le = src_le->next) { + struct data_source *source; + char* source_name; + source = (struct data_source *)src_le->data; + source_name = get_data_source_name(source); + byte_view_tab_->addTab(source_name, get_data_source_tvb(source), edt_.tree, proto_tree_, + cap_file_.capFile()->current_frame->flags.encoding); + wmem_free(NULL, source_name); + } + byte_view_tab_->setCurrentIndex(0); + + ui->packetSplitter->setStretchFactor(0, 5); + ui->packetSplitter->setStretchFactor(1, 1); + + QStringList col_parts; + for (int i = 0; i < cap_file_.capFile()->cinfo.num_cols; ++i) { + col_parts << QString("<b>%1</b>").arg(get_column_title(i)); + col_parts << cap_file_.capFile()->cinfo.col_data[i]; + } + col_info_ = col_parts.join(" "); + setHintText(); + + connect(this, SIGNAL(monospaceFontChanged(QFont)), + proto_tree_, SLOT(setMonospaceFont(QFont))); + connect(this, SIGNAL(monospaceFontChanged(QFont)), + byte_view_tab_, SLOT(setMonospaceFont(QFont))); + + connect(proto_tree_, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), + byte_view_tab_, SLOT(protoTreeItemChanged(QTreeWidgetItem*))); + connect(byte_view_tab_, SIGNAL(byteFieldHovered(QString&)), + this, SLOT(setHintText(QString&))); +} + +PacketDialog::~PacketDialog() +{ + delete ui; + epan_dissect_cleanup(&edt_); + g_free(packet_data_); +} + +void PacketDialog::captureFileClosing() +{ + delete byte_view_tab_; + byte_view_tab_ = NULL; + + QTreeWidgetItemIterator iter(proto_tree_); + while (*iter) { + QTreeWidgetItem *item = (*iter); + item->setData(0, Qt::UserRole, QVariant()); + ++iter; + } + + setHintText(); + WiresharkDialog::captureFileClosing(); +} + +void PacketDialog::setHintText(QString &hint) +{ + ui->hintLabel->setText(QString("<small><i>%1</i></small>") + .arg(hint.isEmpty() ? col_info_ : hint)); +} + +void PacketDialog::on_buttonBox_helpRequested() +{ + wsApp->helpTopicAction(HELP_NEW_PACKET_DIALOG); +} + +/* + * Editor modelines + * + * Local Variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * ex: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ |