From efd2571459924f40718130f7edd28a72a76b12d7 Mon Sep 17 00:00:00 2001 From: Leifa <26681464+TrickyLeifa@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:07:30 +0200 Subject: Remove TCP entry point (#1007) * Remove TCP entry point Resolve #987 * Remove TCP entry point * Servers that do not support WebSocket will be marked as `Legacy` * Removal of TCP connection from the master will follow later. * Tweaked error message --- src/network/serverinfo.cpp | 6 +++ src/network/serverinfo.h | 15 ++++++ src/network/websocketconnection.cpp | 97 +++++++++++++++++++++++++++++++++++++ src/network/websocketconnection.h | 43 ++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 src/network/serverinfo.cpp create mode 100644 src/network/serverinfo.h create mode 100644 src/network/websocketconnection.cpp create mode 100644 src/network/websocketconnection.h (limited to 'src/network') diff --git a/src/network/serverinfo.cpp b/src/network/serverinfo.cpp new file mode 100644 index 00000000..1762866d --- /dev/null +++ b/src/network/serverinfo.cpp @@ -0,0 +1,6 @@ +#include "serverinfo.h" + +QString ServerInfo::toString() const +{ + return QString("%1 (%2:%3)").arg(name.isEmpty() ? QStringLiteral("Unnamed Server") : name).arg(address).arg(port); +} diff --git a/src/network/serverinfo.h b/src/network/serverinfo.h new file mode 100644 index 00000000..1f13e3e6 --- /dev/null +++ b/src/network/serverinfo.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +class ServerInfo +{ +public: + QString name; + QString description; + QString address; + quint16 port = 0; + bool legacy = false; + + QString toString() const; +}; diff --git a/src/network/websocketconnection.cpp b/src/network/websocketconnection.cpp new file mode 100644 index 00000000..133eae1d --- /dev/null +++ b/src/network/websocketconnection.cpp @@ -0,0 +1,97 @@ +#include "websocketconnection.h" + +#include "aoapplication.h" + +#include +#include + +WebSocketConnection::WebSocketConnection(AOApplication *ao_app, QObject *parent) + : QObject(parent) + , ao_app(ao_app) + , m_socket(new QWebSocket(QString(), QWebSocketProtocol::VersionLatest, this)) + , m_last_state(QAbstractSocket::UnconnectedState) +{ + connect(m_socket, QOverload::of(&QWebSocket::error), this, &WebSocketConnection::onError); + connect(m_socket, &QWebSocket::stateChanged, this, &WebSocketConnection::onStateChanged); + connect(m_socket, &QWebSocket::textMessageReceived, this, &WebSocketConnection::onTextMessageReceived); +} + +WebSocketConnection::~WebSocketConnection() +{ + m_socket->disconnect(this); + disconnectFromServer(); +} + +bool WebSocketConnection::isConnected() +{ + return m_last_state == QAbstractSocket::ConnectedState; +} + +void WebSocketConnection::connectToServer(const ServerInfo &server) +{ + disconnectFromServer(); + + QUrl url; + url.setScheme("ws"); + url.setHost(server.address); + url.setPort(server.port); + + QNetworkRequest req(url); + req.setHeader(QNetworkRequest::UserAgentHeader, QStringLiteral("AttorneyOnline/%1 (Desktop)").arg(ao_app->get_version_string())); + + m_socket->open(req); +} + +void WebSocketConnection::disconnectFromServer() +{ + if (isConnected()) + { + m_socket->close(QWebSocketProtocol::CloseCodeGoingAway); + } +} + +void WebSocketConnection::sendPacket(AOPacket packet) +{ + m_socket->sendTextMessage(packet.toString(true)); +} + +void WebSocketConnection::onError() +{ + Q_EMIT errorOccurred(m_socket->errorString()); +} + +void WebSocketConnection::onStateChanged(QAbstractSocket::SocketState state) +{ + m_last_state = state; + switch (state) + { + default: + break; + + case QAbstractSocket::ConnectedState: + Q_EMIT connectedToServer(); + break; + + case QAbstractSocket::UnconnectedState: + Q_EMIT disconnectedFromServer(); + break; + } +} + +void WebSocketConnection::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)); +} diff --git a/src/network/websocketconnection.h b/src/network/websocketconnection.h new file mode 100644 index 00000000..9df9a49b --- /dev/null +++ b/src/network/websocketconnection.h @@ -0,0 +1,43 @@ +#pragma once + +#include "aopacket.h" +#include "serverinfo.h" + +#include +#include + +class AOApplication; + +class WebSocketConnection : public QObject +{ + Q_OBJECT + +public: + explicit WebSocketConnection(AOApplication *ao_app, QObject *parent = nullptr); + virtual ~WebSocketConnection(); + + bool isConnected(); + + void connectToServer(const ServerInfo &server); + void disconnectFromServer(); + + void sendPacket(AOPacket packet); + +Q_SIGNALS: + void connectedToServer(); + void disconnectedFromServer(); + void errorOccurred(QString error); + + void receivedPacket(AOPacket packet); + +private: + AOApplication *ao_app; + + QWebSocket *m_socket; + QAbstractSocket::SocketState m_last_state; + +private Q_SLOTS: + void onError(); + void onStateChanged(QAbstractSocket::SocketState state); + void onTextMessageReceived(QString message); +}; -- cgit