diff options
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | examples/websockets/echoserver/echoserver.cpp | 1 | ||||
-rw-r--r-- | examples/websockets/simplechat/chatserver.cpp | 3 | ||||
-rw-r--r-- | examples/websockets/sslechoclient/sslechoclient.cpp | 3 | ||||
-rw-r--r-- | examples/websockets/sslechoserver/sslechoserver.cpp | 4 | ||||
-rw-r--r-- | src/imports/qmlwebsockets/plugins.qmltypes | 17 | ||||
-rw-r--r-- | src/imports/qmlwebsockets/qmlwebsockets.pro | 2 | ||||
-rw-r--r-- | src/imports/qmlwebsockets/qmlwebsockets_plugin.cpp | 1 | ||||
-rw-r--r-- | src/imports/qmlwebsockets/qqmlwebsocket.cpp | 24 | ||||
-rw-r--r-- | src/imports/qmlwebsockets/qqmlwebsocket.h | 3 | ||||
-rw-r--r-- | src/websockets/qwebsocket_p.cpp | 9 | ||||
-rw-r--r-- | tests/auto/qml/qmlwebsockets/tst_qmlwebsockets.qml | 25 |
12 files changed, 73 insertions, 21 deletions
diff --git a/.qmake.conf b/.qmake.conf index 9a1a304..69f27df 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -2,4 +2,4 @@ load(qt_build_config) CONFIG += warning_clean -MODULE_VERSION = 5.7.0 +MODULE_VERSION = 5.8.0 diff --git a/examples/websockets/echoserver/echoserver.cpp b/examples/websockets/echoserver/echoserver.cpp index 013ddc2..d4e3b65 100644 --- a/examples/websockets/echoserver/echoserver.cpp +++ b/examples/websockets/echoserver/echoserver.cpp @@ -59,7 +59,6 @@ EchoServer::EchoServer(quint16 port, bool debug, QObject *parent) : QObject(parent), m_pWebSocketServer(new QWebSocketServer(QStringLiteral("Echo Server"), QWebSocketServer::NonSecureMode, this)), - m_clients(), m_debug(debug) { if (m_pWebSocketServer->listen(QHostAddress::Any, port)) { diff --git a/examples/websockets/simplechat/chatserver.cpp b/examples/websockets/simplechat/chatserver.cpp index 33e5d8d..5a0c998 100644 --- a/examples/websockets/simplechat/chatserver.cpp +++ b/examples/websockets/simplechat/chatserver.cpp @@ -57,8 +57,7 @@ QT_USE_NAMESPACE //! [constructor] ChatServer::ChatServer(quint16 port, QObject *parent) : QObject(parent), - m_pWebSocketServer(Q_NULLPTR), - m_clients() + m_pWebSocketServer(Q_NULLPTR) { m_pWebSocketServer = new QWebSocketServer(QStringLiteral("Chat Server"), QWebSocketServer::NonSecureMode, diff --git a/examples/websockets/sslechoclient/sslechoclient.cpp b/examples/websockets/sslechoclient/sslechoclient.cpp index cb15e35..3de2fec 100644 --- a/examples/websockets/sslechoclient/sslechoclient.cpp +++ b/examples/websockets/sslechoclient/sslechoclient.cpp @@ -56,8 +56,7 @@ QT_USE_NAMESPACE //! [constructor] SslEchoClient::SslEchoClient(const QUrl &url, QObject *parent) : - QObject(parent), - m_webSocket() + QObject(parent) { connect(&m_webSocket, &QWebSocket::connected, this, &SslEchoClient::onConnected); typedef void (QWebSocket:: *sslErrorsSignal)(const QList<QSslError> &); diff --git a/examples/websockets/sslechoserver/sslechoserver.cpp b/examples/websockets/sslechoserver/sslechoserver.cpp index 777d8dd..ae5d9ad 100644 --- a/examples/websockets/sslechoserver/sslechoserver.cpp +++ b/examples/websockets/sslechoserver/sslechoserver.cpp @@ -60,8 +60,7 @@ QT_USE_NAMESPACE //! [constructor] SslEchoServer::SslEchoServer(quint16 port, QObject *parent) : QObject(parent), - m_pWebSocketServer(Q_NULLPTR), - m_clients() + m_pWebSocketServer(Q_NULLPTR) { m_pWebSocketServer = new QWebSocketServer(QStringLiteral("SSL Echo Server"), QWebSocketServer::SecureMode, @@ -109,7 +108,6 @@ void SslEchoServer::onNewConnection() connect(pSocket, &QWebSocket::binaryMessageReceived, this, &SslEchoServer::processBinaryMessage); connect(pSocket, &QWebSocket::disconnected, this, &SslEchoServer::socketDisconnected); - //connect(pSocket, &QWebSocket::pong, this, &SslEchoServer::processPong); m_clients << pSocket; } diff --git a/src/imports/qmlwebsockets/plugins.qmltypes b/src/imports/qmlwebsockets/plugins.qmltypes index b79da44..cbbb628 100644 --- a/src/imports/qmlwebsockets/plugins.qmltypes +++ b/src/imports/qmlwebsockets/plugins.qmltypes @@ -4,15 +4,15 @@ import QtQuick.tooling 1.2 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -nonrelocatable QtWebSockets 1.0' +// 'qmlplugindump -nonrelocatable QtWebSockets 1.1' Module { dependencies: [] Component { name: "QQmlWebSocket" prototype: "QObject" - exports: ["QtWebSockets/WebSocket 1.0"] - exportMetaObjectRevisions: [0] + exports: ["QtWebSockets/WebSocket 1.0", "QtWebSockets/WebSocket 1.1"] + exportMetaObjectRevisions: [0, 1] Enum { name: "Status" values: { @@ -32,6 +32,11 @@ Module { Parameter { name: "message"; type: "string" } } Signal { + name: "binaryMessageReceived" + revision: 1 + Parameter { name: "message"; type: "QByteArray" } + } + Signal { name: "statusChanged" Parameter { name: "status"; type: "Status" } } @@ -48,6 +53,12 @@ Module { type: "qlonglong" Parameter { name: "message"; type: "string" } } + Method { + name: "sendBinaryMessage" + revision: 1 + type: "qlonglong" + Parameter { name: "message"; type: "QByteArray" } + } } Component { name: "QQmlWebSocketServer" diff --git a/src/imports/qmlwebsockets/qmlwebsockets.pro b/src/imports/qmlwebsockets/qmlwebsockets.pro index dea84a8..fef47f4 100644 --- a/src/imports/qmlwebsockets/qmlwebsockets.pro +++ b/src/imports/qmlwebsockets/qmlwebsockets.pro @@ -1,4 +1,4 @@ -QT = core websockets qml +QT = core websockets qml qml-private core-private TARGETPATH = QtWebSockets diff --git a/src/imports/qmlwebsockets/qmlwebsockets_plugin.cpp b/src/imports/qmlwebsockets/qmlwebsockets_plugin.cpp index 11c9dec..24fe34a 100644 --- a/src/imports/qmlwebsockets/qmlwebsockets_plugin.cpp +++ b/src/imports/qmlwebsockets/qmlwebsockets_plugin.cpp @@ -53,6 +53,7 @@ void QtWebSocketsDeclarativeModule::registerTypes(const char *uri) // @uri QtWebSockets qmlRegisterType<QQmlWebSocket>(uri, 1 /*major*/, 0 /*minor*/, "WebSocket"); + qmlRegisterType<QQmlWebSocket, 1>(uri, 1 /*major*/, 1 /*minor*/, "WebSocket"); qmlRegisterType<QQmlWebSocketServer>(uri, 1 /*major*/, 0 /*minor*/, "WebSocketServer"); } diff --git a/src/imports/qmlwebsockets/qqmlwebsocket.cpp b/src/imports/qmlwebsockets/qqmlwebsocket.cpp index aea2c82..9ff88d5 100644 --- a/src/imports/qmlwebsockets/qqmlwebsocket.cpp +++ b/src/imports/qmlwebsockets/qqmlwebsocket.cpp @@ -90,6 +90,12 @@ */ /*! + \qmlsignal WebSocket::binaryMessageReceived(QString message) + \since 5.8 + This signal is emitted when a binary message is received. + */ + +/*! \qmlsignal WebSocket::statusChanged(Status status) This signal is emitted when the status of the WebSocket changes. the \l [QML]{WebSocket::status}{status} argument provides the current status. @@ -102,6 +108,12 @@ Sends \c message to the server. */ +/*! + \qmlmethod void WebSocket::sendBinaryMessage(ArrayBuffer message) + \since 5.8 + Sends \c message to the server. + */ + #include "qqmlwebsocket.h" #include <QtWebSockets/QWebSocket> @@ -144,6 +156,16 @@ qint64 QQmlWebSocket::sendTextMessage(const QString &message) return m_webSocket->sendTextMessage(message); } +qint64 QQmlWebSocket::sendBinaryMessage(const QByteArray &message) +{ + if (m_status != Open) { + setErrorString(tr("Messages can only be sent when the socket is open.")); + setStatus(Error); + return 0; + } + return m_webSocket->sendBinaryMessage(message); +} + QUrl QQmlWebSocket::url() const { return m_url; @@ -198,6 +220,8 @@ void QQmlWebSocket::setSocket(QWebSocket *socket) m_webSocket->setParent(Q_NULLPTR); connect(m_webSocket.data(), &QWebSocket::textMessageReceived, this, &QQmlWebSocket::textMessageReceived); + connect(m_webSocket.data(), &QWebSocket::binaryMessageReceived, + this, &QQmlWebSocket::binaryMessageReceived); typedef void (QWebSocket::* ErrorSignal)(QAbstractSocket::SocketError); connect(m_webSocket.data(), static_cast<ErrorSignal>(&QWebSocket::error), this, &QQmlWebSocket::onError); diff --git a/src/imports/qmlwebsockets/qqmlwebsocket.h b/src/imports/qmlwebsockets/qqmlwebsocket.h index c5682ed..c3a808f 100644 --- a/src/imports/qmlwebsockets/qqmlwebsocket.h +++ b/src/imports/qmlwebsockets/qqmlwebsocket.h @@ -83,10 +83,11 @@ public: bool isActive() const; Q_INVOKABLE qint64 sendTextMessage(const QString &message); - + Q_REVISION(1) Q_INVOKABLE qint64 sendBinaryMessage(const QByteArray &message); Q_SIGNALS: void textMessageReceived(QString message); + Q_REVISION(1) void binaryMessageReceived(QByteArray message); void statusChanged(Status status); void activeChanged(bool isActive); void errorStringChanged(QString errorString); diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index 8cd7375..188df33 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -708,12 +708,11 @@ QByteArray QWebSocketPrivate::getFrameHeader(QWebSocketProtocol::OpCode opCode, bool lastFrame) { QByteArray header; - quint8 byte = 0x00; bool ok = payloadLength <= 0x7FFFFFFFFFFFFFFFULL; if (Q_LIKELY(ok)) { //FIN, RSV1-3, opcode (RSV-1, RSV-2 and RSV-3 are zero) - byte = static_cast<quint8>((opCode & 0x0F) | (lastFrame ? 0x80 : 0x00)); + quint8 byte = static_cast<quint8>((opCode & 0x0F) | (lastFrame ? 0x80 : 0x00)); header.append(static_cast<char>(byte)); byte = 0x00; @@ -773,7 +772,6 @@ qint64 QWebSocketPrivate::doWriteFrames(const QByteArray &data, bool isBinary) if (Q_UNLIKELY(numFrames == 0)) numFrames = 1; quint64 currentPosition = 0; - qint64 bytesWritten = 0; quint64 bytesLeft = data.size(); for (int i = 0; i < numFrames; ++i) { @@ -789,7 +787,7 @@ qint64 QWebSocketPrivate::doWriteFrames(const QByteArray &data, bool isBinary) : QWebSocketProtocol::OpCodeContinue; //write header - bytesWritten += m_pSocket->write(getFrameHeader(opcode, size, maskingKey, isLastFrame)); + m_pSocket->write(getFrameHeader(opcode, size, maskingKey, isLastFrame)); //write payload if (Q_LIKELY(size > 0)) { @@ -798,7 +796,6 @@ qint64 QWebSocketPrivate::doWriteFrames(const QByteArray &data, bool isBinary) QWebSocketProtocol::mask(currentData, size, maskingKey); qint64 written = m_pSocket->write(currentData, static_cast<qint64>(size)); if (Q_LIKELY(written > 0)) { - bytesWritten += written; payloadWritten += written; } else { m_pSocket->flush(); @@ -881,7 +878,7 @@ qint64 QWebSocketPrivate::writeFrame(const QByteArray &frame) /*! \internal */ -QString readLine(QTcpSocket *pSocket) +static QString readLine(QTcpSocket *pSocket) { Q_ASSERT(pSocket); QString line; diff --git a/tests/auto/qml/qmlwebsockets/tst_qmlwebsockets.qml b/tests/auto/qml/qmlwebsockets/tst_qmlwebsockets.qml index a8d3225..d0f19f6 100644 --- a/tests/auto/qml/qmlwebsockets/tst_qmlwebsockets.qml +++ b/tests/auto/qml/qmlwebsockets/tst_qmlwebsockets.qml @@ -27,7 +27,7 @@ ****************************************************************************/ import QtQuick 2.5 -import QtWebSockets 1.0 +import QtWebSockets 1.1 import QtTest 1.1 Rectangle { @@ -84,5 +84,28 @@ Rectangle { socket.sendTextMessage('hello'); tryCompare(socket, 'status', WebSocket.Error); } + + function test_send_receive_binary() { + ensureConnected(); + + var o = {}; + var sending = new Uint8Array([42, 43]); + server.currentSocket.binaryMessageReceived.connect(function(received) { + var view = new DataView(received); + compare(received.byteLength, sending.length); + compare(view.getUInt8(0), sending[0]); + compare(view.getUInt8(1), sending[1]); + o.called = true; + }); + + socket.sendBinaryMessage(sending.buffer); + tryCompare(o, 'called', true); + } + + function test_send_binary_error_closed() { + ensureDisconnected(); + socket.sendBinaryMessage('hello'); + tryCompare(socket, 'status', WebSocket.Error); + } } } |