Revision control
+ // Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com>
+ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+ #include "websockettransport.h"
+
+ #include <QDebug>
+ #include <QJsonDocument>
+ #include <QJsonObject>
+ #include <QWebSocket>
+
+ /*!
+ \brief QWebChannelAbstractSocket implementation that uses a QWebSocket internally.
+
+ The transport delegates all messages received over the QWebSocket over its
+ textMessageReceived signal. Analogously, all calls to sendTextMessage will
+ be send over the QWebSocket to the remote client.
+ */
+
+ /*!
+ Construct the transport object and wrap the given socket.
+
+ The socket is also set as the parent of the transport object.
+ */
+ WebSocketTransport::WebSocketTransport(QWebSocket *socket)
+ : QWebChannelAbstractTransport(socket)
+ , m_socket(socket)
+ {
+ connect(socket, &QWebSocket::textMessageReceived,
+ this, &WebSocketTransport::textMessageReceived);
+ connect(socket, &QWebSocket::disconnected,
+ this, &WebSocketTransport::deleteLater);
+ }
+
+ /*!
+ Destroys the WebSocketTransport.
+ */
+ WebSocketTransport::~WebSocketTransport()
+ {
+ m_socket->deleteLater();
+ }
+
+ /*!
+ Serialize the JSON message and send it as a text message via the WebSocket to the client.
+ */
+ void WebSocketTransport::sendMessage(const QJsonObject &message)
+ {
+ QJsonDocument doc(message);
+ m_socket->sendTextMessage(QString::fromUtf8(doc.toJson(QJsonDocument::Compact)));
+ }
+
+ /*!
+ Deserialize the stringified JSON messageData and emit messageReceived.
+ */
+ void WebSocketTransport::textMessageReceived(const QString &messageData)
+ {
+ QJsonParseError error;
+ QJsonDocument message = QJsonDocument::fromJson(messageData.toUtf8(), &error);
+ if (error.error) {
+ qWarning() << "Failed to parse text message as JSON object:" << messageData
+ << "Error is:" << error.errorString();
+ return;
+ } else if (!message.isObject()) {
+ qWarning() << "Received JSON message that is not an object: " << messageData;
+ return;
+ }
+ emit messageReceived(message.object(), this);
+ }