dialog.cpp Example File
network/loopback/dialog.cpp
/****************************************************************************
**
** Copyright (C) 2004-2006 Trolltech ASA. All rights reserved.
**
** This file is part of the documentation of the Qt Toolkit.
**
** This file may be used under the terms of the GNU General Public
** License version 2.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of
** this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
** http://www.trolltech.com/products/qt/opensource.html
**
** If you are unsure which license is appropriate for your use, please
** review the following information:
** http://www.trolltech.com/products/qt/licensing.html or contact the
** sales department at sales@trolltech.com.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/
#include <QtGui>
#include <QtNetwork>
#include "dialog.h"
static const int TotalBytes = 50 * 1024 * 1024;
static const int PayloadSize = 65536;
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"));
connect(startButton, SIGNAL(clicked()), this, SLOT(start()));
connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
connect(&tcpServer, SIGNAL(newConnection()),
this, SLOT(acceptConnection()));
connect(&tcpClient, SIGNAL(connected()), this, SLOT(startTransfer()));
connect(&tcpClient, SIGNAL(bytesWritten(qint64)),
this, SLOT(updateClientProgress(qint64)));
connect(&tcpClient, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(displayError(QAbstractSocket::SocketError)));
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch(1);
buttonLayout->addWidget(startButton);
buttonLayout->addWidget(quitButton);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(clientProgressBar);
mainLayout->addWidget(clientStatusLabel);
mainLayout->addWidget(serverProgressBar);
mainLayout->addWidget(serverStatusLabel);
mainLayout->addLayout(buttonLayout);
setLayout(mainLayout);
setWindowTitle(tr("Loopback"));
}
void Dialog::start()
{
startButton->setEnabled(false);
QApplication::setOverrideCursor(Qt::WaitCursor);
bytesWritten = 0;
bytesReceived = 0;
while (!tcpServer.isListening() && !tcpServer.listen()) {
int 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();
connect(tcpServerConnection, SIGNAL(readyRead()),
this, SLOT(updateServerProgress()));
connect(tcpServerConnection, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(displayError(QAbstractSocket::SocketError)));
serverStatusLabel->setText(tr("Accepted connection"));
tcpServer.close();
}
void Dialog::startTransfer()
{
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);
QApplication::restoreOverrideCursor();
}
}
void Dialog::updateClientProgress(qint64 numBytes)
{
bytesWritten += (int)numBytes;
if (bytesToWrite > 0)
bytesToWrite -= (int)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);
QApplication::restoreOverrideCursor();
}