Showing the changes to libraries/script-engine/src/WebSocketClass.cpp (1 of 2 files). Show all
Unified · Split
| @@ -34,10 +34,11 @@ WebSocketClass::WebSocketClass(QScriptEngine* engine, QWebSocket* qWebSocket) : · 33 unmodified lines | ||
| 34 | 34 | void WebSocketClass::initialize() { |
| 35 | 35 | connect(_webSocket, &QWebSocket::disconnected, this, &WebSocketClass::handleOnClose); |
| 36 | 36 | connect(_webSocket, &QWebSocket::textMessageReceived, this, &WebSocketClass::handleOnMessage); |
| 37 | + connect(_webSocket, &QWebSocket::binaryMessageReceived, this, &WebSocketClass::handleOnBinaryMessage); | |
| 37 | 38 | connect(_webSocket, &QWebSocket::connected, this, &WebSocketClass::handleOnOpen); |
| 38 | 39 | connect(_webSocket, static_cast<void(QWebSocket::*)(QAbstractSocket::SocketError)>(&QWebSocket::error), this, |
| 39 | 40 | &WebSocketClass::handleOnError); |
| 40 | − _binaryType = QStringLiteral("blob"); | |
| 41 | + _binaryType = QStringLiteral("arraybuffer"); | |
| 41 | 42 | } |
| 42 | 43 | |
| 43 | 44 | QScriptValue WebSocketClass::constructor(QScriptContext* context, QScriptEngine* engine) { |
| @@ -53,8 +54,13 @@ WebSocketClass::~WebSocketClass() { · 9 unmodified lines | ||
| 53 | 54 | } |
| 54 | 55 | |
| 55 | 56 | void WebSocketClass::send(QScriptValue message) { |
| 57 | + if (message.isObject()) { | |
| 58 | + QByteArray ba = qscriptvalue_cast<QByteArray>(message); | |
| 59 | + _webSocket->sendBinaryMessage(ba); | |
| 60 | + } else { | |
| 56 | 61 | _webSocket->sendTextMessage(message.toString()); |
| 57 | 62 | } |
| 63 | +} | |
| 58 | 64 | |
| 59 | 65 | void WebSocketClass::close() { |
| 60 | 66 | this->close(QWebSocketProtocol::CloseCodeNormal); |
| @@ -97,6 +103,25 @@ void WebSocketClass::handleOnMessage(const QString& message) { · 36 unmodified lines | ||
| 97 | 103 | } |
| 98 | 104 | } |
| 99 | 105 | |
| 106 | +void WebSocketClass::handleOnBinaryMessage(const QByteArray& message) { | |
| 107 | + if (_onMessageEvent.isFunction()) { | |
| 108 | + QScriptValueList args; | |
| 109 | + QScriptValue arg = _engine->newObject(); | |
| 110 | + QScriptValue data = _engine->newVariant(QVariant::fromValue(message)); | |
| 111 | + QScriptValue ctor = _engine->globalObject().property("ArrayBuffer"); | |
| 112 | + ArrayBufferClass* array = qscriptvalue_cast<ArrayBufferClass*>(ctor.data()); | |
| 113 | + QScriptValue arrayBuffer; | |
| 114 | + if (!array) { | |
| 115 | + qWarning() << "WebSocketClass::handleOnBinaryMessage !ArrayBuffer"; | |
| 116 | + } else { | |
| 117 | + arrayBuffer = _engine->newObject(array, data); | |
| 118 | + } | |
| 119 | + arg.setProperty("data", arrayBuffer); | |
| 120 | + args << arg; | |
| 121 | + _onMessageEvent.call(QScriptValue(), args); | |
| 122 | + } | |
| 123 | +} | |
| 124 | + | |
| 100 | 125 | void WebSocketClass::handleOnOpen() { |
| 101 | 126 | if (_onOpenEvent.isFunction()) { |
| 102 | 127 | _onOpenEvent.call(); |