Added extra signal reemission
[contrib/qtwebsockets.git] / src / qwebsocket_p.h
1 /**
2  * @file websocket.h
3  * @brief Defines the WebSocket class.
4  *
5  * \note Currently, only V13 (RFC6455) is supported.
6  * \note Both text and binary websockets are supported.
7  * \note The secure version (wss) is currently not implemented.
8  * @author Kurt Pattyn (pattyn.kurt@gmail.com)
9  */
10
11 #ifndef QWEBSOCKET_P_H
12 #define QWEBSOCKET_P_H
13 //
14 //  W A R N I N G
15 //  -------------
16 //
17 // This file is not part of the Qt API.  It exists purely as an
18 // implementation detail.  This header file may change from version to
19 // version without notice, or even be removed.
20 //
21 // We mean it.
22 //
23
24 #include <QUrl>
25 #include <QAbstractSocket>
26 #include <QHostAddress>
27 #ifndef QT_NO_NETWORKPROXY
28 #include <QNetworkProxy>
29 #endif
30 #include <QTime>
31 #include "qwebsocketsglobal.h"
32 #include "qwebsocketprotocol.h"
33 #include "dataprocessor_p.h"
34
35 QT_BEGIN_NAMESPACE
36
37 class HandshakeRequest;
38 class HandshakeResponse;
39 class QTcpSocket;
40 class QWebSocket;
41
42 class QWebSocketPrivate:public QObject
43 {
44         Q_OBJECT
45
46 public:
47         explicit QWebSocketPrivate(QString origin,
48                                                            QWebSocketProtocol::Version version,
49                                                            QWebSocket * const pWebSocket,
50                                                            QObject *parent = 0);
51         virtual ~QWebSocketPrivate();
52
53         void abort();
54         QAbstractSocket::SocketError error() const;
55         QString errorString() const;
56         bool flush();
57         bool isValid();
58         QHostAddress localAddress() const;
59         quint16 localPort() const;
60         QAbstractSocket::PauseModes pauseMode() const;
61         QHostAddress peerAddress() const;
62         QString peerName() const;
63         quint16 peerPort() const;
64 #ifndef QT_NO_NETWORKPROXY
65         QNetworkProxy proxy() const;
66         void setProxy(const QNetworkProxy &networkProxy);
67 #endif
68         qint64 readBufferSize() const;
69         void resume();
70         void setPauseMode(QAbstractSocket::PauseModes pauseMode);
71         void setReadBufferSize(qint64 size);
72         void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value);
73         QVariant socketOption(QAbstractSocket::SocketOption option);
74         QAbstractSocket::SocketState state() const;
75
76         bool waitForConnected(int msecs = 30000);
77         bool waitForDisconnected(int msecs = 30000);
78
79         QWebSocketProtocol::Version version();
80         QString resourceName();
81         QUrl requestUrl();
82         QString origin();
83         QString protocol();
84         QString extension();
85
86         qint64 write(const char *message);              //send data as text
87         qint64 write(const char *message, qint64 maxSize);              //send data as text
88         qint64 write(const QString &message);   //send data as text
89         qint64 write(const QByteArray &data);   //send data as binary
90
91 public Q_SLOTS:
92         virtual void close(QWebSocketProtocol::CloseCode closeCode = QWebSocketProtocol::CC_NORMAL, QString reason = QString());
93         virtual void open(const QUrl &url, bool mask = true);
94         void ping();
95
96 private Q_SLOTS:
97         void processData();
98         void processControlFrame(QWebSocketProtocol::OpCode opCode, QByteArray frame);
99         void processHandshake(QTcpSocket *pSocket);
100         void processStateChanged(QAbstractSocket::SocketState socketState);
101
102 private:
103         Q_DISABLE_COPY(QWebSocketPrivate)
104
105         QWebSocket * const q_ptr;
106
107         QWebSocketPrivate(QTcpSocket *pTcpSocket, QWebSocketProtocol::Version version, QWebSocket *pWebSocket, QObject *parent = 0);
108         void setVersion(QWebSocketProtocol::Version version);
109         void setResourceName(QString resourceName);
110         void setRequestUrl(QUrl requestUrl);
111         void setOrigin(QString origin);
112         void setProtocol(QString protocol);
113         void setExtension(QString extension);
114         void enableMasking(bool enable);
115         void setSocketState(QAbstractSocket::SocketState state);
116         void setErrorString(QString errorString);
117
118         qint64 doWriteData(const QByteArray &data, bool isBinary);
119         qint64 doWriteFrames(const QByteArray &data, bool isBinary);
120
121         void makeConnections(const QTcpSocket *pTcpSocket);
122         void releaseConnections(const QTcpSocket *pTcpSocket);
123
124         QByteArray getFrameHeader(QWebSocketProtocol::OpCode opCode, quint64 payloadLength, quint32 maskingKey, bool lastFrame) const;
125         QString calculateAcceptKey(const QString &key) const;
126         QString createHandShakeRequest(QString resourceName,
127                                                                    QString host,
128                                                                    QString origin,
129                                                                    QString extensions,
130                                                                    QString protocols,
131                                                                    QByteArray key);
132
133         static QWebSocket *upgradeFrom(QTcpSocket *tcpSocket,
134                                                                    const HandshakeRequest &request,
135                                                                    const HandshakeResponse &response,
136                                                                    QObject *parent = 0);
137
138         quint32 generateMaskingKey() const;
139         QByteArray generateKey() const;
140         quint32 generateRandomNumber() const;
141         qint64 writeFrames(const QList<QByteArray> &frames);
142         qint64 writeFrame(const QByteArray &frame);
143
144         QTcpSocket *m_pSocket;
145         QString m_errorString;
146         QWebSocketProtocol::Version m_version;
147         QUrl m_resource;
148         QString m_resourceName;
149         QUrl m_requestUrl;
150         QString m_origin;
151         QString m_protocol;
152         QString m_extension;
153         QAbstractSocket::SocketState m_socketState;
154
155         QByteArray m_key;       //identification key used in handshake requests
156
157         bool m_mustMask;        //a server must not mask the frames it sends
158
159         bool m_isClosingHandshakeSent;
160         bool m_isClosingHandshakeReceived;
161
162         QTime m_pingTimer;
163
164         DataProcessor m_dataProcessor;
165
166
167         friend class QWebSocketServerPrivate;
168         friend class QWebSocket;
169 };
170
171 QT_END_NAMESPACE
172
173 #endif // QWEBSOCKET_H