201 lines
6.6 KiB
C++
201 lines
6.6 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
|
** All rights reserved.
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
|
**
|
|
** This file is part of the QtNetwork module of the Qt Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** GNU Lesser General Public License Usage
|
|
** This file may be used under the terms of the GNU Lesser General Public
|
|
** License version 2.1 as published by the Free Software Foundation and
|
|
** appearing in the file LICENSE.LGPL included in the packaging of this
|
|
** file. Please review the following information to ensure the GNU Lesser
|
|
** General Public License version 2.1 requirements will be met:
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
**
|
|
** In addition, as a special exception, Nokia gives you certain additional
|
|
** rights. These rights are described in the Nokia Qt LGPL Exception
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
**
|
|
** GNU General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU General
|
|
** Public License version 3.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 the GNU General
|
|
** Public License version 3.0 requirements will be met:
|
|
** http://www.gnu.org/copyleft/gpl.html.
|
|
**
|
|
** Other Usage
|
|
** Alternatively, this file may be used in accordance with the terms and
|
|
** conditions contained in a signed written agreement between you and Nokia.
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
** $QT_END_LICENSE$
|
|
**
|
|
****************************************************************************/
|
|
|
|
#ifndef QHTTPSOCKETENGINE_P_H
|
|
#define QHTTPSOCKETENGINE_P_H
|
|
|
|
//
|
|
// W A R N I N G
|
|
// -------------
|
|
//
|
|
// This file is not part of the Qt API. It exists purely as an
|
|
// implementation detail. This header file may change from version to
|
|
// version without notice, or even be removed.
|
|
//
|
|
// We mean it.
|
|
//
|
|
|
|
#include "private/qabstractsocketengine_p.h"
|
|
#include "qabstractsocket.h"
|
|
#include "qnetworkproxy.h"
|
|
#include "private/qauthenticator_p.h"
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
#if !defined(QT_NO_NETWORKPROXY) && !defined(QT_NO_HTTP)
|
|
|
|
class QTcpSocket;
|
|
class QHttpSocketEnginePrivate;
|
|
|
|
class Q_AUTOTEST_EXPORT QHttpSocketEngine : public QAbstractSocketEngine
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
enum HttpState {
|
|
None,
|
|
ConnectSent,
|
|
Connected,
|
|
SendAuthentication,
|
|
ReadResponseContent
|
|
};
|
|
QHttpSocketEngine(QObject *parent = 0);
|
|
~QHttpSocketEngine();
|
|
|
|
bool initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol = QAbstractSocket::IPv4Protocol);
|
|
bool initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = QAbstractSocket::ConnectedState);
|
|
|
|
void setProxy(const QNetworkProxy &networkProxy);
|
|
|
|
qintptr socketDescriptor() const;
|
|
|
|
bool isValid() const;
|
|
|
|
bool connectInternal();
|
|
bool connectToHost(const QHostAddress &address, quint16 port);
|
|
bool connectToHostByName(const QString &name, quint16 port);
|
|
bool bind(const QHostAddress &address, quint16 port);
|
|
bool listen();
|
|
int accept();
|
|
void close();
|
|
|
|
qint64 bytesAvailable() const;
|
|
|
|
qint64 read(char *data, qint64 maxlen);
|
|
qint64 write(const char *data, qint64 len);
|
|
|
|
#ifndef QT_NO_UDPSOCKET
|
|
#ifndef QT_NO_NETWORKINTERFACE
|
|
bool joinMulticastGroup(const QHostAddress &groupAddress,
|
|
const QNetworkInterface &interface);
|
|
bool leaveMulticastGroup(const QHostAddress &groupAddress,
|
|
const QNetworkInterface &interface);
|
|
QNetworkInterface multicastInterface() const;
|
|
bool setMulticastInterface(const QNetworkInterface &iface);
|
|
#endif // QT_NO_NETWORKINTERFACE
|
|
|
|
qint64 readDatagram(char *data, qint64 maxlen, QHostAddress *addr = 0,
|
|
quint16 *port = 0);
|
|
qint64 writeDatagram(const char *data, qint64 len, const QHostAddress &addr,
|
|
quint16 port);
|
|
bool hasPendingDatagrams() const;
|
|
qint64 pendingDatagramSize() const;
|
|
#endif // QT_NO_UDPSOCKET
|
|
|
|
qint64 bytesToWrite() const;
|
|
|
|
int option(SocketOption option) const;
|
|
bool setOption(SocketOption option, int value);
|
|
|
|
bool waitForRead(int msecs = 30000, bool *timedOut = 0);
|
|
bool waitForWrite(int msecs = 30000, bool *timedOut = 0);
|
|
bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
|
|
bool checkRead, bool checkWrite,
|
|
int msecs = 30000, bool *timedOut = 0);
|
|
|
|
bool isReadNotificationEnabled() const;
|
|
void setReadNotificationEnabled(bool enable);
|
|
bool isWriteNotificationEnabled() const;
|
|
void setWriteNotificationEnabled(bool enable);
|
|
bool isExceptionNotificationEnabled() const;
|
|
void setExceptionNotificationEnabled(bool enable);
|
|
|
|
public slots:
|
|
void slotSocketConnected();
|
|
void slotSocketDisconnected();
|
|
void slotSocketReadNotification();
|
|
void slotSocketBytesWritten();
|
|
void slotSocketError(QAbstractSocket::SocketError error);
|
|
void slotSocketStateChanged(QAbstractSocket::SocketState state);
|
|
|
|
private slots:
|
|
void emitPendingReadNotification();
|
|
void emitPendingWriteNotification();
|
|
void emitPendingConnectionNotification();
|
|
|
|
private:
|
|
void emitReadNotification();
|
|
void emitWriteNotification();
|
|
void emitConnectionNotification();
|
|
|
|
Q_DECLARE_PRIVATE(QHttpSocketEngine)
|
|
Q_DISABLE_COPY(QHttpSocketEngine)
|
|
|
|
};
|
|
|
|
|
|
class QHttpSocketEnginePrivate : public QAbstractSocketEnginePrivate
|
|
{
|
|
Q_DECLARE_PUBLIC(QHttpSocketEngine)
|
|
public:
|
|
QHttpSocketEnginePrivate();
|
|
~QHttpSocketEnginePrivate();
|
|
|
|
QNetworkProxy proxy;
|
|
QString peerName;
|
|
QTcpSocket *socket;
|
|
QByteArray readBuffer; // only used for parsing the proxy response
|
|
QHttpSocketEngine::HttpState state;
|
|
QAuthenticator authenticator;
|
|
bool readNotificationEnabled;
|
|
bool writeNotificationEnabled;
|
|
bool exceptNotificationEnabled;
|
|
bool readNotificationActivated;
|
|
bool writeNotificationActivated;
|
|
bool readNotificationPending;
|
|
bool writeNotificationPending;
|
|
bool connectionNotificationPending;
|
|
bool credentialsSent;
|
|
uint pendingResponseData;
|
|
};
|
|
|
|
class Q_AUTOTEST_EXPORT QHttpSocketEngineHandler : public QSocketEngineHandler
|
|
{
|
|
public:
|
|
virtual QAbstractSocketEngine *createSocketEngine(QAbstractSocket::SocketType socketType,
|
|
const QNetworkProxy &, QObject *parent);
|
|
virtual QAbstractSocketEngine *createSocketEngine(qintptr socketDescripter, QObject *parent);
|
|
};
|
|
#endif
|
|
|
|
QT_END_NAMESPACE
|
|
|
|
#endif // QHTTPSOCKETENGINE_H
|