made basic network structure + added server listing in lobby

This commit is contained in:
David Skoland 2017-01-04 01:49:52 +01:00
parent f96011452b
commit 4c7bc69dc2
11 changed files with 261 additions and 18 deletions

View File

@ -23,7 +23,9 @@ SOURCES += main.cpp\
global_variables.cpp \ global_variables.cpp \
debug_functions.cpp \ debug_functions.cpp \
networkmanager.cpp \ networkmanager.cpp \
aoapplication.cpp aoapplication.cpp \
aopacket.cpp \
packet_distribution.cpp
HEADERS += lobby.h \ HEADERS += lobby.h \
text_file_functions.h \ text_file_functions.h \
@ -35,4 +37,5 @@ HEADERS += lobby.h \
debug_functions.h \ debug_functions.h \
networkmanager.h \ networkmanager.h \
aoapplication.h \ aoapplication.h \
datatypes.h datatypes.h \
aopacket.h

View File

@ -1,12 +1,13 @@
#include <QDebug> #include <QDebug>
#include "lobby.h" #include "lobby.h"
#include "networkmanager.h"
#include "aoapplication.h" #include "aoapplication.h"
AOApplication::AOApplication(int &argc, char **argv) : QApplication(argc, argv) AOApplication::AOApplication(int &argc, char **argv) : QApplication(argc, argv)
{ {
net_manager = new NetworkManager(this);
} }
AOApplication::~AOApplication() AOApplication::~AOApplication()

View File

@ -1,14 +1,20 @@
#ifndef AOAPPLICATION_H #ifndef AOAPPLICATION_H
#define AOAPPLICATION_H #define AOAPPLICATION_H
#include "aopacket.h"
#include "datatypes.h"
#include <QApplication> #include <QApplication>
#include <QMainWindow> #include <QMainWindow>
#include <QVector>
class NetworkManager; class NetworkManager;
class Lobby; class Lobby;
class AOApplication : public QApplication class AOApplication : public QApplication
{ {
Q_OBJECT
public: public:
AOApplication(int &argc, char **argv); AOApplication(int &argc, char **argv);
~AOApplication(); ~AOApplication();
@ -26,6 +32,10 @@ public:
void construct_courtroom(); void construct_courtroom();
void destruct_courtroom(); void destruct_courtroom();
QVector<server_type> server_list;
void ms_packet_received(AOPacket *p_packet);
}; };
#endif // AOAPPLICATION_H #endif // AOAPPLICATION_H

32
aopacket.cpp Normal file
View File

@ -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;
}

22
aopacket.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef AOPACKET_H
#define AOPACKET_H
#include <QString>
#include <QStringList>
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

View File

@ -1,11 +1,13 @@
#include <QDebug> #include "lobby.h"
#include "path_functions.h" #include "path_functions.h"
#include "text_file_functions.h" #include "text_file_functions.h"
#include "global_variables.h" #include "global_variables.h"
#include "debug_functions.h" #include "debug_functions.h"
#include "aoapplication.h"
#include "networkmanager.h"
#include "lobby.h" #include <QDebug>
Lobby::Lobby(AOApplication *parent) : QMainWindow() Lobby::Lobby(AOApplication *parent) : QMainWindow()
{ {
@ -21,10 +23,12 @@ Lobby::Lobby(AOApplication *parent) : QMainWindow()
ui_add_to_fav = new AOButton(this); ui_add_to_fav = new AOButton(this);
ui_connect = new AOButton(this); ui_connect = new AOButton(this);
ui_about = 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_public_servers, SIGNAL(clicked()), this, SLOT(on_public_servers_clicked()));
connect(ui_favorites, SIGNAL(clicked()), this, SLOT(on_favorites_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(pressed()), this, SLOT(on_refresh_pressed()));
connect(ui_refresh, SIGNAL(released()), this, SLOT(on_refresh_released())); connect(ui_refresh, SIGNAL(released()), this, SLOT(on_refresh_released()));
connect(ui_add_to_fav, SIGNAL(pressed()), this, SLOT(on_add_to_fav_pressed())); 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->set_image("about.png");
ui_about->move(428, 1); ui_about->move(428, 1);
ui_about->resize(88, 21); 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() void Lobby::on_public_servers_clicked()
@ -102,7 +123,11 @@ void Lobby::on_refresh_released()
{ {
ui_refresh->set_image("refresh.png"); 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() void Lobby::on_add_to_fav_pressed()
@ -126,7 +151,7 @@ void Lobby::on_connect_released()
{ {
ui_connect->set_image("connect.png"); 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() void Lobby::on_about_clicked()
@ -135,3 +160,10 @@ void Lobby::on_about_clicked()
call_error("YEBOIIII"); call_error("YEBOIIII");
} }
void Lobby::list_servers()
{
for (server_type i_server : ao_app->server_list)
{
ui_server_list->addItem(i_server.name);
}
}

14
lobby.h
View File

@ -3,9 +3,12 @@
#include <QMainWindow> #include <QMainWindow>
#include <QListWidget> #include <QListWidget>
#include <QLabel>
#include <QPlainTextEdit>
#include "aoimage.h" #include "aoimage.h"
#include "aobutton.h" #include "aobutton.h"
#include "aopacket.h"
class AOApplication; class AOApplication;
@ -18,11 +21,9 @@ public:
~Lobby(); ~Lobby();
void set_widgets(); void set_widgets();
void list_servers();
private: private:
const int m_lobby_width = 517;
const int m_lobby_height = 666;
AOApplication *ao_app; AOApplication *ao_app;
AOImage *ui_background; AOImage *ui_background;
@ -37,7 +38,12 @@ private:
AOButton *ui_about; AOButton *ui_about;
QListWidget *ui_server_list; 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: public slots:
void on_public_servers_clicked(); void on_public_servers_clicked();

View File

@ -2,12 +2,17 @@
#include "aoapplication.h" #include "aoapplication.h"
#include "datatypes.h"
#include "networkmanager.h"
#include "lobby.h" #include "lobby.h"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
AOApplication main_app(argc, argv); AOApplication main_app(argc, argv);
main_app.construct_lobby(); 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(); main_app.w_lobby->show();
return main_app.exec(); return main_app.exec();

View File

@ -1,14 +1,19 @@
#include "aoapplication.h"
#include "networkmanager.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; ao_app = parent;
ms_socket = new QTcpSocket(); ms_socket = new QTcpSocket();
server_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() NetworkManager::~NetworkManager()
@ -17,3 +22,70 @@ NetworkManager::~NetworkManager()
delete server_socket; 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()
{
}

View File

@ -1,12 +1,15 @@
#ifndef NETWORKMANAGER_H #ifndef NETWORKMANAGER_H
#define NETWORKMANAGER_H #define NETWORKMANAGER_H
#include "aopacket.h"
#include "aoapplication.h"
#include <QTcpSocket> #include <QTcpSocket>
class AOApplication; class NetworkManager : public QObject
class NetworkManager
{ {
Q_OBJECT
public: public:
NetworkManager(AOApplication *parent); NetworkManager(AOApplication *parent);
~NetworkManager(); ~NetworkManager();
@ -14,6 +17,23 @@ public:
AOApplication *ao_app; AOApplication *ao_app;
QTcpSocket *ms_socket; QTcpSocket *ms_socket;
QTcpSocket *server_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 #endif // NETWORKMANAGER_H

40
packet_distribution.cpp Normal file
View File

@ -0,0 +1,40 @@
#include "aoapplication.h"
#include "lobby.h"
#include <QDebug>
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();
}
}
}