aboutsummaryrefslogtreecommitdiffstats
path: root/ui/qt/packet_dialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ui/qt/packet_dialog.cpp')
-rw-r--r--ui/qt/packet_dialog.cpp163
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:
+ */