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

# fortunethread.cpp Example File
network/blockingfortuneclient/fortunethread.cpp

        /****************************************************************************
        **
        ** Copyright (C) 2004-2005 Trolltech AS. All rights reserved.
        **
        ** This file is part of the documentation of the Qt Toolkit.
        **
        ** This file may be distributed under the terms of the Q Public License
    ** as defined by Trolltech AS of Norway and appearing in the file
    ** LICENSE.QPL included in the packaging of this file.
    **
    ** This file may be distributed and/or modified under the terms of the
    ** GNU General Public License version 2 as published by the Free Software
    ** Foundation and appearing in the file LICENSE.GPL included in the
    ** packaging of this file.
    **
    ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
    **   information about Qt Commercial License Agreements.
    ** See http://www.trolltech.com/qpl/ for QPL licensing information.
    ** See http://www.trolltech.com/gpl/ for GPL licensing information.
    **
    ** Contact info@trolltech.com if any conditions of this licensing are
    ** not clear to you.
        **
        ** 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()
        {
            QString serverName = hostName;
            quint16 serverPort = port;

            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;
            }
        }