|  | Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |

# fortunethread.cpp Example File
network/blockingfortuneclient/fortunethread.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 <QtNetwork>

        #include "fortunethread.h"

        FortuneThread::FortuneThread(QObject *parent)
            : QThread(parent), quit(false)
        {
        }

        FortuneThread::~FortuneThread()
        {
            quit = true;
            cond.wakeOne();
            wait();
        }

        void FortuneThread::requestNewFortune(const QString &hostName, quint16 port)
        {
            QMutexLocker locker(&mutex);
            this->hostName = hostName;
            this->port = port;
            if (!isRunning())
                start();
            else
                cond.wakeOne();
        }

        void FortuneThread::run()
        {
            mutex.lock();
            QString serverName = hostName;
            quint16 serverPort = port;
            mutex.unlock();

            while (!quit) {
                const int Timeout = 5 * 1000;

                QTcpSocket socket;
                socket.connectToHost(serverName, serverPort);

                if (!socket.waitForConnected(Timeout)) {
                    emit error(socket.error(), socket.errorString());
                    return;
                }

                while (socket.bytesAvailable() < (int)sizeof(quint16)) {
                    if (!socket.waitForReadyRead(Timeout)) {
                        emit error(socket.error(), socket.errorString());
                        return;
                    }
                }

                quint16 blockSize;
                QDataStream in(&socket);
                in.setVersion(QDataStream::Qt_4_0);
                in >> blockSize;

                while (socket.bytesAvailable() < blockSize) {
                    if (!socket.waitForReadyRead(Timeout)) {
                        emit error(socket.error(), socket.errorString());
                        return;
                    }
                }

                QMutexLocker locker(&mutex);

                QString fortune;
                in >> fortune;
                emit newFortune(fortune);

                cond.wait(&mutex);
                serverName = hostName;
                serverPort = port;
            }
        }