#include "web_socket_handler.h" #include #include "guez_nasat_telegrams.h" #include namespace GuezNasat { WebSocketHandler::WebSocketHandler(QObject *parent) : AbstractSocketHandler("WebSocketHandler", parent) , m_webSocketServer(new QWebSocketServer(QStringLiteral("GNA"), QWebSocketServer::NonSecureMode, this)) { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } WebSocketHandler::~WebSocketHandler() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; for (auto s : std::as_const(m_webSockets)) { s->disconnect(this); s->close(); } qDeleteAll(m_webSockets); TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } bool WebSocketHandler::init(quint16 listenPort) { TRACE_LOG(m_logger) << LOGFUNCTION << " START, listenPort=" << listenPort; if (!m_webSocketServer->listen(QHostAddress::Any, listenPort)) { WARNING_LOG(m_logger) << "Cannot listen on port " << listenPort << " - aborting"; return false; } DEBUG_LOG(m_logger) << "Listening on port " << listenPort; connect(m_webSocketServer, &QWebSocketServer::newConnection, this, &WebSocketHandler::onNewConnection); TRACE_LOG(m_logger) << LOGFUNCTION << " END, listenPort=" << listenPort; return true; } void WebSocketHandler::onNewConnection() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; QWebSocket *ws = m_webSocketServer->nextPendingConnection(); if (!ws) return; NOTICE_LOG(m_logger) << "New websocket connection from " << ws->peerAddress().toString() << ":" << ws->peerPort() << ", ptr: " << ws; connect(ws, &QWebSocket::textMessageReceived, this, &WebSocketHandler::onTextMessageReceived); connect(ws, &QWebSocket::disconnected, this, &WebSocketHandler::onWebSocketDisconnected); m_webSockets += ws; TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } bool WebSocketHandler::sendTelegramInternal(const QByteArray &tele) { const QString msg = QString::fromUtf8(tele); bool bOk = false; for (QWebSocket *ws : std::as_const(m_webSockets)) { if (ws->sendTextMessage(msg)) bOk = true; } return bOk; } void WebSocketHandler::onTextMessageReceived(const QString &msg) { TRACE_LOG(m_logger) << LOGFUNCTION << " START, msg='" << msg << "'"; const QByteArray baJson = msg.toUtf8(); textMessageReceived(baJson); TRACE_LOG(m_logger) << LOGFUNCTION << " END, msg='" << msg << "'"; } void WebSocketHandler::onWebSocketDisconnected() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; QWebSocket *ws = qobject_cast(sender()); if (!ws) return; NOTICE_LOG(m_logger) << "Websocket connection closed, ptr: " << ws; m_webSockets.remove(ws); ws->deleteLater(); TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } }