Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Common/LtsWebSocket/lts_web_socket_server.cpp
T
2026-09-01 12:27:57 +02:00

138 lines
4.1 KiB
C++

#include "lts_web_socket_server.h"
#ifdef QT6_WEBSOCKETS_AVAILABLE
#include "client_connection.h"
#include "connection_handler.h"
#include <QtCore/QTimer>
namespace LtsWebSocket
{
LtsWebSocketServer::LtsWebSocketServer(AbstractClientMessageFactory* messageFactory, QObject* parent)
: QObject(parent), m_queueTimer(new QTimer(this)), m_messageFactory(messageFactory), m_connectionHandler(nullptr),
m_logger(getLogger("LtsWebSocket.Server"))
{
connect(m_queueTimer, &QTimer::timeout, this, &LtsWebSocketServer::onQueueTimerTimeout);
m_queueTimer->setSingleShot(true);
}
LtsWebSocketServer::~LtsWebSocketServer() = default;
bool LtsWebSocketServer::init(const QString& serviceName, const unsigned short port)
{
m_connectionHandler.reset(new ConnectionHandler(this));
if (!m_connectionHandler->init(serviceName, port))
{
ERROR_LOG(m_logger) << "Could not init m_connectionHandler with servicename: " << serviceName
<< ((port == 0) ? QStringLiteral(" random port")
: QStringLiteral(" port: ") + QString::number(port));
m_connectionHandler.reset();
return false;
}
connect(m_connectionHandler.get(), &ConnectionHandler::newTextMessageFromClient, this,
&LtsWebSocketServer::onNewTextMessage);
connect(m_connectionHandler.get(), &ConnectionHandler::clientDisconnected, this,
&LtsWebSocketServer::clientDisconnected);
connect(m_connectionHandler.get(), &ConnectionHandler::clientConnected, this, &LtsWebSocketServer::clientConnected);
m_queueTimer->start(m_messageDelay);
return true;
}
bool LtsWebSocketServer::init(const QString& serviceName, const QPair<quint16, quint16>& portRange)
{
if (portRange.first < 1025 || portRange.first > portRange.second)
return init(serviceName);
for (quint16 currentPort = portRange.first; currentPort <= portRange.second; ++currentPort)
{
if (init(serviceName, currentPort))
return true;
}
return init(serviceName);
}
void LtsWebSocketServer::sendToAllClients(ReplyMessage* message)
{
DEBUG_LOG(m_logger) << "Sending message to all clients: " << message->toJsonString();
m_connectionHandler->sendToAllClients(message);
}
unsigned short LtsWebSocketServer::webSocketPort() const
{
return m_connectionHandler->webSocketPort();
}
void LtsWebSocketServer::setMessageDelay(qint32 delay)
{
m_messageDelay = delay;
}
void LtsWebSocketServer::onNewTextMessage(ReplyHandler* client, const QString& message)
{
const QString pingMsg(QStringLiteral("ping"));
if (message.startsWith(pingMsg))
{
client->addReply(new PongMessage(message.mid(pingMsg.size())));
return;
}
DEBUG_LOG(m_logger) << "Got new message: " << message;
m_messageQueue.append({client, message});
if (!m_queueTimer->isActive())
m_queueTimer->start(m_messageDelay);
}
void LtsWebSocketServer::onQueueTimerTimeout()
{
if (m_messageQueue.isEmpty())
return;
MessageCredentials credentials = m_messageQueue.takeFirst();
AbstractClientMessage* clientMessage = nullptr;
auto result = m_messageFactory->parseMessage(credentials.message);
if (QJsonParseError::NoError == result.error)
clientMessage = m_messageFactory->createMessage(credentials.client, credentials.message);
else
{
WARNING_LOG(m_logger) << "Could not parse incoming message: '" << credentials.message
<< "', error: " << result.errorString();
clientMessage =
new InvalidMessage(credentials.client, QString(), QStringLiteral("Got message which is not JSON conform"));
}
if (clientMessage)
clientMessage->process();
delete clientMessage;
m_queueTimer->start(m_messageDelay);
}
} // namespace LtsWebSocket
#else
namespace LtsWebSocket
{
LtsWebSocketServer::LtsWebSocketServer(AbstractClientMessageFactory* /*messageFactory*/, QObject* parent)
: QObject(parent), m_queueTimer(new QTimer(this)), m_logger(getLogger("LtsWebSocket.Server"))
{
}
LtsWebSocketServer::~LtsWebSocketServer() = default;
} // namespace LtsWebSocket
#endif