#include "client_connection.h" #include namespace LtsWebSocket { ClientConnection::ClientConnection(QWebSocket *socket, QObject *parent) : QThread(parent) , m_socket(socket ? socket : new QWebSocket) , m_logger(getLogger("ClientConnection")) { } ClientConnection::~ClientConnection() { DEBUG_LOG(m_logger) << "Thread closed" << this; delete m_socket; qDeleteAll(m_messageQueue); } bool ClientConnection::init() { if (m_socket == nullptr) { ERROR_LOG(m_logger) << "Initialisation failed due to an invalid socket"; return false; } DEBUG_LOG(m_logger) << "Started new thread" << this; connect(m_socket, &QWebSocket::textMessageReceived, this, &ClientConnection::onNewTextMessageFromSocket, Qt::DirectConnection); connect(m_socket, &QWebSocket::connected, this, &ClientConnection::sendMessagesFromQueue); connect(m_socket, &QWebSocket::disconnected, this, &ClientConnection::onSocketDisconnect); return true; } void ClientConnection::addReply(ReplyMessage *message) { if (!m_socket || m_socket->state() != QAbstractSocket::ConnectedState) { m_messageQueue.enqueue(message); DEBUG_LOG(m_logger) << "Adding message to queue, size: " << m_messageQueue.size(); return; } const QString msg(message->toJsonString()); DEBUG_LOG(m_logger) << "Sending message: " << msg ; m_socket->sendTextMessage(msg); delete message; } void ClientConnection::onNewTextMessageFromSocket(const QString &message) { DEBUG_LOG(m_logger) << "Recv msg: " << message << this; emit newTextMessage(this, message); } void ClientConnection::sendMessagesFromQueue() { INFO_LOG(m_logger) << "Client connected ip: " << m_socket->peerAddress().toString() << ":" << m_socket->peerPort(); if (m_socket->state() != QAbstractSocket::ConnectedState) return; while (!m_messageQueue.isEmpty()) { ReplyMessage *message = m_messageQueue.dequeue(); const QString msg(message->toJsonString()); TRACE_LOG(m_logger) << "Send msg: " << msg; m_socket->sendTextMessage(msg); delete message; DEBUG_LOG(m_logger) << "Sent message from queue, new size: " << m_messageQueue.size(); } } void ClientConnection::onSocketDisconnect() { DEBUG_LOG(m_logger) << "Client disconnected ip: " << m_socket->peerAddress().toString() << ":" << m_socket->peerPort(); exit(0); emit disconnected(this); } }