Add websocket support
This commit is contained in:
75
src/websockets.cpp
Normal file
75
src/websockets.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
|
||||
#include "websockets.h"
|
||||
#include "rpc.h"
|
||||
#include "settings.h"
|
||||
|
||||
WSServer::WSServer(quint16 port, bool debug, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_pWebSocketServer(new QWebSocketServer(QStringLiteral("Direct Connection Server"),
|
||||
QWebSocketServer::NonSecureMode, this)),
|
||||
m_debug(debug)
|
||||
{
|
||||
m_mainWindow = (MainWindow *) parent;
|
||||
if (m_pWebSocketServer->listen(QHostAddress::LocalHost, port)) {
|
||||
if (m_debug)
|
||||
qDebug() << "Echoserver listening on port" << port;
|
||||
connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
|
||||
this, &WSServer::onNewConnection);
|
||||
connect(m_pWebSocketServer, &QWebSocketServer::closed, this, &WSServer::closed);
|
||||
}
|
||||
}
|
||||
|
||||
WSServer::~WSServer()
|
||||
{
|
||||
qDebug() << "Closing websocket";
|
||||
m_pWebSocketServer->close();
|
||||
qDeleteAll(m_clients.begin(), m_clients.end());
|
||||
}
|
||||
|
||||
void WSServer::onNewConnection()
|
||||
{
|
||||
QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();
|
||||
|
||||
connect(pSocket, &QWebSocket::textMessageReceived, this, &WSServer::processTextMessage);
|
||||
connect(pSocket, &QWebSocket::binaryMessageReceived, this, &WSServer::processBinaryMessage);
|
||||
connect(pSocket, &QWebSocket::disconnected, this, &WSServer::socketDisconnected);
|
||||
|
||||
m_clients << pSocket;
|
||||
}
|
||||
|
||||
void WSServer::processTextMessage(QString message)
|
||||
{
|
||||
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
|
||||
if (m_debug)
|
||||
qDebug() << "Message received:" << message;
|
||||
if (pClient) {
|
||||
QJsonDocument json(QJsonObject {
|
||||
{"saplingAddress", m_mainWindow->getRPC()->getDefaultSaplingAddress()},
|
||||
{"balance", m_mainWindow->getRPC()->balTotal},
|
||||
{"zecprice", Settings::getInstance()->getZECPrice()}
|
||||
});
|
||||
|
||||
pClient->sendTextMessage(json.toJson());
|
||||
}
|
||||
}
|
||||
|
||||
void WSServer::processBinaryMessage(QByteArray message)
|
||||
{
|
||||
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
|
||||
if (m_debug)
|
||||
qDebug() << "Binary Message received:" << message;
|
||||
if (pClient) {
|
||||
pClient->sendBinaryMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
void WSServer::socketDisconnected()
|
||||
{
|
||||
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
|
||||
if (m_debug)
|
||||
qDebug() << "socketDisconnected:" << pClient;
|
||||
if (pClient) {
|
||||
m_clients.removeAll(pClient);
|
||||
pClient->deleteLater();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user