summaryrefslogtreecommitdiff
path: root/mainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mainwindow.cpp')
-rw-r--r--mainwindow.cpp190
1 files changed, 26 insertions, 164 deletions
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 7391403..9b6534d 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -1,10 +1,10 @@
-#include "mainwindow.h"
-#include "ui_mainwindow.h"
-
#include <exception>
#include <qfiledialog.h>
#include <QMouseEvent>
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, tableContextMenu()
@@ -42,25 +42,6 @@ MainWindow::MainWindow(QWidget *parent)
enableMenuButtons(this, false);
enableHexEditButtons(this, false);
- const auto& isEthernetSrcColumn = [this](const int& column) {
- return column == 6;
- };
- const auto& isEthernetDstColumn = [this](const int& column) {
- return column == 7;
- };
- const auto& isIpSrcColumn = [this](const int& column) {
- return column == 8;
- };
- const auto& isIpDstColumn = [this](const int& column) {
- return column == 9;
- };
- const auto& isPortSrcColumn = [this](const int& column) {
- return column == 10;
- };
- const auto& isPortDstColumn = [this](const int& column) {
- return column == 11;
- };
-
tableContextMenu.randomize.setText("Randomize");
tableContextMenu.menu.addAction(&tableContextMenu.randomize);
@@ -74,55 +55,31 @@ MainWindow::MainWindow(QWidget *parent)
myHexEdit.contextMenu.addAction(&myHexEdit.deleteBytes);
myHexEdit.contextMenu.addAction(&myHexEdit.deleteSelection);
- connect(&tableContextMenu.randomize, &QAction::triggered, this, [this, isEthernetSrcColumn, isEthernetDstColumn, isIpSrcColumn, isIpDstColumn, isPortSrcColumn, isPortDstColumn](bool checked __attribute__((unused))){
- if (!ppp)
- throw std::runtime_error("Can not randomize, no packets available");
+ connect(&tableContextMenu.randomize, &QAction::triggered, this, [this](bool checked __attribute__((unused))){
+ ui->tableWidget->randomizeLayerItem(ppp);
- const auto & y = ui->tableWidget->currentRow();
- const auto & col = ui->tableWidget->currentColumn() + 1;
-
- if (isEthernetSrcColumn(col) || isEthernetDstColumn(col)) {
- ppp->randomizeEth(y, isEthernetSrcColumn(col));
- } else if (isIpSrcColumn(col) || isIpDstColumn(col)) {
- ppp->randomizeIp(y, isIpSrcColumn(col));
- } else if (isPortSrcColumn(col) || isPortDstColumn(col)) {
- ppp->randomizePort(y, isPortSrcColumn(col));
- } else throw std::runtime_error("BUG: No supported column selected");
-
- if (!MainWindow::updateTableRow(y))
- throw std::runtime_error("BUG: Could not update table row");
+ const auto &rawPacket = ppp->getRawPacket(ui->tableWidget->currentRow());
+ myHexEdit.editor.setData(QByteArray::fromRawData(reinterpret_cast<const char *>(rawPacket.getRawData()), rawPacket.getRawDataLen()));
});
- connect(ui->tableWidget, &QTableWidget::itemChanged, this, [this, isEthernetSrcColumn, isEthernetDstColumn, isIpSrcColumn, isIpDstColumn, isPortSrcColumn, isPortDstColumn](QTableWidgetItem *item) {
- if (!item || !ppp)
- return;
+ connect(ui->tableWidget, &QTableWidget::itemChanged, this, [this](QTableWidgetItem *item) {
+ ui->tableWidget->setLayerItem(item, ppp, isProcessing);
- const auto & y = ui->tableWidget->currentRow();
- const auto & col = ui->tableWidget->currentColumn() + 1;
- const auto & text = item->text().toStdString();
-
- if (isEthernetSrcColumn(col) || isEthernetDstColumn(col)) {
- ppp->setEth(y, text, isEthernetSrcColumn(col));
- } else if (isIpSrcColumn(col) || isIpDstColumn(col)) {
- ppp->setIp(y, text, isIpSrcColumn(col));
- } else if (isPortSrcColumn(col) || isPortDstColumn(col)) {
- ppp->setPort(y, text, isPortSrcColumn(col));
+ if (!isProcessing) {
+ const auto &rawPacket = ppp->getRawPacket(item->row());
+ myHexEdit.editor.setData(QByteArray::fromRawData(reinterpret_cast<const char *>(rawPacket.getRawData()), rawPacket.getRawDataLen()));
}
-
- if (isProcessing)
- return;
- if (!MainWindow::updateTableRow(y))
- throw std::runtime_error("BUG: Could not update table row");
});
- connect(ui->tableWidget, &QTableWidget::customContextMenuRequested, this, [this, enableTableButtons, isEthernetSrcColumn, isEthernetDstColumn, isIpSrcColumn, isIpDstColumn, isPortSrcColumn, isPortDstColumn](const QPoint& pos){
+ connect(ui->tableWidget, &QTableWidget::customContextMenuRequested, this, [this, enableTableButtons](const QPoint& pos){
const auto & globalPos = ui->tableWidget->viewport()->mapToGlobal(pos);
const auto & col = ui->tableWidget->currentColumn() + 1;
+ const auto & table = ui->tableWidget;
if (ppp
- && (isEthernetSrcColumn(col) || isEthernetDstColumn(col)
- || isIpSrcColumn(col) || isIpDstColumn(col)
- || isPortSrcColumn(col) || isPortDstColumn(col)))
+ && (table->isEthernetSrcColumn(col) || table->isEthernetDstColumn(col)
+ || table->isIpSrcColumn(col) || table->isIpDstColumn(col)
+ || table->isPortSrcColumn(col) || table->isPortDstColumn(col)))
enableTableButtons(this, true);
else
enableTableButtons(this, false);
@@ -203,7 +160,7 @@ MainWindow::MainWindow(QWidget *parent)
if (fileName.length() > 0) {
ui->lineEdit->clear();
ui->tableWidget->clearSelection();
- ui->tableWidget->clear();
+ ui->tableWidget->clearContents();
ui->tableWidget->setRowCount(0);
myHexEdit.editor.data().data_ptr()->clear();
enableTableButtons(this, true);
@@ -231,7 +188,7 @@ MainWindow::MainWindow(QWidget *parent)
throw std::runtime_error("Reopen PCAP File to apply a BPF failed.");
if (!ppp->setFilter(ui->lineEdit->text()))
throw std::runtime_error("Could not re-apply a previously set filter.");
- ui->tableWidget->clear();
+ ui->tableWidget->clearContents();
ui->tableWidget->setRowCount(0);
emit processPcap();
}
@@ -285,14 +242,12 @@ MainWindow::MainWindow(QWidget *parent)
connect(this, &MainWindow::processPcap, this, [&](){
pcpp::Packet packet;
if (!ppp) throw std::runtime_error("PcapPlusPlus was not initialized.");
- firstPacketTs = 0;
isProcessing = true;
while (ppp->processPacket(packet)) {
- if (!firstPacketTs)
- firstPacketTs = packet.getRawPacket()->getPacketTimeStamp().tv_sec;
emit onPacketAvailable();
}
+ ui->tableWidget->clearSelection();
isProcessing = false;
pcpp::PcapFileReaderDevice::PcapStats stats;
@@ -304,17 +259,14 @@ MainWindow::MainWindow(QWidget *parent)
});
connect(this, &MainWindow::onPacketAvailable, this, [&]() {
- if (!addTableRow())
- throw std::runtime_error("Could not add row to table for packet");
+ emit ui->tableWidget->addRow(ppp);
});
- connect(ui->tableWidget, &QTableWidget::cellPressed, this, [&] {
- const auto &selected = ui->tableWidget->selectedItems();
- if (selected.empty())
- return;
-
- const auto &rawPacket = ppp->getRawPacket(selected.last()->row());
- myHexEdit.editor.setData(QByteArray::fromRawData(reinterpret_cast<const char *>(rawPacket.getRawData()), rawPacket.getRawDataLen()));
+ connect(ui->tableWidget, &QTableWidget::currentCellChanged, this, [&](int currentRow, int currentColumn, int previousRow, int previousColumn) {
+ if (!isProcessing && currentRow >= 0) {
+ const auto &rawPacket = ppp->getRawPacket(currentRow);
+ myHexEdit.editor.setData(QByteArray::fromRawData(reinterpret_cast<const char *>(rawPacket.getRawData()), rawPacket.getRawDataLen()));
+ }
});
connect(ui->tableWidget, &QTableWidget::itemSelectionChanged, this, [this, enableHexEditButtons]() {
@@ -363,96 +315,6 @@ pcpp::RawPacket* MainWindow::currentSelectedPacket()
return &ppp->getRawPacket(selected.last()->row());
}
-bool MainWindow::addTableRow()
-{
- QTableWidgetItem* itemRelativeTime = new QTableWidgetItem();
- QTableWidgetItem* itemFrameLength = new QTableWidgetItem();
- QTableWidgetItem* itemFirstLayerProtocol = new QTableWidgetItem();
- QTableWidgetItem* itemSecondLayerProtocol = new QTableWidgetItem();
- QTableWidgetItem* itemThirdLayerProtocol = new QTableWidgetItem();
- QTableWidgetItem* itemSrcMac = new QTableWidgetItem();
- QTableWidgetItem* itemDstMac = new QTableWidgetItem();
- QTableWidgetItem* itemSrcIp = new QTableWidgetItem();
- QTableWidgetItem* itemDstIp = new QTableWidgetItem();
- QTableWidgetItem* itemSrcPort = new QTableWidgetItem();
- QTableWidgetItem* itemDstPort = new QTableWidgetItem();
- QTableWidgetItem* itemDesc = new QTableWidgetItem();
-
- if (!itemRelativeTime || !itemFrameLength || !itemFirstLayerProtocol || !itemSecondLayerProtocol || !itemThirdLayerProtocol
- || !itemSrcMac || !itemDstMac || !itemSrcIp || !itemDstIp || !itemSrcPort || ! itemDstPort || !itemDesc)
- {
- delete itemRelativeTime;
- delete itemFrameLength;
- delete itemFirstLayerProtocol;
- delete itemSecondLayerProtocol;
- delete itemThirdLayerProtocol;
- delete itemSrcMac;
- delete itemDstMac;
- delete itemSrcIp;
- delete itemDstIp;
- delete itemSrcPort;
- delete itemDstPort;
- delete itemDesc;
-
- return false;
- }
-
- ui->tableWidget->insertRow(ui->tableWidget->rowCount());
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 0, itemRelativeTime);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 1, itemFrameLength);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 2, itemFirstLayerProtocol);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 3, itemSecondLayerProtocol);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 4, itemThirdLayerProtocol);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 5, itemSrcMac);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 6, itemDstMac);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 7, itemSrcIp);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 8, itemDstIp);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 9, itemSrcPort);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 10, itemDstPort);
- ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 11, itemDesc);
-
- ui->tableWidget->item(ui->tableWidget->rowCount() - 1, 0)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
- ui->tableWidget->item(ui->tableWidget->rowCount() - 1, 1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
- ui->tableWidget->item(ui->tableWidget->rowCount() - 1, 2)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
- ui->tableWidget->item(ui->tableWidget->rowCount() - 1, 3)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
- ui->tableWidget->item(ui->tableWidget->rowCount() - 1, 4)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
- ui->tableWidget->item(ui->tableWidget->rowCount() - 1, 11)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
-
- return updateTableRow(ui->tableWidget->rowCount() - 1);
-}
-
-bool MainWindow::updateTableRow(size_t index)
-{
- if (!ppp)
- return false;
-
- auto parsedPacket = pcpp::Packet(&ppp->getRawPacket(index));
- const auto *firstLayer = PcapPlusPlus::getFirstLayer(parsedPacket);
- const auto *secondLayer = firstLayer ? firstLayer->getNextLayer() : nullptr;
- const auto *thirdLayer = secondLayer ? secondLayer->getNextLayer() : nullptr;
- const auto ethTuple = PcapPlusPlus::getEthTuple(parsedPacket);
- const auto ipTuple = PcapPlusPlus::getIpTuple(parsedPacket);
- const auto l4Tuple = PcapPlusPlus::getLayer4Tuple(parsedPacket);
-
- if (!firstLayer)
- return false;
-
- ui->tableWidget->item(index, 0)->setText(tr("%1").arg(parsedPacket.getRawPacket()->getPacketTimeStamp().tv_sec - firstPacketTs));
- ui->tableWidget->item(index, 1)->setText(tr("%1").arg(parsedPacket.getRawPacket()->getFrameLength()));
- ui->tableWidget->item(index, 2)->setText(tr("%1").arg(firstLayer ? PcapPlusPlus::getProtocolTypeAsString(firstLayer->getProtocol()) : ""));
- ui->tableWidget->item(index, 3)->setText(tr("%1").arg(secondLayer ? PcapPlusPlus::getProtocolTypeAsString(secondLayer->getProtocol()) : ""));
- ui->tableWidget->item(index, 4)->setText(tr("%1").arg(thirdLayer ? PcapPlusPlus::getProtocolTypeAsString(thirdLayer->getProtocol()) : ""));
- ui->tableWidget->item(index, 5)->setText(tr("%1").arg(std::get<0>(ethTuple)));
- ui->tableWidget->item(index, 6)->setText(tr("%1").arg(std::get<1>(ethTuple)));
- ui->tableWidget->item(index, 7)->setText(tr("%1").arg(std::get<0>(ipTuple)));
- ui->tableWidget->item(index, 8)->setText(tr("%1").arg(std::get<1>(ipTuple)));
- ui->tableWidget->item(index, 9)->setText(tr("%1").arg(std::get<0>(l4Tuple)));
- ui->tableWidget->item(index, 10)->setText(tr("%1").arg(std::get<1>(l4Tuple)));
- ui->tableWidget->item(index, 11)->setText(tr("%1").arg(QString::fromStdString(thirdLayer ? thirdLayer->toString() : (secondLayer ? secondLayer->toString() : (firstLayer ? firstLayer->toString() : "")))));
-
- return true;
-}
-
bool MainWindow::eventFilter(QObject *obj __attribute__((unused)), QEvent *event)
{
if (event->type() == QEvent::MouseMove)