#include <QTextCodec>
#include <QTextDecoder>
+QT_BEGIN_NAMESPACE
+
const quint64 MAX_FRAME_SIZE_IN_BYTES = INT_MAX - 1;
const quint64 MAX_MESSAGE_SIZE_IN_BYTES = INT_MAX - 1;
+/*!
+ \internal
+ */
class Frame
{
public:
bool checkValidity();
};
+/*!
+ \internal
+ */
Frame::Frame() :
m_closeCode(QWebSocketProtocol::CC_NORMAL),
m_closeReason(),
{
}
+/*!
+ \internal
+ */
Frame::Frame(const Frame &other) :
m_closeCode(other.m_closeCode),
m_closeReason(other.m_closeReason),
{
}
+/*!
+ \internal
+ */
const Frame &Frame::operator =(const Frame &other)
{
m_closeCode = other.m_closeCode;
return *this;
}
+/*!
+ \internal
+ */
QWebSocketProtocol::CloseCode Frame::getCloseCode() const
{
return m_closeCode;
}
+/*!
+ \internal
+ */
QString Frame::getCloseReason() const
{
return m_closeReason;
}
+/*!
+ \internal
+ */
bool Frame::isFinalFrame() const
{
return m_isFinalFrame;
}
+/*!
+ \internal
+ */
bool Frame::isControlFrame() const
{
return (m_opCode & 0x08) == 0x08;
}
+/*!
+ \internal
+ */
bool Frame::isDataFrame() const
{
return !isControlFrame();
}
+/*!
+ \internal
+ */
bool Frame::isContinuationFrame() const
{
return isDataFrame() && (m_opCode == QWebSocketProtocol::OC_CONTINUE);
}
+/*!
+ \internal
+ */
bool Frame::hasMask() const
{
return m_mask != 0;
}
+/*!
+ \internal
+ */
quint32 Frame::getMask() const
{
return m_mask;
}
+/*!
+ \internal
+ */
int Frame::getRsv1() const
{
return m_rsv1;
}
+/*!
+ \internal
+ */
int Frame::getRsv2() const
{
return m_rsv2;
}
+/*!
+ \internal
+ */
int Frame::getRsv3() const
{
return m_rsv3;
}
+/*!
+ \internal
+ */
QWebSocketProtocol::OpCode Frame::getOpCode() const
{
return m_opCode;
}
+/*!
+ \internal
+ */
QByteArray Frame::getPayload() const
{
return m_payload;
}
+/*!
+ \internal
+ */
void Frame::clear()
{
m_closeCode = QWebSocketProtocol::CC_NORMAL;
m_isValid = false;
}
+/*!
+ \internal
+ */
bool Frame::isValid() const
{
return m_isValid;
#define WAIT_FOR_MORE_DATA(dataSizeInBytes) { returnState = processingState; processingState = PS_WAIT_FOR_MORE_DATA; dataWaitSize = dataSizeInBytes; }
+/*!
+ \internal
+ */
Frame Frame::readFrame(QTcpSocket *pSocket)
{
bool isDone = false;
return frame;
}
+/*!
+ \internal
+ */
void Frame::setError(QWebSocketProtocol::CloseCode code, QString closeReason)
{
clear();
m_isValid = false;
}
+/*!
+ \internal
+ */
bool Frame::checkValidity()
{
if (!isValid())
return m_isValid;
}
+/*!
+ \internal
+ */
DataProcessor::DataProcessor(QObject *parent) :
QObject(parent),
m_processingState(PS_READ_HEADER),
clear();
}
+/*!
+ \internal
+ */
DataProcessor::~DataProcessor()
{
clear();
}
}
+/*!
+ \internal
+ */
void DataProcessor::process(QTcpSocket *pSocket)
{
bool isDone = false;
}
}
+/*!
+ \internal
+ */
void DataProcessor::clear()
{
m_processingState = PS_READ_HEADER;
m_pConverterState = new QTextCodec::ConverterState(QTextCodec::ConvertInvalidToNull | QTextCodec::IgnoreHeader);
}
}
+
+QT_END_NAMESPACE
#include <QTextCodec>
#include "qwebsocketprotocol.h"
+QT_BEGIN_NAMESPACE
+
class QTcpSocket;
/**
QTextCodec *m_pTextCodec;
};
+QT_END_NAMESPACE
+
#endif // DATAPROCESSOR_P_H
#include <QStringList>
#include "qwebsocketprotocol.h"
+QT_BEGIN_NAMESPACE
+
+/*!
+ \internal
+ */
HandshakeRequest::HandshakeRequest(int port, bool isSecure) :
m_port(port),
m_isSecure(isSecure),
{
}
+/*!
+ \internal
+ */
HandshakeRequest::~HandshakeRequest()
{
}
+/*!
+ \internal
+ */
void HandshakeRequest::clear()
{
m_port = -1;
m_requestUrl.clear();
}
+/*!
+ \internal
+ */
int HandshakeRequest::getPort() const
{
return m_requestUrl.port(m_port);
}
+/*!
+ \internal
+ */
bool HandshakeRequest::isSecure() const
{
return m_isSecure;
}
+/*!
+ \internal
+ */
bool HandshakeRequest::isValid() const
{
return m_isValid;
}
+/*!
+ \internal
+ */
QMap<QString, QString> HandshakeRequest::getHeaders() const
{
return m_headers;
}
+/*!
+ \internal
+ */
QList<QWebSocketProtocol::Version> HandshakeRequest::getVersions() const
{
return m_versions;
}
+/*!
+ \internal
+ */
QString HandshakeRequest::getResourceName() const
{
return m_requestUrl.path();
}
+/*!
+ \internal
+ */
QString HandshakeRequest::getKey() const
{
return m_key;
}
+/*!
+ \internal
+ */
QString HandshakeRequest::getHost() const
{
return m_requestUrl.host();
}
+/*!
+ \internal
+ */
QString HandshakeRequest::getOrigin() const
{
return m_origin;
}
+/*!
+ \internal
+ */
QList<QString> HandshakeRequest::getProtocols() const
{
return m_protocols;
}
+/*!
+ \internal
+ */
QList<QString> HandshakeRequest::getExtensions() const
{
return m_extensions;
}
+/*!
+ \internal
+ */
QUrl HandshakeRequest::getRequestUrl() const
{
return m_requestUrl;
}
+/*!
+ \internal
+ */
QTextStream &HandshakeRequest::readFromStream(QTextStream &textStream)
{
m_isValid = false;
return textStream;
}
+/*!
+ \internal
+ */
QTextStream &operator >>(QTextStream &stream, HandshakeRequest &request)
{
return request.readFromStream(stream);
}
+
+QT_END_NAMESPACE
#include "qwebsocketprotocol.h"
+QT_BEGIN_NAMESPACE
+
class QTextStream;
class HandshakeRequest
QTextStream &operator >>(QTextStream &stream, HandshakeRequest &request);
+QT_END_NAMESPACE
+
#endif // HANDSHAKEREQUEST_P_H
#include <QSet>
#include <QList>
+QT_BEGIN_NAMESPACE
+
+/*!
+ \internal
+ */
HandshakeResponse::HandshakeResponse(const HandshakeRequest &request,
const QString &serverName,
bool isOriginAllowed,
m_isValid = true;
}
+/*!
+ \internal
+ */
HandshakeResponse::~HandshakeResponse()
{
}
+/*!
+ \internal
+ */
bool HandshakeResponse::isValid() const
{
return m_isValid;
}
+/*!
+ \internal
+ */
bool HandshakeResponse::canUpgrade() const
{
return m_isValid && m_canUpgrade;
}
+/*!
+ \internal
+ */
QString HandshakeResponse::getAcceptedProtocol() const
{
return m_acceptedProtocol;
}
+/*!
+ \internal
+ */
QString HandshakeResponse::calculateAcceptKey(const QString &key) const
{
QString tmpKey = key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; //the UID comes from RFC6455
return QString(hash.toBase64());
}
+/*!
+ \internal
+ */
QString HandshakeResponse::getHandshakeResponse(const HandshakeRequest &request,
const QString &serverName,
bool isOriginAllowed,
return response.join("\r\n");
}
+/*!
+ \internal
+ */
QTextStream &HandshakeResponse::writeToStream(QTextStream &textStream) const
{
if (!m_response.isEmpty())
return textStream;
}
+/*!
+ \internal
+ */
QTextStream &operator <<(QTextStream &stream, const HandshakeResponse &response)
{
return response.writeToStream(stream);
}
+/*!
+ \internal
+ */
QWebSocketProtocol::Version HandshakeResponse::getAcceptedVersion() const
{
return m_acceptedVersion;
}
+/*!
+ \internal
+ */
QString HandshakeResponse::getAcceptedExtension() const
{
return m_acceptedExtension;
}
+
+QT_END_NAMESPACE
#include <QObject>
#include "qwebsocketprotocol.h"
+QT_BEGIN_NAMESPACE
+
class HandshakeRequest;
class QString;
class QTextStream;
friend QTextStream &operator <<(QTextStream &stream, const HandshakeResponse &response);
};
+QT_END_NAMESPACE
+
#endif // HANDSHAKERESPONSE_P_H
-#include "qwebsocket.h"
-#include "qwebsocket_p.h"
-#include <QUrl>
-#include <QTcpSocket>
-#include <QByteArray>
-#include <QHostAddress>
-
-#include <QDebug>
-
-#include <limits>
-
/*!
\class QWebSocket
\brief The class QWebSocket implements a TCP socket that talks the websocket protocol.
\sa ping()
*/
+#include "qwebsocket.h"
+#include "qwebsocket_p.h"
+#include <QUrl>
+#include <QTcpSocket>
+#include <QByteArray>
+#include <QHostAddress>
+
+#include <QDebug>
+
+#include <limits>
+
+QT_BEGIN_NAMESPACE
const quint64 FRAME_SIZE_IN_BYTES = 512 * 512 * 2; //maximum size of a frame when sending a message
{
return d_ptr->isValid();
}
+
+QT_END_NAMESPACE
#include "qwebsocketsglobal.h"
#include "qwebsocketprotocol.h"
+QT_BEGIN_NAMESPACE
+
class QTcpSocket;
class QWebSocketPrivate;
friend class QWebSocketPrivate;
};
+QT_END_NAMESPACE
+
#endif // QWEBSOCKET_H
#include <limits>
+QT_BEGIN_NAMESPACE
+
const quint64 FRAME_SIZE_IN_BYTES = 512 * 512 * 2; //maximum size of a frame when sending a message
/*!
}
return valid;
}
+
+QT_END_NAMESPACE
#include "qwebsocketprotocol.h"
#include "dataprocessor_p.h"
+QT_BEGIN_NAMESPACE
+
class HandshakeRequest;
class HandshakeResponse;
class QTcpSocket;
friend class QWebSocket;
};
+QT_END_NAMESPACE
+
#endif // QWEBSOCKET_H
\internal
*/
+QT_BEGIN_NAMESPACE
+
/**
* @brief Contains constants related to the WebSocket standard.
*/
}
}
} //end namespace WebSocketProtocol
+
+QT_END_NAMESPACE
#ifndef QWEBSOCKETPROTOCOL_H
#define QWEBSOCKETPROTOCOL_H
+#include <qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
class QString;
class QByteArray;
-#include <qglobal.h>
namespace QWebSocketProtocol
{
} //end namespace QWebSocketProtocol
+QT_END_NAMESPACE
+
#endif // QWEBSOCKETPROTOCOL_H
-#include <QTcpServer>
-#include <QTcpSocket>
-#include <QNetworkProxy>
-#include "qwebsocketprotocol.h"
-#include "qwebsocket.h"
-#include "qwebsocketserver.h"
-#include "qwebsocketserver_p.h"
-
/*!
\class WebSocketServer
\sa hasPendingConnections() and nextPendingConnection().
*/
+#include <QTcpServer>
+#include <QTcpSocket>
+#include <QNetworkProxy>
+#include "qwebsocketprotocol.h"
+#include "qwebsocket.h"
+#include "qwebsocketserver.h"
+#include "qwebsocketserver_p.h"
+
+QT_BEGIN_NAMESPACE
+
/*!
Constructs a new WebSocketServer.
Q_UNUSED(origin)
return true;
}
+
+QT_END_NAMESPACE
#include "qwebsocketsglobal.h"
#include "qwebsocketprotocol.h"
+QT_BEGIN_NAMESPACE
+
class QWebSocketServerPrivate;
class QWebSocket;
friend class QWebSocketServerPrivate;
};
+QT_END_NAMESPACE
+
#endif // QWEBSOCKETSERVER_H
#include "qwebsocket.h"
#include "qwebsocket_p.h"
+QT_BEGIN_NAMESPACE
+
+/*!
+ \internal
+ */
QWebSocketServerPrivate::QWebSocketServerPrivate(const QString &serverName, QWebSocketServer * const pWebSocketServer, QObject *parent) :
QObject(parent),
q_ptr(pWebSocketServer),
connect(m_pTcpServer, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
}
+/*!
+ \internal
+ */
QWebSocketServerPrivate::~QWebSocketServerPrivate()
{
while (!m_pendingConnections.isEmpty())
m_pTcpServer->deleteLater();
}
+/*!
+ \internal
+ */
void QWebSocketServerPrivate::close()
{
m_pTcpServer->close();
}
+/*!
+ \internal
+ */
QString QWebSocketServerPrivate::errorString() const
{
return m_pTcpServer->errorString();
}
+/*!
+ \internal
+ */
bool QWebSocketServerPrivate::hasPendingConnections() const
{
return !m_pendingConnections.isEmpty();
}
+/*!
+ \internal
+ */
bool QWebSocketServerPrivate::isListening() const
{
return m_pTcpServer->isListening();
}
+/*!
+ \internal
+ */
bool QWebSocketServerPrivate::listen(const QHostAddress &address, quint16 port)
{
return m_pTcpServer->listen(address, port);
}
+/*!
+ \internal
+ */
int QWebSocketServerPrivate::maxPendingConnections() const
{
return m_pTcpServer->maxPendingConnections();
}
+/*!
+ \internal
+ */
void QWebSocketServerPrivate::addPendingConnection(QWebSocket *pWebSocket)
{
if (m_pendingConnections.size() < maxPendingConnections())
}
}
+/*!
+ \internal
+ */
QWebSocket *QWebSocketServerPrivate::nextPendingConnection()
{
QWebSocket *pWebSocket = 0;
return m_pTcpServer->proxy();
}
+/*!
+ \internal
+ */
+/*!
+ \internal
+ */
QHostAddress QWebSocketServerPrivate::serverAddress() const
{
return m_pTcpServer->serverAddress();
}
+/*!
+ \internal
+ */
QAbstractSocket::SocketError QWebSocketServerPrivate::serverError() const
{
return m_pTcpServer->serverError();
}
+/*!
+ \internal
+ */
quint16 QWebSocketServerPrivate::serverPort() const
{
return m_pTcpServer->serverPort();
}
+/*!
+ \internal
+ */
void QWebSocketServerPrivate::setMaxPendingConnections(int numConnections)
{
m_pTcpServer->setMaxPendingConnections(numConnections);
m_pTcpServer->setProxy(networkProxy);
}
+/*!
+ \internal
+ */
bool QWebSocketServerPrivate::setSocketDescriptor(int socketDescriptor)
{
return m_pTcpServer->setSocketDescriptor(socketDescriptor);
}
+/*!
+ \internal
+ */
int QWebSocketServerPrivate::socketDescriptor() const
{
return m_pTcpServer->socketDescriptor();
}
+/*!
+ \internal
+ */
bool QWebSocketServerPrivate::waitForNewConnection(int msec, bool *timedOut)
{
return m_pTcpServer->waitForNewConnection(msec, timedOut);
}
+/*!
+ \internal
+ */
QList<QWebSocketProtocol::Version> QWebSocketServerPrivate::supportedVersions() const
{
QList<QWebSocketProtocol::Version> supportedVersions;
return supportedVersions;
}
+/*!
+ \internal
+ */
QList<QString> QWebSocketServerPrivate::supportedProtocols() const
{
QList<QString> supportedProtocols;
return supportedProtocols; //no protocols are currently supported
}
+/*!
+ \internal
+ */
QList<QString> QWebSocketServerPrivate::supportedExtensions() const
{
QList<QString> supportedExtensions;
return supportedExtensions; //no extensions are currently supported
}
+/*!
+ \internal
+ */
void QWebSocketServerPrivate::onNewConnection()
{
QTcpSocket *pTcpSocket = m_pTcpServer->nextPendingConnection();
connect(pTcpSocket, SIGNAL(readyRead()), this, SLOT(handshakeReceived()));
}
+/*!
+ \internal
+ */
void QWebSocketServerPrivate::onCloseConnection()
{
QTcpSocket *pTcpSocket = qobject_cast<QTcpSocket*>(sender());
}
}
+/*!
+ \internal
+ */
void QWebSocketServerPrivate::handshakeReceived()
{
QTcpSocket *pTcpSocket = qobject_cast<QTcpSocket*>(sender());
qDebug() << "WebSocketServerPrivate::handshakeReceived: Sender socket is NULL. This should not happen!!!";
}
}
+
+QT_END_NAMESPACE
#include <QHostAddress>
#include "qwebsocket.h"
+QT_BEGIN_NAMESPACE
+
class QTcpServer;
class QWebSocketServer;
void addPendingConnection(QWebSocket *pWebSocket);
};
+QT_END_NAMESPACE
+
#endif // QWEBSOCKETSERVER_P_H