#include "client_connection.h" #include "WebSocketInterface/Messages/reply_message.h" #include #include using namespace CombatNetRadio::WebSocketInterface::Connection; ClientConnection::ClientConnection(QWebSocket *socket, QObject *parent) : QObject(parent) , m_socket(socket) , m_ip(socket->peerAddress()) , m_logger(getLogger(QLatin1String("ClientConnection"))) {} ClientConnection::~ClientConnection() { if (m_socket) { m_socket->disconnect(this); m_socket->close(); } delete m_socket; } bool ClientConnection::init() { if (m_socket == nullptr) { ERROR_LOG(m_logger) << "Initialisation failed due to an invalid socket"; return false; } connect(m_socket, &QWebSocket::textMessageReceived, this, &ClientConnection::onNewTextMessageFromSocket); connect(m_socket, &QWebSocket::connected, this, &ClientConnection::sendMessagesFromQueue); connect(m_socket, &QWebSocket::disconnected, this, &ClientConnection::onSocketDisconnect); return true; } QHostAddress ClientConnection::ip() const { return m_ip; } void ClientConnection::addMessage(const CombatNetRadio::WebSocketInterface::Messages::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) << "Send msg: " << msg; m_socket->sendTextMessage(msg); } void ClientConnection::onNewTextMessageFromSocket(const QString &message) { DEBUG_LOG(m_logger) << "Recv msg: " << message; emit newTextMessage(this, message); } void ClientConnection::sendMessagesFromQueue() { if (m_socket->state() != QAbstractSocket::ConnectedState) return; while (!m_messageQueue.isEmpty()) { Messages::ReplyMessage message = m_messageQueue.dequeue(); const QString msg(message.toJsonString()); TRACE_LOG(m_logger) << "Send msg: " << msg; m_socket->sendTextMessage(msg); DEBUG_LOG(m_logger) << "Sent message from queue, new size: " << m_messageQueue.size(); } } void ClientConnection::onSocketDisconnect() { DEBUG_LOG(m_logger) << "Client with ip " << m_ip.toString() << " disconnected"; emit disconnected(this); }