diff --git a/app/src/websockets/websocketserver.cpp b/app/src/websockets/websocketserver.cpp index c1aed4614b6c43989ab2a531f1f54fe459c088bf..5e00aa5f3492fda62848f2cbba58a29178aa5bba 100644 --- a/app/src/websockets/websocketserver.cpp +++ b/app/src/websockets/websocketserver.cpp @@ -55,17 +55,18 @@ QUrl WebSocketServer::serverUrl() void WebSocketServer::wsNewConnection() { QWebSocket *wsClient = wsServer_->nextPendingConnection(); - connect(wsClient, &QWebSocket::binaryMessageReceived, this, &WebSocketServer::wsBinaryMessageReceived); - connect(wsClient, &QWebSocket::textMessageReceived, this, &WebSocketServer::wsTextMessageReceived); connect(wsClient, &QWebSocket::disconnected, this, &WebSocketServer::wsDisconnected); + connect(wsClient, &QWebSocket::textMessageReceived, this, &WebSocketServer::wsTextMessageReceived); + connect(wsClient, &QWebSocket::binaryMessageReceived, this, &WebSocketServer::wsBinaryMessageReceived); wsClients_ << wsClient; } -void WebSocketServer::wsBinaryMessageReceived(const QByteArray &message) +void WebSocketServer::wsDisconnected() { QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender()); if (wsClient) { - wsClient->sendBinaryMessage(message); + wsClients_.removeAll(wsClient); + wsClient->deleteLater(); } } @@ -75,20 +76,57 @@ void WebSocketServer::wsTextMessageReceived(const QString &message) if (wsClient) { qtlib::Json json(message.toUtf8()); if (json.isValid()) { - QJsonObject jsonObject = json.toObject(); - if (jsonObject["method"].toString() == "stop") { - stop(); - } + callFunction(json.toObject(), wsClient); } - wsClient->sendTextMessage(message); } } -void WebSocketServer::wsDisconnected() +void WebSocketServer::wsBinaryMessageReceived(const QByteArray &message) { QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender()); if (wsClient) { - wsClients_.removeAll(wsClient); - wsClient->deleteLater(); + qtlib::Json json(message); + if (json.isValid()) { + callFunction(json.toObject(), wsClient); + } } } + +void WebSocketServer::callFunction(const QJsonObject &request, QWebSocket *wsClient) +{ + /* request object format + { + "id": "example", + "call": "functionName", + "args": { + "arg1": "value", + "arg2": 2, + "arg3": true + } + } + */ + + /* response object format + { + "id": "example", + "result": {} + } + */ + + QString id = request["id"].toString(); + QString call = request["call"].toString(); + QJsonObject args = request["args"].toObject(); + + QJsonObject response; + response["id"] = id; + + if (call == "WebSocketServer::stop") { + stop(); + } + else if (call == "WebSocketServer::serverUrl") { + response["result"] = serverUrl().toString(); + } + + wsClient->sendTextMessage(QString(qtlib::Json(response).toJson())); + //wsClient->sendBinaryMessage(qtlib::Json(response).toJson()); +} diff --git a/app/src/websockets/websocketserver.h b/app/src/websockets/websocketserver.h index 01d4591ba9792cb4699d7405699f94f623312fd6..899d5dc9d9c7cf2bab69fe1c96a0632521583e91 100644 --- a/app/src/websockets/websocketserver.h +++ b/app/src/websockets/websocketserver.h @@ -2,6 +2,7 @@ #include <QObject> #include <QUrl> +//#include <QJsonObject> class QWebSocketServer; class QWebSocket; @@ -14,24 +15,25 @@ public: explicit WebSocketServer(const QString &serverName, quint16 serverPort = 0, QObject *parent = 0); ~WebSocketServer(); -signals: - void started(); - void stopped(); - -public slots: bool start(); void stop(); bool isError(); QString errorString(); QUrl serverUrl(); +signals: + void started(); + void stopped(); + private slots: void wsNewConnection(); - void wsBinaryMessageReceived(const QByteArray &message); - void wsTextMessageReceived(const QString &message); void wsDisconnected(); + void wsTextMessageReceived(const QString &message); + void wsBinaryMessageReceived(const QByteArray &message); private: + void callFunction(const QJsonObject &request, QWebSocket *wsClient); + QString serverName_; quint16 serverPort_; QWebSocketServer *wsServer_;