aboutsummaryrefslogtreecommitdiff
path: root/src/networkmanager.cpp
diff options
context:
space:
mode:
authorTrickyLeifa <date.epoch@gmail.com>2024-05-17 16:39:30 +0200
committerTrickyLeifa <date.epoch@gmail.com>2024-05-17 19:04:57 +0200
commit1ef96383c8f7ed136a0e028aef0835b4838b5e95 (patch)
treee87a9df097a50b4d1f918f8a4f37d210562d10d6 /src/networkmanager.cpp
parent39e4354b1dae5d8487ea5b84be9f304b1950a61a (diff)
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`
Diffstat (limited to 'src/networkmanager.cpp')
-rw-r--r--src/networkmanager.cpp162
1 files changed, 42 insertions, 120 deletions
diff --git a/src/networkmanager.cpp b/src/networkmanager.cpp
index e53b2917..69ff839c 100644
--- a/src/networkmanager.cpp
+++ b/src/networkmanager.cpp
@@ -3,6 +3,8 @@
#include "datatypes.h"
#include "debug_functions.h"
#include "lobby.h"
+#include "net/nettcpconnection.h"
+#include "net/netwebsocketconnection.h"
#include "options.h"
#include <QAbstractSocket>
@@ -77,13 +79,18 @@ void NetworkManager::ms_request_finished(QNetworkReply *reply)
}
ao_app->set_server_list(server_list);
- if (ao_app->lobby_constructed)
+ if (ao_app->is_lobby_constructed())
{
ao_app->w_lobby->list_servers();
}
reply->deleteLater();
}
+QString NetworkManager::get_user_agent() const
+{
+ return QStringLiteral("AttorneyOnline/%1 (Desktop)").arg(ao_app->get_version_string());
+}
+
void NetworkManager::send_heartbeat()
{
// Ping the server periodically to tell the MS that you've been playing
@@ -137,156 +144,71 @@ void NetworkManager::request_document(MSDocumentType document_type, const std::f
});
}
-void NetworkManager::connect_to_server(ServerInfo p_server)
+void NetworkManager::connect_to_server(ServerInfo server)
{
disconnect_from_server();
- qInfo().nospace().noquote() << "connecting to " << p_server.ip << ":" << p_server.port;
-
- switch (p_server.socket_type)
+ qInfo().noquote() << QObject::tr("Connecting to %1").arg(server.toString());
+ switch (server.socket_type)
{
default:
- p_server.socket_type = TcpServerConnection;
+ server.socket_type = TcpServerConnection;
[[fallthrough]];
case TcpServerConnection:
- qInfo() << "using TCP backend";
- server_socket.tcp = new QTcpSocket(this);
-
- connect(server_socket.tcp, &QAbstractSocket::connected, this, [] { qDebug() << "established connection to server"; });
- connect(server_socket.tcp, &QIODevice::readyRead, this, [this] { handle_server_packet(QString::fromUtf8(server_socket.tcp->readAll())); });
- connect(server_socket.tcp, &QAbstractSocket::disconnected, ao_app, &AOApplication::server_disconnected);
-#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
- connect(server_socket.tcp, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), this, [this] {
-#else
- connect(server_socket.tcp, &QAbstractSocket::errorOccurred, this, [this] {
-#endif
- qCritical() << "TCP socket error:" << server_socket.tcp->errorString();
- });
-
- server_socket.tcp->connectToHost(p_server.ip, p_server.port);
+ qInfo() << "Using TCP backend.";
+ m_connection = new NetTcpConnection(this);
break;
case WebSocketServerConnection:
- qInfo() << "using WebSockets backend";
- server_socket.ws = new QWebSocket(QString(), QWebSocketProtocol::VersionLatest, this);
-
- connect(server_socket.ws, &QWebSocket::connected, this, [] { qDebug() << "established connection to server"; });
- connect(server_socket.ws, &QWebSocket::textMessageReceived, this, &NetworkManager::handle_server_packet);
- connect(server_socket.ws, &QWebSocket::disconnected, ao_app, &AOApplication::server_disconnected);
- connect(server_socket.ws, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), this, [this] { qCritical() << "WebSockets error:" << server_socket.ws->errorString(); });
-
- QUrl url;
- url.setScheme("ws");
- url.setHost(p_server.ip);
- url.setPort(p_server.port);
- QNetworkRequest req(url);
- req.setHeader(QNetworkRequest::UserAgentHeader, get_user_agent());
- server_socket.ws->open(req);
+ qInfo() << "Using WebSockets backend.";
+ m_connection = new NetWebSocketConnection(this);
break;
}
- connected = true;
- active_connection_type = p_server.socket_type;
-}
+ connect(m_connection, &NetConnection::connectedToServer, this, [] { qInfo() << "Established connection to server."; });
+ connect(m_connection, &NetConnection::disconnectedFromServer, ao_app, &AOApplication::server_disconnected);
+ connect(m_connection, &NetConnection::errorOccurred, this, [](QString error) { qCritical() << "Connection error:" << error; });
+ connect(m_connection, &NetConnection::receivedPacket, this, &NetworkManager::handle_server_packet);
-void NetworkManager::join_to_server()
-{
- ship_server_packet(AOPacket("askchaa").toString());
+ m_connection->connectToServer(server);
}
void NetworkManager::disconnect_from_server()
{
- if (!connected)
- {
- return;
- }
-
- switch (active_connection_type)
+ if (m_connection)
{
- case TcpServerConnection:
- server_socket.tcp->close();
- server_socket.tcp->deleteLater();
- break;
- case WebSocketServerConnection:
- server_socket.ws->close(QWebSocketProtocol::CloseCodeGoingAway);
- server_socket.ws->deleteLater();
- break;
+ m_connection->disconnectFromServer();
+ m_connection->deleteLater();
+ m_connection = nullptr;
}
-
- connected = false;
}
-void NetworkManager::ship_server_packet(AOPacket p_packet)
+void NetworkManager::ship_server_packet(AOPacket packet)
{
- QString message = p_packet.toString(true);
- switch (active_connection_type)
+ if (!m_connection)
{
- case TcpServerConnection:
- server_socket.tcp->write(message.toUtf8());
- break;
-
- case WebSocketServerConnection:
- server_socket.ws->sendTextMessage(message);
- break;
+ qCritical() << "Failed to ship packet; no connection.";
+ return;
}
-}
-void NetworkManager::handle_server_packet(const QString &p_data)
-{
- QString in_data = p_data;
-
- if (!p_data.endsWith("%"))
+ if (!m_connection->isConnected())
{
- partial_packet = true;
- temp_packet += in_data;
+ qCritical() << "Failed to ship packet; not connected.";
return;
}
- else
- {
- if (partial_packet)
- {
- in_data = temp_packet + in_data;
- temp_packet = "";
- partial_packet = false;
- }
- }
-#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
- const QStringList packet_list = in_data.split("%", QString::SkipEmptyParts);
-#else
- const QStringList packet_list = in_data.split("%", Qt::SkipEmptyParts);
-#endif
+ qInfo().noquote() << "Sending packet:" << packet.toString();
+ m_connection->sendPacket(packet);
+}
- for (const QString &packet : packet_list)
- {
- QStringList f_contents;
- // Packet should *always* end with #
- if (packet.endsWith("#"))
- {
- f_contents = packet.chopped(1).split("#");
- }
- // But, if it somehow doesn't, we should still be able to handle it
- else
- {
- f_contents = packet.split("#");
- }
- // Empty packets are suspicious!
- if (f_contents.isEmpty())
- {
- qWarning() << "WARNING: Empty packet received from server, skipping...";
- continue;
- }
- // Take the first arg as the command
- QString command = f_contents.takeFirst();
- for (QString &data : f_contents)
- {
- data = AOPacket::decode(data);
- }
+void NetworkManager::join_to_server()
+{
+ ship_server_packet(AOPacket("askchaa").toString());
+}
- // The rest is contents of the packet
- AOPacket f_packet(command, f_contents);
- // Ship it to the server!
- ao_app->server_packet_received(f_packet);
- }
+void NetworkManager::handle_server_packet(AOPacket packet)
+{
+ qInfo().noquote() << "Received packet:" << packet.toString();
+ ao_app->server_packet_received(packet);
}