#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->macList->sortByColumn(0, Qt::AscendingOrder); arp = new Arp; qRegisterMetaType("arp_t"); connect(arp, SIGNAL(received(arp_t)),this,SLOT(receive(arp_t))); } MainWindow::~MainWindow() { if (arp->isRunning()) arp->stop(); disconnect(this, SLOT(receive(arp_t))); delete arp; delete ui; } void MainWindow::receive(arp_t packet) { QScrollBar *scrollbar = ui->packetList->verticalScrollBar(); bool autoscroll = (scrollbar->value() == scrollbar->maximum()); /*adds packet to console */ new PacketListWidgetItem(ui->packetList, packet); qApp->processEvents(); if(autoscroll) scrollbar->setValue(scrollbar->maximum()); if (packet.arp_ip_src == QString("0.0.0.0") || packet.arp_mac_src == QString("ff:ff:ff:ff:ff:ff") || packet.arp_mac_src == QString("00:00:00:00:00:00")) return; /* sets arp_t data if item exists */ QTreeWidgetItemIterator iterator(ui->macList); while (*iterator) { MacTreeWidgetItem* item = (MacTreeWidgetItem *) *iterator; arp_t* arpData = item->arpData(); if (arpData != NULL) { if (arpData->arp_ip_src == packet.arp_ip_src) { item->setArpData(packet); return; } } iterator++; } /* otherwise create new item in MAC list */ new MacTreeWidgetItem(ui->macList, packet); ui->macList->resizeColumnToContents(0); ui->macList->resizeColumnToContents(1); } void MainWindow::on_actionStart_Logging_triggered() { QString device; if (!arp->isRunning()) { DeviceDialog dialog(this); dialog.clearDeviceList(); QStringList list = arp->getDeviceList(); if (list.count() == 0) { QMessageBox::critical(this, "ArpInfo Error", tr("Logging can not be started: %1").arg(arp->lastError()),QMessageBox::Ok, QMessageBox::Ok); return; } dialog.addDevices(list); if (dialog.exec() != QDialog::Accepted) { return; } device = dialog.getSelectedDevice(); if (!arp->start(device)) { QMessageBox::critical(this, "ArpInfo Error", tr("Logging can not be started: %1").arg(arp->lastError()),QMessageBox::Ok, QMessageBox::Ok); return; } ui->actionStart_Logging->setText(tr("Stop Logging")); ui->actionSend_RAW_Packet->setEnabled(true); ui->actionARP_Ping->setEnabled(true); setWindowTitle(tr("ARP Info - Logging on %1...").arg(device)); } else { arp->stop(); ui->actionStart_Logging->setText(tr("Start Logging")); ui->actionSend_RAW_Packet->setEnabled(false); ui->actionARP_Ping->setEnabled(false); setWindowTitle(tr("ARP Info")); } } void MainWindow::on_actionSend_RAW_Packet_triggered() { if (sendDialog == NULL) { sendDialog = new SendDialog(this); sendDialog->setArp(arp); } sendDialog->show(); sendDialog->raise(); sendDialog->activateWindow(); } void MainWindow::on_packetList_itemDoubleClicked(QListWidgetItem* item) { PacketListWidgetItem *packetItem = (PacketListWidgetItem *) item; arp_t *data = packetItem->arpData(); if (data == NULL) return; if (packetInfoDialog == NULL) { packetInfoDialog = new PacketInfoDialog(this); } packetInfoDialog->setArpPacket(*data); packetInfoDialog->show(); packetInfoDialog->raise(); packetInfoDialog->activateWindow(); } void MainWindow::on_actionARP_Ping_triggered() { if (arpPingDialog == NULL) { arpPingDialog = new ArpPingDialog(arp, this); connect(arpPingDialog, SIGNAL(clearMacList()), ui->macList, SLOT(clear())); connect(arpPingDialog, SIGNAL(rejected()), arpPingDialog, SLOT(stop())); } arpPingDialog->reset(); arpPingDialog->show(); arpPingDialog->raise(); arpPingDialog->activateWindow(); } void MainWindow::on_actionExit_triggered() { close(); } void MainWindow::on_actionSave_Mac_List_triggered() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save Mac List"), "", tr("Comma-separated values (*.csv)")); if (fileName.isNull()) return; QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::critical(this,"", tr("Error while saving mac list. File cannot be opened."), QMessageBox::Ok, QMessageBox::Ok); return; } QTextStream out(&file); out << "IP,MAC,TIME\n"; QTreeWidgetItemIterator iterator(ui->macList); while (*iterator) { MacTreeWidgetItem* item = (MacTreeWidgetItem *) *iterator; arp_t *data = item->arpData(); out << data->arp_ip_src << ","; out << data->arp_mac_src << ","; out << data->time.toString("yyyy-MM-dd hh:mm:ss") << "\n"; iterator++; } file.close(); }