10 #include <QJsonDocument>
11 #include <QJsonObject>
15 ws_server(new QWebSocketServer(QStringLiteral(
"CloudViewer"),
16 QWebSocketServer::NonSecureMode)) {
18 connect(ws_server, &QWebSocketServer::newConnection,
this,
19 &JsonRPCServer::onNewConnection);
20 connect(ws_server, &QWebSocketServer::closed,
this,
21 &JsonRPCServer::onClosed);
26 for (QWebSocket *conn : connections) {
33 qDebug() <<
"JsonRPCServer::listen";
34 if (ws_server ==
nullptr) {
37 if (ws_server->isListening()) {
40 ws_server->listen(QHostAddress::Any, port);
44 qDebug() <<
"JsonRPCServer::close";
45 if (ws_server ==
nullptr) {
50 for (QWebSocket *conn : connections) {
57 void JsonRPCServer::onNewConnection() {
58 qDebug() <<
"JsonRPCServer::onNewConnection";
59 QWebSocket *pSocket = ws_server->nextPendingConnection();
60 if (pSocket ==
nullptr) {
63 connect(pSocket, &QWebSocket::textMessageReceived,
this,
64 &JsonRPCServer::processTextMessage);
65 connect(pSocket, &QWebSocket::binaryMessageReceived,
this,
66 &JsonRPCServer::processBinaryMessage);
67 connect(pSocket, &QWebSocket::disconnected,
this,
68 &JsonRPCServer::socketDisconnected);
70 connections.append(pSocket);
73 void JsonRPCServer::onClosed() { qDebug() <<
"JsonRPCServer::onClosed"; }
75 void JsonRPCServer::processTextMessage(QString message) {
76 QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
77 qDebug() <<
"Message received:" << message;
78 if (pClient ==
nullptr) {
81 QJsonDocument doc = QJsonDocument::fromJson(message.toUtf8());
82 QJsonObject obj = doc.object();
83 auto method = obj.value(
"method").toString();
84 auto params = obj.value(
"params").toVariant().toMap();
86 qDebug() <<
"method: " << method <<
", params: " <<
params;
89 if (!method.isEmpty() && !obj.value(
"jsonrpc").toString().isEmpty()) {
96 if (!doc.object().contains(
"id")) {
100 QJsonObject response;
101 response[
"jsonrpc"] =
"2.0";
102 response[
"id"] = obj.value(
"id");
106 if (!
result.error_message.isEmpty()) {
109 response[
"error"] =
error;
111 response[
"result"] = QJsonValue::fromVariant(
result.result);
114 pClient->sendTextMessage(QJsonDocument(response).toJson());
117 void JsonRPCServer::processBinaryMessage(QByteArray message) {
118 QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
119 qDebug() <<
"Binary Message received:" << message;
121 pClient->sendBinaryMessage(message);
125 void JsonRPCServer::socketDisconnected() {
126 QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
127 qDebug() <<
"socketDisconnected:" << pClient;
129 connections.removeAll(pClient);
130 pClient->deleteLater();
cmdLineReadable * params[]
JsonRPCServer(QObject *parent=nullptr)
JsonRPCResult execute(QString method, QMap< QString, QVariant > params)
void listen(unsigned int port)
static void error(char *msg)
static JsonRPCResult error(int code, QString message)