From 07d083370d395d50d878ff9924ea2af6369950db Mon Sep 17 00:00:00 2001
From: Akira Ohgaki <akiraohgaki@gmail.com>
Date: Wed, 10 May 2017 18:49:49 +0900
Subject: [PATCH] WebSocketServer

---
 app/src/websockets/websocketserver.cpp | 62 +++++++++++++++++++++-----
 app/src/websockets/websocketserver.h   | 16 ++++---
 2 files changed, 59 insertions(+), 19 deletions(-)

diff --git a/app/src/websockets/websocketserver.cpp b/app/src/websockets/websocketserver.cpp
index c1aed46..5e00aa5 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 01d4591..899d5dc 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_;
-- 
GitLab