aboutsummaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'src/network')
-rw-r--r--src/network/serverinfo.cpp6
-rw-r--r--src/network/serverinfo.h15
-rw-r--r--src/network/websocketconnection.cpp97
-rw-r--r--src/network/websocketconnection.h43
4 files changed, 161 insertions, 0 deletions
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 <QString>
+
+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 <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));
+}
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 <QObject>
+#include <QWebSocket>
+
+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);
+};