Revision control

++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ #include <QtNetwork>
++
++ #include "fortunethread.h"
++
++ FortuneThread::FortuneThread(QObject *parent)
++ : QThread(parent), quit(false)
++ {
++ }
++
++ //! [0]
++ FortuneThread::~FortuneThread()
++ {
++ mutex.lock();
++ quit = true;
++ cond.wakeOne();
++ mutex.unlock();
++ wait();
++ }
++ //! [0]
++
++ //! [1] //! [2]
++ void FortuneThread::requestNewFortune(const QString &hostName, quint16 port)
++ {
++ //! [1]
++ QMutexLocker locker(&mutex);
++ this->hostName = hostName;
++ this->port = port;
++ //! [3]
++ if (!isRunning())
++ start();
++ else
++ cond.wakeOne();
++ }
++ //! [2] //! [3]
++
++ //! [4]
++ void FortuneThread::run()
++ {
++ mutex.lock();
++ //! [4] //! [5]
++ QString serverName = hostName;
++ quint16 serverPort = port;
++ mutex.unlock();
++ //! [5]
++
++ //! [6]
++ while (!quit) {
++ //! [7]
++ const int Timeout = 5 * 1000;
++
++ QTcpSocket socket;
++ socket.connectToHost(serverName, serverPort);
++ //! [6] //! [8]
++
++ if (!socket.waitForConnected(Timeout)) {
++ emit error(socket.error(), socket.errorString());
++ return;
++ }
++ //! [8] //! [11]
++
++ QDataStream in(&socket);
++ in.setVersion(QDataStream::Qt_6_5);
++ QString fortune;
++ //! [11] //! [12]
++
++ do {
++ if (!socket.waitForReadyRead(Timeout)) {
++ emit error(socket.error(), socket.errorString());
++ return;
++ }
++
++ in.startTransaction();
++ in >> fortune;
++ } while (!in.commitTransaction());
++ //! [12] //! [15]
++
++ mutex.lock();
++ emit newFortune(fortune);
++ //! [7]
++
++ cond.wait(&mutex);
++ serverName = hostName;
++ serverPort = port;
++ mutex.unlock();
++ }
++ //! [15]
++ }