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 135 136 137 138
|
// Copyright (C) 2018 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtCore>
#include <QtNetwork>
#include "addressdialog.h"
#include "association.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <utility>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent),
ui(new Ui::MainWindow),
nameTemplate(QStringLiteral("Alice (clone number %1)"))
{
ui->setupUi(this);
updateUi();
}
MainWindow::~MainWindow()
{
delete ui;
}
//! [0]
const QString colorizer(QStringLiteral("<font color=\"%1\">%2</font><br>"));
void MainWindow::addErrorMessage(const QString &message)
{
ui->clientMessages->insertHtml(colorizer.arg(QStringLiteral("Crimson"), message));
}
void MainWindow::addWarningMessage(const QString &message)
{
ui->clientMessages->insertHtml(colorizer.arg(QStringLiteral("DarkOrange"), message));
}
void MainWindow::addInfoMessage(const QString &message)
{
ui->clientMessages->insertHtml(colorizer.arg(QStringLiteral("DarkBlue"), message));
}
void MainWindow::addServerResponse(const QString &clientInfo, const QByteArray &datagram,
const QByteArray &plainText)
{
static const QString messageColor = QStringLiteral("DarkMagenta");
static const QString formatter = QStringLiteral("<br>---------------"
"<br>%1 received a DTLS datagram:<br> %2"
"<br>As plain text:<br> %3");
const QString html = formatter.arg(clientInfo, QString::fromUtf8(datagram.toHex(' ')),
QString::fromUtf8(plainText));
ui->serverMessages->insertHtml(colorizer.arg(messageColor, html));
}
//! [0]
void MainWindow::on_connectButton_clicked()
{
if (lookupId != -1) {
QHostInfo::abortHostLookup(lookupId);
lookupId = -1;
port = 0;
updateUi();
return;
}
AddressDialog dialog;
if (dialog.exec() != QDialog::Accepted)
return;
const QString hostName = dialog.remoteName();
if (hostName.isEmpty())
return addWarningMessage(tr("Host name or address required to connect"));
port = dialog.remotePort();
QHostAddress remoteAddress;
if (remoteAddress.setAddress(hostName))
return startNewConnection(remoteAddress);
addInfoMessage(tr("Looking up the host ..."));
lookupId = QHostInfo::lookupHost(hostName, this, &MainWindow::lookupFinished);
updateUi();
}
void MainWindow::updateUi()
{
ui->connectButton->setText(lookupId == -1 ? tr("Connect ...") : tr("Cancel lookup"));
ui->shutdownButton->setEnabled(connections.size() != 0);
}
void MainWindow::lookupFinished(const QHostInfo &hostInfo)
{
if (hostInfo.lookupId() != lookupId)
return;
lookupId = -1;
updateUi();
if (hostInfo.error() != QHostInfo::NoError) {
addErrorMessage(hostInfo.errorString());
return;
}
const QList<QHostAddress> foundAddresses = hostInfo.addresses();
if (foundAddresses.empty()) {
addWarningMessage(tr("Host not found"));
return;
}
const auto remoteAddress = foundAddresses.at(0);
addInfoMessage(tr("Connecting to: %1").arg(remoteAddress.toString()));
startNewConnection(remoteAddress);
}
void MainWindow::startNewConnection(const QHostAddress &address)
{
AssocPtr newConnection(new DtlsAssociation(address, port, nameTemplate.arg(nextId)));
connect(newConnection.data(), &DtlsAssociation::errorMessage, this, &MainWindow::addErrorMessage);
connect(newConnection.data(), &DtlsAssociation::warningMessage, this, &MainWindow::addWarningMessage);
connect(newConnection.data(), &DtlsAssociation::infoMessage, this, &MainWindow::addInfoMessage);
connect(newConnection.data(), &DtlsAssociation::serverResponse, this, &MainWindow::addServerResponse);
connections.push_back(std::move(newConnection));
connections.back()->startHandshake();
updateUi();
++nextId;
}
void MainWindow::on_shutdownButton_clicked()
{
connections.clear();
updateUi();
}
|