#include "connection_handler.h" #include "client_connection.h" #include using namespace LtsWebSocket; ConnectionHandler::ConnectionHandler(QObject *parent) : QObject(parent) , m_server(nullptr) , m_logger(getLogger("ConnectionHandler")) {} ConnectionHandler::~ConnectionHandler() { for (auto connection : qAsConst(m_connections)) connection->disconnect(this); } bool ConnectionHandler::init(const QString &serviceName, unsigned short port) { if (m_server != nullptr) { m_server->disconnect(); delete m_server; } m_server = new QWebSocketServer(QStringLiteral("RME-") + serviceName, QWebSocketServer::NonSecureMode, this); connect(m_server, &QWebSocketServer::newConnection, this, &ConnectionHandler::onNewConnection); connect(m_server, &QWebSocketServer::serverError, this, &ConnectionHandler::onServerError); DEBUG_LOG(m_logger) << "Trying to listen "; if (!m_server->listen(QHostAddress::Any, port)) { ERROR_LOG(m_logger) << "Not possible to listen to port " << port; return false; } DEBUG_LOG(m_logger) << "... ok, port " << m_server->serverPort(); return true; } void ConnectionHandler::sendToAllClients(ReplyMessage *message) { for (auto connection : qAsConst(m_connections)) connection->addReply(new ReplyMessage(*message)); delete message; } void ConnectionHandler::onServerError(QWebSocketProtocol::CloseCode closeCode) { ERROR_LOG(m_logger) << "Got server error with close code " << closeCode; } void ConnectionHandler::onNewConnection() { while (m_server->hasPendingConnections()) { QWebSocket *socket = m_server->nextPendingConnection(); ClientConnection *newConnection = new ClientConnection(socket, this); connect(newConnection, &ClientConnection::destroyed, this, [this](QObject* o) { m_connections.remove(static_cast(o)); }); if (!newConnection->init()) { ERROR_LOG(m_logger) << "Failed to initialise new client"; delete newConnection; newConnection = nullptr; continue; } newConnection->start(); connect(newConnection, &ClientConnection::newTextMessage, this, &ConnectionHandler::newTextMessageFromClient); connect(newConnection, &ClientConnection::disconnected, this, &ConnectionHandler::clientDisconnected); connect(newConnection, &ClientConnection::finished, newConnection, &ClientConnection::deleteLater); m_connections.insert(newConnection); emit clientConnected(newConnection); INFO_LOG(m_logger) << "New client connected ip: " << socket->localAddress().toString() << ":" << socket->localPort(); } }