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/netwebsocketconnection.cpp | 97 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/net/netwebsocketconnection.cpp (limited to 'src/net/netwebsocketconnection.cpp') diff --git a/src/net/netwebsocketconnection.cpp b/src/net/netwebsocketconnection.cpp new file mode 100644 index 0000000..a9d2e10 --- /dev/null +++ b/src/net/netwebsocketconnection.cpp @@ -0,0 +1,97 @@ +#include "netwebsocketconnection.h" + +#include "networkmanager.h" + +#include +#include + +NetWebSocketConnection::NetWebSocketConnection(NetworkManager *networkManager) + : NetConnection(networkManager) + , m_network_manager(networkManager) + , m_socket(new QWebSocket(QString(), QWebSocketProtocol::VersionLatest, this)) + , m_last_state(QAbstractSocket::UnconnectedState) +{ + connect(m_socket, QOverload::of(&QWebSocket::error), this, &NetWebSocketConnection::onError); + connect(m_socket, &QWebSocket::stateChanged, this, &NetWebSocketConnection::onStateChanged); + connect(m_socket, &QWebSocket::textMessageReceived, this, &NetWebSocketConnection::onTextMessageReceived); +} + +NetWebSocketConnection::~NetWebSocketConnection() +{ + m_socket->disconnect(this); + disconnectFromServer(); +} + +bool NetWebSocketConnection::isConnected() +{ + return m_last_state == QAbstractSocket::ConnectedState; +} + +void NetWebSocketConnection::connectToServer(ServerInfo &server) +{ + disconnectFromServer(); + + QUrl url; + url.setScheme("ws"); + url.setHost(server.ip); + url.setPort(server.port); + + QNetworkRequest req(url); + req.setHeader(QNetworkRequest::UserAgentHeader, m_network_manager->get_user_agent()); + + m_socket->open(req); +} + +void NetWebSocketConnection::disconnectFromServer() +{ + if (isConnected()) + { + m_socket->close(QWebSocketProtocol::CloseCodeGoingAway); + } +} + +void NetWebSocketConnection::sendPacket(AOPacket packet) +{ + m_socket->sendTextMessage(packet.toString(true)); +} + +void NetWebSocketConnection::onError() +{ + Q_EMIT errorOccurred(m_socket->errorString()); +} + +void NetWebSocketConnection::onStateChanged(QAbstractSocket::SocketState state) +{ + m_last_state = state; + switch (state) + { + default: + break; + + case QAbstractSocket::ConnectedState: + Q_EMIT connectedToServer(); + break; + + case QAbstractSocket::UnconnectedState: + Q_EMIT disconnectFromServer(); + break; + } +} + +void NetWebSocketConnection::onTextMessageReceived(QString message) +{ + if (!message.endsWith("#%")) + { + return; + } + message.chop(2); + + QStringList raw_content = message.split('#'); + const QString header = raw_content.takeFirst(); + for (QString &data : raw_content) + { + data = AOPacket::decode(data); + } + + Q_EMIT receivedPacket(AOPacket(header, raw_content)); +} -- cgit