From 1ef96383c8f7ed136a0e028aef0835b4838b5e95 Mon Sep 17 00:00:00 2001 From: TrickyLeifa Date: Fri, 17 May 2024 16:39:30 +0200 Subject: Lightly reworked `NetworkManager`, ... * Lightly reworked `NetworkManager` * Added new modules to handle various connection types. * TCP * WebSocket * Added general string splitter alias based on Qt version. * Replaced `lobby_constructed` and `courtroom_constructed` * Refactored and partially reimplemented the following classes: * `AOBlipPlayer` * `AOEmotePreview` * `AOMusicPlayer` * `AOSfxPlayer` * `AOTextArea` --- src/net/nettcpconnection.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/net/nettcpconnection.cpp (limited to 'src/net/nettcpconnection.cpp') diff --git a/src/net/nettcpconnection.cpp b/src/net/nettcpconnection.cpp new file mode 100644 index 0000000..744eed9 --- /dev/null +++ b/src/net/nettcpconnection.cpp @@ -0,0 +1,102 @@ +#include "nettcpconnection.h" + +NetTcpConnection::NetTcpConnection(QObject *parent) + : NetConnection(parent) + , m_socket(new QTcpSocket(this)) + , m_last_state(QAbstractSocket::UnconnectedState) +{ +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + connect(m_socket, QOverload::of(&QAbstractSocket::error), this, &NetTcpConnection::onErrorOccurred); +#else + connect(m_socket, &QTcpSocket::errorOccurred, this, &NetTcpConnection::onErrorOccurred); +#endif + connect(m_socket, &QTcpSocket::stateChanged, this, &NetTcpConnection::onStateChanged); + connect(m_socket, &QTcpSocket::readyRead, this, &NetTcpConnection::onReadyRead); +} + +NetTcpConnection::~NetTcpConnection() +{ + m_socket->disconnect(this); + disconnectFromServer(); +} + +bool NetTcpConnection::isConnected() +{ + return m_last_state == QAbstractSocket::ConnectedState; +} + +void NetTcpConnection::connectToServer(ServerInfo &server) +{ + disconnectedFromServer(); + m_socket->connectToHost(server.ip, server.port); +} + +void NetTcpConnection::disconnectFromServer() +{ + m_socket->abort(); +} + +void NetTcpConnection::sendPacket(AOPacket packet) +{ + if (!isConnected()) + { + qWarning().noquote() << QObject::tr("Cannot send packet, not connected to server"); + return; + } + m_socket->write(packet.toString(true).toUtf8()); +} + +void NetTcpConnection::onErrorOccurred() +{ + Q_EMIT errorOccurred(m_socket->errorString()); +} + +void NetTcpConnection::onStateChanged(QAbstractSocket::SocketState state) +{ + m_last_state = state; + switch (state) + { + default: + break; + + case QAbstractSocket::ConnectedState: + m_cached_data.clear(); + Q_EMIT connectedToServer(); + break; + + case QAbstractSocket::UnconnectedState: + Q_EMIT disconnectFromServer(); + break; + } +} + +void NetTcpConnection::onReadyRead() +{ + m_cached_data += QString::fromUtf8(m_socket->readAll()); + if (!m_cached_data.endsWith('%')) + { + return; + } + + QStringList raw_packet_list = m_cached_data.split('%', AOSplitBehaviorFlags::SkipEmptyParts); + m_cached_data.clear(); + for (QString raw_packet : raw_packet_list) + { + if (!raw_packet.endsWith('#')) + { + Q_EMIT errorOccurred(QObject::tr("Malformed packet received %1").arg(raw_packet)); + continue; + } + raw_packet.chop(1); + + QStringList raw_content = raw_packet.split('#'); + + const QString header = raw_content.takeFirst(); + for (QString &data : raw_content) + { + data = AOPacket::decode(data); + } + + Q_EMIT receivedPacket(AOPacket(header, raw_content)); + } +} -- cgit From 657145035cd66c18ae777e1272fd5221dddca0ef Mon Sep 17 00:00:00 2001 From: TrickyLeifa Date: Fri, 17 May 2024 23:54:41 +0200 Subject: Reimplemented unit tests, ... * Reimplemented unit tests and simplified addition of new tests * Minimal support of Qt is now 5.15 --- src/net/nettcpconnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/net/nettcpconnection.cpp') diff --git a/src/net/nettcpconnection.cpp b/src/net/nettcpconnection.cpp index 744eed9..2bc52b7 100644 --- a/src/net/nettcpconnection.cpp +++ b/src/net/nettcpconnection.cpp @@ -78,7 +78,7 @@ void NetTcpConnection::onReadyRead() return; } - QStringList raw_packet_list = m_cached_data.split('%', AOSplitBehaviorFlags::SkipEmptyParts); + QStringList raw_packet_list = m_cached_data.split('%', Qt::SkipEmptyParts); m_cached_data.clear(); for (QString raw_packet : raw_packet_list) { -- cgit