From 4c7bc69dc2594bdcf704f61314e2b017aa8c9b66 Mon Sep 17 00:00:00 2001 From: David Skoland Date: Wed, 4 Jan 2017 01:49:52 +0100 Subject: [PATCH] made basic network structure + added server listing in lobby --- Attorney_Online_remake.pro | 7 +++- aoapplication.cpp | 3 +- aoapplication.h | 10 +++++ aopacket.cpp | 32 ++++++++++++++++ aopacket.h | 22 +++++++++++ lobby.cpp | 42 +++++++++++++++++--- lobby.h | 14 +++++-- main.cpp | 5 +++ networkmanager.cpp | 78 ++++++++++++++++++++++++++++++++++++-- networkmanager.h | 26 +++++++++++-- packet_distribution.cpp | 40 +++++++++++++++++++ 11 files changed, 261 insertions(+), 18 deletions(-) create mode 100644 aopacket.cpp create mode 100644 aopacket.h create mode 100644 packet_distribution.cpp diff --git a/Attorney_Online_remake.pro b/Attorney_Online_remake.pro index ab07286..b24292f 100644 --- a/Attorney_Online_remake.pro +++ b/Attorney_Online_remake.pro @@ -23,7 +23,9 @@ SOURCES += main.cpp\ global_variables.cpp \ debug_functions.cpp \ networkmanager.cpp \ - aoapplication.cpp + aoapplication.cpp \ + aopacket.cpp \ + packet_distribution.cpp HEADERS += lobby.h \ text_file_functions.h \ @@ -35,4 +37,5 @@ HEADERS += lobby.h \ debug_functions.h \ networkmanager.h \ aoapplication.h \ - datatypes.h + datatypes.h \ + aopacket.h diff --git a/aoapplication.cpp b/aoapplication.cpp index 8ba9c39..c2eef1f 100644 --- a/aoapplication.cpp +++ b/aoapplication.cpp @@ -1,12 +1,13 @@ #include #include "lobby.h" +#include "networkmanager.h" #include "aoapplication.h" AOApplication::AOApplication(int &argc, char **argv) : QApplication(argc, argv) { - + net_manager = new NetworkManager(this); } AOApplication::~AOApplication() diff --git a/aoapplication.h b/aoapplication.h index 194612c..14ad5ce 100644 --- a/aoapplication.h +++ b/aoapplication.h @@ -1,14 +1,20 @@ #ifndef AOAPPLICATION_H #define AOAPPLICATION_H +#include "aopacket.h" +#include "datatypes.h" + #include #include +#include class NetworkManager; class Lobby; class AOApplication : public QApplication { + Q_OBJECT + public: AOApplication(int &argc, char **argv); ~AOApplication(); @@ -26,6 +32,10 @@ public: void construct_courtroom(); void destruct_courtroom(); + + QVector server_list; + + void ms_packet_received(AOPacket *p_packet); }; #endif // AOAPPLICATION_H diff --git a/aopacket.cpp b/aopacket.cpp new file mode 100644 index 0000000..553816b --- /dev/null +++ b/aopacket.cpp @@ -0,0 +1,32 @@ +#include "aopacket.h" + +AOPacket::AOPacket(QString p_packet_string) +{ + QStringList packet_contents = p_packet_string.split("#"); + + m_header = packet_contents.at(0); + + for(int n_string = 1 ; n_string < packet_contents.size() - 1 ; ++n_string) + { + m_contents.append(packet_contents.at(n_string)); + } +} + +AOPacket::~AOPacket() +{ + +} + +QString AOPacket::to_string() +{ + QString f_string = m_header; + + for (QString i_string : m_contents) + { + f_string += ("#" + i_string); + } + + f_string += "#%"; + + return f_string; +} diff --git a/aopacket.h b/aopacket.h new file mode 100644 index 0000000..13f4705 --- /dev/null +++ b/aopacket.h @@ -0,0 +1,22 @@ +#ifndef AOPACKET_H +#define AOPACKET_H + +#include +#include + +class AOPacket +{ +public: + AOPacket(QString p_packet_string); + ~AOPacket(); + + QString get_header() {return m_header;} + QStringList &get_contents() {return m_contents;} + QString to_string(); + +private: + QString m_header; + QStringList m_contents; +}; + +#endif // AOPACKET_H diff --git a/lobby.cpp b/lobby.cpp index bb941a6..2ba7973 100644 --- a/lobby.cpp +++ b/lobby.cpp @@ -1,11 +1,13 @@ -#include +#include "lobby.h" #include "path_functions.h" #include "text_file_functions.h" #include "global_variables.h" #include "debug_functions.h" +#include "aoapplication.h" +#include "networkmanager.h" -#include "lobby.h" +#include Lobby::Lobby(AOApplication *parent) : QMainWindow() { @@ -21,10 +23,12 @@ Lobby::Lobby(AOApplication *parent) : QMainWindow() ui_add_to_fav = new AOButton(this); ui_connect = new AOButton(this); ui_about = new AOButton(this); + ui_server_list = new QListWidget(this); + ui_player_count = new QLabel(this); + ui_description = new QPlainTextEdit(this); connect(ui_public_servers, SIGNAL(clicked()), this, SLOT(on_public_servers_clicked())); connect(ui_favorites, SIGNAL(clicked()), this, SLOT(on_favorites_clicked())); - connect(ui_refresh, SIGNAL(pressed()), this, SLOT(on_refresh_pressed())); connect(ui_refresh, SIGNAL(released()), this, SLOT(on_refresh_released())); connect(ui_add_to_fav, SIGNAL(pressed()), this, SLOT(on_add_to_fav_pressed())); @@ -75,6 +79,23 @@ void Lobby::set_widgets() ui_about->set_image("about.png"); ui_about->move(428, 1); ui_about->resize(88, 21); + + ui_server_list->move(20, 125); + ui_server_list->resize(286, 240); + ui_server_list->setStyleSheet("background-color: rgba(0, 0, 0, 0);" + "font: bold;"); + + ui_player_count->move(336, 91); + ui_player_count->resize(173, 16); + ui_player_count->setText("Offline"); + ui_player_count->setStyleSheet("font: bold;" + "color: white;" + "qproperty-alignment: AlignCenter;"); + + ui_description->move(337, 109); + ui_description->resize(173, 245); + ui_description->setStyleSheet("background-color: rgba(0, 0, 0, 0);" + "color: white;"); } void Lobby::on_public_servers_clicked() @@ -102,7 +123,11 @@ void Lobby::on_refresh_released() { ui_refresh->set_image("refresh.png"); - //T0D0: clear serverlist, request new list from MS and show them + AOPacket *f_packet = new AOPacket("ALL#%"); + + ao_app->net_manager->send_ms_packet(f_packet); + + delete f_packet; } void Lobby::on_add_to_fav_pressed() @@ -126,7 +151,7 @@ void Lobby::on_connect_released() { ui_connect->set_image("connect.png"); - //T0D0: connect to selected server(show loading overlay?) + //T0D0: call ao_app to initialize loading sequence } void Lobby::on_about_clicked() @@ -135,3 +160,10 @@ void Lobby::on_about_clicked() call_error("YEBOIIII"); } +void Lobby::list_servers() +{ + for (server_type i_server : ao_app->server_list) + { + ui_server_list->addItem(i_server.name); + } +} diff --git a/lobby.h b/lobby.h index ca903f9..8b33b97 100644 --- a/lobby.h +++ b/lobby.h @@ -3,9 +3,12 @@ #include #include +#include +#include #include "aoimage.h" #include "aobutton.h" +#include "aopacket.h" class AOApplication; @@ -18,11 +21,9 @@ public: ~Lobby(); void set_widgets(); + void list_servers(); private: - const int m_lobby_width = 517; - const int m_lobby_height = 666; - AOApplication *ao_app; AOImage *ui_background; @@ -37,7 +38,12 @@ private: AOButton *ui_about; QListWidget *ui_server_list; -// QListWidget + + QLabel *ui_player_count; + QPlainTextEdit *ui_description; + + const int m_lobby_width = 517; + const int m_lobby_height = 666; public slots: void on_public_servers_clicked(); diff --git a/main.cpp b/main.cpp index 1c79671..9425c1f 100644 --- a/main.cpp +++ b/main.cpp @@ -2,12 +2,17 @@ #include "aoapplication.h" +#include "datatypes.h" +#include "networkmanager.h" #include "lobby.h" int main(int argc, char *argv[]) { AOApplication main_app(argc, argv); main_app.construct_lobby(); + main_app.net_manager->connect_to_master(); + AOPacket *f_packet = new AOPacket("ALL#%"); + main_app.net_manager->send_ms_packet(f_packet); main_app.w_lobby->show(); return main_app.exec(); diff --git a/networkmanager.cpp b/networkmanager.cpp index d5a2dac..3194264 100644 --- a/networkmanager.cpp +++ b/networkmanager.cpp @@ -1,14 +1,19 @@ -#include "aoapplication.h" - #include "networkmanager.h" +#include "datatypes.h" +#include "debug_functions.h" +#include "lobby.h" -NetworkManager::NetworkManager(AOApplication *parent) + +NetworkManager::NetworkManager(AOApplication *parent) : QObject(parent) { ao_app = parent; ms_socket = new QTcpSocket(); server_socket = new QTcpSocket(); + + QObject::connect(ms_socket, SIGNAL(readyRead()), this, SLOT(handle_ms_packet())); + QObject::connect(server_socket, SIGNAL(readyRead()), this, SLOT(handle_server_packet())); } NetworkManager::~NetworkManager() @@ -17,3 +22,70 @@ NetworkManager::~NetworkManager() delete server_socket; } +void NetworkManager::connect_to_master() +{ + ms_socket->close(); + ms_socket->abort(); + + ms_socket->connectToHost(ms_hostname, ms_port); +} + +void NetworkManager::send_ms_packet(AOPacket *p_packet) +{ + QString f_packet = p_packet->to_string(); + + ms_socket->write(f_packet.toLocal8Bit()); + //qDebug() << "S(ms):" << f_packet; +} + +void NetworkManager::send_server_packet(AOPacket *p_packet) +{ + QString f_packet = p_packet->to_string(); + + delete p_packet; + + ms_socket->write(f_packet.toLocal8Bit()); + qDebug() << "S(ms):" << f_packet; +} + +void NetworkManager::handle_ms_packet() +{ + char buffer[16384] = {0}; + ms_socket->read(buffer, ms_socket->bytesAvailable()); + + QString in_data = buffer; + + if (!in_data.endsWith("%")) + { + partial_packet = true; + temp_packet += in_data; + return; + } + + else + { + if (partial_packet) + { + in_data = temp_packet + in_data; + temp_packet = ""; + partial_packet = false; + } + } + + QStringList packet_list = in_data.split("%", QString::SplitBehavior(QString::SkipEmptyParts)); + + for (QString packet : packet_list) + { + AOPacket *f_packet = new AOPacket(packet); + + ao_app->ms_packet_received(f_packet); + + delete f_packet; + } +} + +void NetworkManager::handle_server_packet() +{ + +} + diff --git a/networkmanager.h b/networkmanager.h index ba539dd..499ed9e 100644 --- a/networkmanager.h +++ b/networkmanager.h @@ -1,12 +1,15 @@ #ifndef NETWORKMANAGER_H #define NETWORKMANAGER_H +#include "aopacket.h" +#include "aoapplication.h" + #include -class AOApplication; - -class NetworkManager +class NetworkManager : public QObject { + Q_OBJECT + public: NetworkManager(AOApplication *parent); ~NetworkManager(); @@ -14,6 +17,23 @@ public: AOApplication *ao_app; QTcpSocket *ms_socket; QTcpSocket *server_socket; + + QString ms_hostname = "master.aceattorneyonline.com"; + int ms_port = 27016; + + bool partial_packet = false; + QString temp_packet = ""; + + void connect_to_master(); + +public slots: + void send_ms_packet(AOPacket *p_packet); + + void send_server_packet(AOPacket *p_packet); + +private slots: + void handle_ms_packet(); + void handle_server_packet(); }; #endif // NETWORKMANAGER_H diff --git a/packet_distribution.cpp b/packet_distribution.cpp new file mode 100644 index 0000000..334ac4a --- /dev/null +++ b/packet_distribution.cpp @@ -0,0 +1,40 @@ +#include "aoapplication.h" + +#include "lobby.h" + +#include + +void AOApplication::ms_packet_received(AOPacket *p_packet) +{ + QString header = p_packet->get_header(); + + if (header != "CHECK") + qDebug() << "R(ms):" << p_packet->to_string(); + + if (header == "ALL") + { + for (QString i_string : p_packet->get_contents()) + { + server_type f_server; + QStringList sub_contents = i_string.split("&"); + + if (sub_contents.size() < 4) + { + qDebug() << "W: malformed packet!"; + return; + } + + f_server.name = sub_contents.at(0); + f_server.desc = sub_contents.at(1); + f_server.ip = sub_contents.at(2); + f_server.port = sub_contents.at(3).toInt(); + + server_list.append(f_server); + } + + if (lobby_constructed) + { + w_lobby->list_servers(); + } + } +}