Revision control
++ // Copyright (C) 2017 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ #include <QtWidgets>
++ #include <QtNetwork>
++
++ #include "client.h"
++
++ //! [0]
++ Client::Client(QWidget *parent)
++ : QDialog(parent)
++ , hostCombo(new QComboBox)
++ , portLineEdit(new QLineEdit)
++ , getFortuneButton(new QPushButton(tr("Get Fortune")))
++ , tcpSocket(new QTcpSocket(this))
++ {
++ //! [0]
++ hostCombo->setEditable(true);
++ // find out name of this machine
++ QString name = QHostInfo::localHostName();
++ if (!name.isEmpty()) {
++ hostCombo->addItem(name);
++ QString domain = QHostInfo::localDomainName();
++ if (!domain.isEmpty())
++ hostCombo->addItem(name + QChar('.') + domain);
++ }
++ if (name != QLatin1String("localhost"))
++ hostCombo->addItem(QString("localhost"));
++ // find out IP addresses of this machine
++ const QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
++ // add non-localhost addresses
++ for (const QHostAddress &entry : ipAddressesList) {
++ if (!entry.isLoopback())
++ hostCombo->addItem(entry.toString());
++ }
++ // add localhost addresses
++ for (const QHostAddress &entry : ipAddressesList) {
++ if (entry.isLoopback())
++ hostCombo->addItem(entry.toString());
++ }
++
++ portLineEdit->setValidator(new QIntValidator(1, 65535, this));
++
++ auto hostLabel = new QLabel(tr("&Server name:"));
++ hostLabel->setBuddy(hostCombo);
++ auto portLabel = new QLabel(tr("S&erver port:"));
++ portLabel->setBuddy(portLineEdit);
++
++ statusLabel = new QLabel(tr("This examples requires that you run the "
++ "Fortune Server example as well."));
++
++ getFortuneButton->setDefault(true);
++ getFortuneButton->setEnabled(false);
++
++ auto quitButton = new QPushButton(tr("Quit"));
++
++ auto buttonBox = new QDialogButtonBox;
++ buttonBox->addButton(getFortuneButton, QDialogButtonBox::ActionRole);
++ buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
++
++ //! [1]
++ in.setDevice(tcpSocket);
++ in.setVersion(QDataStream::Qt_6_5);
++ //! [1]
++
++ connect(hostCombo, &QComboBox::editTextChanged,
++ this, &Client::enableGetFortuneButton);
++ connect(portLineEdit, &QLineEdit::textChanged,
++ this, &Client::enableGetFortuneButton);
++ connect(getFortuneButton, &QAbstractButton::clicked,
++ this, &Client::requestNewFortune);
++ connect(quitButton, &QAbstractButton::clicked, this, &QWidget::close);
++ //! [2] //! [3]
++ connect(tcpSocket, &QIODevice::readyRead, this, &Client::readFortune);
++ //! [2] //! [4]
++ connect(tcpSocket, &QAbstractSocket::errorOccurred,
++ //! [3]
++ this, &Client::displayError);
++ //! [4]
++
++ QGridLayout *mainLayout = nullptr;
++ if (QGuiApplication::styleHints()->showIsFullScreen() || QGuiApplication::styleHints()->showIsMaximized()) {
++ auto outerVerticalLayout = new QVBoxLayout(this);
++ outerVerticalLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding));
++ auto outerHorizontalLayout = new QHBoxLayout;
++ outerHorizontalLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Ignored));
++ auto groupBox = new QGroupBox(QGuiApplication::applicationDisplayName());
++ mainLayout = new QGridLayout(groupBox);
++ outerHorizontalLayout->addWidget(groupBox);
++ outerHorizontalLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Ignored));
++ outerVerticalLayout->addLayout(outerHorizontalLayout);
++ outerVerticalLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding));
++ } else {
++ mainLayout = new QGridLayout(this);
++ }
++ mainLayout->addWidget(hostLabel, 0, 0);
++ mainLayout->addWidget(hostCombo, 0, 1);
++ mainLayout->addWidget(portLabel, 1, 0);
++ mainLayout->addWidget(portLineEdit, 1, 1);
++ mainLayout->addWidget(statusLabel, 2, 0, 1, 2);
++ mainLayout->addWidget(buttonBox, 3, 0, 1, 2);
++
++ setWindowTitle(QGuiApplication::applicationDisplayName());
++ portLineEdit->setFocus();
++ //! [5]
++ }
++ //! [5]
++
++ //! [6]
++ void Client::requestNewFortune()
++ {
++ getFortuneButton->setEnabled(false);
++ tcpSocket->abort();
++ //! [7]
++ tcpSocket->connectToHost(hostCombo->currentText(),
++ portLineEdit->text().toInt());
++ //! [7]
++ }
++ //! [6]
++
++ //! [8]
++ void Client::readFortune()
++ {
++ in.startTransaction();
++
++ QString nextFortune;
++ in >> nextFortune;
++
++ if (!in.commitTransaction())
++ return;
++
++ if (nextFortune == currentFortune) {
++ QTimer::singleShot(0, this, &Client::requestNewFortune);
++ return;
++ }
++
++ currentFortune = nextFortune;
++ statusLabel->setText(currentFortune);
++ getFortuneButton->setEnabled(true);
++ }
++ //! [8]
++
++ //! [13]
++ void Client::displayError(QAbstractSocket::SocketError socketError)
++ {
++ switch (socketError) {
++ case QAbstractSocket::RemoteHostClosedError:
++ break;
++ case QAbstractSocket::HostNotFoundError:
++ QMessageBox::information(this, tr("Fortune Client"),
++ tr("The host was not found. Please check the "
++ "host name and port settings."));
++ break;
++ case QAbstractSocket::ConnectionRefusedError:
++ QMessageBox::information(this, tr("Fortune Client"),
++ tr("The connection was refused by the peer. "
++ "Make sure the fortune server is running, "
++ "and check that the host name and port "
++ "settings are correct."));
++ break;
++ default:
++ QMessageBox::information(this, tr("Fortune Client"),
++ tr("The following error occurred: %1.")
++ .arg(tcpSocket->errorString()));
++ }
++
++ getFortuneButton->setEnabled(true);
++ }
++ //! [13]
++
++ void Client::enableGetFortuneButton()
++ {
++ getFortuneButton->setEnabled(!hostCombo->currentText().isEmpty() &&
++ !portLineEdit->text().isEmpty());
++
++ }