diff options
Diffstat (limited to 'examples/network/loopback/dialog.cpp')
-rw-r--r-- | examples/network/loopback/dialog.cpp | 202 |
1 files changed, 0 insertions, 202 deletions
diff --git a/examples/network/loopback/dialog.cpp b/examples/network/loopback/dialog.cpp deleted file mode 100644 index 4037f4c085..0000000000 --- a/examples/network/loopback/dialog.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "dialog.h" - -#include <QtNetwork> -#include <QtWidgets> - -static const int TotalBytes = 50 * 1024 * 1024; -static const int PayloadSize = 64 * 1024; // 64 KB - -Dialog::Dialog(QWidget *parent) - : QDialog(parent) -{ - clientProgressBar = new QProgressBar; - clientStatusLabel = new QLabel(tr("Client ready")); - serverProgressBar = new QProgressBar; - serverStatusLabel = new QLabel(tr("Server ready")); - - startButton = new QPushButton(tr("&Start")); - quitButton = new QPushButton(tr("&Quit")); - - buttonBox = new QDialogButtonBox; - buttonBox->addButton(startButton, QDialogButtonBox::ActionRole); - buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole); - - connect(startButton, &QAbstractButton::clicked, this, &Dialog::start); - connect(quitButton, &QAbstractButton::clicked, this, &QWidget::close); - connect(&tcpServer, &QTcpServer::newConnection, - this, &Dialog::acceptConnection); - connect(&tcpClient, &QAbstractSocket::connected, this, &Dialog::startTransfer); - connect(&tcpClient, &QIODevice::bytesWritten, - this, &Dialog::updateClientProgress); - connect(&tcpClient, &QAbstractSocket::errorOccurred, - this, &Dialog::displayError); - - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addWidget(clientProgressBar); - mainLayout->addWidget(clientStatusLabel); - mainLayout->addWidget(serverProgressBar); - mainLayout->addWidget(serverStatusLabel); - mainLayout->addStretch(1); - mainLayout->addSpacing(10); - mainLayout->addWidget(buttonBox); - setLayout(mainLayout); - - setWindowTitle(tr("Loopback")); -} - -void Dialog::start() -{ - startButton->setEnabled(false); - -#ifndef QT_NO_CURSOR - QGuiApplication::setOverrideCursor(Qt::WaitCursor); -#endif - - bytesWritten = 0; - bytesReceived = 0; - - while (!tcpServer.isListening() && !tcpServer.listen()) { - QMessageBox::StandardButton ret = QMessageBox::critical(this, - tr("Loopback"), - tr("Unable to start the test: %1.") - .arg(tcpServer.errorString()), - QMessageBox::Retry - | QMessageBox::Cancel); - if (ret == QMessageBox::Cancel) - return; - } - - serverStatusLabel->setText(tr("Listening")); - clientStatusLabel->setText(tr("Connecting")); - tcpClient.connectToHost(QHostAddress::LocalHost, tcpServer.serverPort()); -} - -void Dialog::acceptConnection() -{ - tcpServerConnection = tcpServer.nextPendingConnection(); - if (!tcpServerConnection) { - serverStatusLabel->setText(tr("Error: got invalid pending connection!")); - return; - } - - connect(tcpServerConnection, &QIODevice::readyRead, - this, &Dialog::updateServerProgress); - connect(tcpServerConnection, &QAbstractSocket::errorOccurred, - this, &Dialog::displayError); - connect(tcpServerConnection, &QTcpSocket::disconnected, - tcpServerConnection, &QTcpSocket::deleteLater); - - serverStatusLabel->setText(tr("Accepted connection")); - tcpServer.close(); -} - -void Dialog::startTransfer() -{ - // called when the TCP client connected to the loopback server - bytesToWrite = TotalBytes - int(tcpClient.write(QByteArray(PayloadSize, '@'))); - clientStatusLabel->setText(tr("Connected")); -} - -void Dialog::updateServerProgress() -{ - bytesReceived += int(tcpServerConnection->bytesAvailable()); - tcpServerConnection->readAll(); - - serverProgressBar->setMaximum(TotalBytes); - serverProgressBar->setValue(bytesReceived); - serverStatusLabel->setText(tr("Received %1MB") - .arg(bytesReceived / (1024 * 1024))); - - if (bytesReceived == TotalBytes) { - tcpServerConnection->close(); - startButton->setEnabled(true); -#ifndef QT_NO_CURSOR - QGuiApplication::restoreOverrideCursor(); -#endif - } -} - -void Dialog::updateClientProgress(qint64 numBytes) -{ - // called when the TCP client has written some bytes - bytesWritten += int(numBytes); - - // only write more if not finished and when the Qt write buffer is below a certain size. - if (bytesToWrite > 0 && tcpClient.bytesToWrite() <= 4 * PayloadSize) - bytesToWrite -= tcpClient.write(QByteArray(qMin(bytesToWrite, PayloadSize), '@')); - - clientProgressBar->setMaximum(TotalBytes); - clientProgressBar->setValue(bytesWritten); - clientStatusLabel->setText(tr("Sent %1MB").arg(bytesWritten / (1024 * 1024))); -} - -void Dialog::displayError(QAbstractSocket::SocketError socketError) -{ - if (socketError == QTcpSocket::RemoteHostClosedError) - return; - - QMessageBox::information(this, tr("Network error"), - tr("The following error occurred: %1.") - .arg(tcpClient.errorString())); - - tcpClient.close(); - tcpServer.close(); - clientProgressBar->reset(); - serverProgressBar->reset(); - clientStatusLabel->setText(tr("Client ready")); - serverStatusLabel->setText(tr("Server ready")); - startButton->setEnabled(true); -#ifndef QT_NO_CURSOR - QGuiApplication::restoreOverrideCursor(); -#endif -} |