-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmainwindow.cpp
More file actions
134 lines (117 loc) · 4.04 KB
/
Copy pathmainwindow.cpp
File metadata and controls
134 lines (117 loc) · 4.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHeaderView>
#include <QStandardItemModel>
#include <QStringList>
#include <QStringBuilder>
#include "ip_locator.h"
#include "traceroute.h"
#include "query_hostname_task.h"
#include <QDebug>
#include <QThreadPool>
#include <QFuture>
#include <QtConcurrent>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow) {
ui->setupUi(this);
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->tableView->setShowGrid(false);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
initModel();
locator = new ip_locator(this);
query = new query_hostname_task(this);
connect(locator, &ip_locator::on_ip_located, this, &MainWindow::on_ip_located);
connect(query, &query_hostname_task::on_finish, this, &MainWindow::on_ip_resolved);
}
void MainWindow::initModel() {
QStandardItemModel *model = new QStandardItemModel(this);
this->trace_model = model;
ui->tableView->setModel(model);
QStringList labels;
labels.append("Delay");
labels.append("IP");
labels.append("Hostname");
labels.append("Location");
model->setHorizontalHeaderLabels(labels);
}
void MainWindow::appendRow(int ttl, QString ip, QList<int> delay) {
QStringList list;
for(int i=0; i<delay.count(); i++) {
int value = delay.at(i);
QString str;
if (value == -1) {
str = "*";
} else if (value == 0) {
str = "<1ms";
} else {
str = QString::number(value) + "ms";
}
list.append(str);
}
QString delays = list.join(' ');
QString display_ip = ip;
if (ip.length() == 0) {
display_ip = "Request timed out.";
}
QStandardItem *item1 = new QStandardItem();
item1->setData(delays, 0);
QStandardItem *item2 = new QStandardItem();
item2->setData(display_ip, 0);
QStandardItem *item3 = new QStandardItem();
item3->setData("Resolving...", 0);
QStandardItem *item4 = new QStandardItem();
item4->setData("Resolving...", 0);
if (ip.length() == 0) {
item3->setData("", 0);
item4->setData("", 0);
}
QList<QStandardItem*> items;
items.append(item1);
items.append(item2);
items.append(item3);
items.append(item4);
this->trace_model->appendRow(items);
if (ip.length() != 0) {
locator->send_request(ip, ttl);
QtConcurrent::run(query, &query_hostname_task::run, ttl, ip);
}
}
void MainWindow::on_trace_receive(int ttl, QString source_ip, QList<int> delay) {
this->appendRow(ttl, source_ip, delay);
}
void MainWindow::on_trace_complete() {
QMessageBox::information(this, "iTracert", "Trace complete.");
ui->label_2->setText("Trace complete.");
}
void MainWindow::on_ip_located(int id, QString city, double longtitude, double latitude) {
if (longtitude < 0 || latitude < 0) {
this->updateRow(id - 1, 3, city);
} else {
this->updateRow(id - 1, 3, city + " (" + QString::number(longtitude) + "E, " + QString::number(latitude) + "N)");
}
}
void MainWindow::on_ip_resolved(int id, QString host) {
this->updateRow(id - 1, 2, host);
}
void MainWindow::updateRow(int row, int col, QString value) {
this->trace_model->item(row, col)->setData(value, 0);
}
MainWindow::~MainWindow() {
delete ui;
}
void MainWindow::on_pushButton_clicked() {
this->trace_model->clear();
this->initModel();
this->tracer = new traceroute(this, ui->lineEdit->text(), 3, ui->lineEdit_2->text().toInt());
ui->label_2->setText("Tracing route to " + ui->lineEdit->text() + " over a maximum of "+ ui->lineEdit_2->text() + " hops:");
connect(this->tracer, &traceroute::on_trace_receive, this, &MainWindow::on_trace_receive);
connect(this->tracer, &traceroute::on_trace_complete, this, &MainWindow::on_trace_complete);
QtConcurrent::run(tracer, &traceroute::start_trace);
}
void MainWindow::on_pushButton_2_clicked() {
if (this->tracer != nullptr) {
this->tracer->stop_trace();
}
}