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);
++ }