aboutsummaryrefslogtreecommitdiff
path: root/src/network/websocketconnection.cpp
diff options
context:
space:
mode:
authorLeifa <26681464+TrickyLeifa@users.noreply.github.com>2024-07-09 13:07:30 +0200
committerGitHub <noreply@github.com>2024-07-09 13:07:30 +0200
commitefd2571459924f40718130f7edd28a72a76b12d7 (patch)
tree91751194abb0bfe1306976d676740b43a53dd81b /src/network/websocketconnection.cpp
parent662d4781d2653e02b9f3727a9299ded8c7b1eaa2 (diff)
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
Diffstat (limited to 'src/network/websocketconnection.cpp')
-rw-r--r--src/network/websocketconnection.cpp97
1 files changed, 97 insertions, 0 deletions
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 <QNetworkRequest>
+#include <QUrl>
+
+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<QAbstractSocket::SocketError>::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));
+}