aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Skoland <davidskoland@gmail.com>2017-01-04 01:49:52 +0100
committerDavid Skoland <davidskoland@gmail.com>2017-01-04 01:49:52 +0100
commit4c7bc69dc2594bdcf704f61314e2b017aa8c9b66 (patch)
tree85aef5fa10dce00e57bb31a2220f8abf851fde3f
parentf96011452b845a57159094abc501c3aebe6f16fa (diff)
made basic network structure + added server listing in lobby
-rw-r--r--Attorney_Online_remake.pro7
-rw-r--r--aoapplication.cpp3
-rw-r--r--aoapplication.h10
-rw-r--r--aopacket.cpp32
-rw-r--r--aopacket.h22
-rw-r--r--lobby.cpp42
-rw-r--r--lobby.h14
-rw-r--r--main.cpp5
-rw-r--r--networkmanager.cpp78
-rw-r--r--networkmanager.h26
-rw-r--r--packet_distribution.cpp40
11 files changed, 261 insertions, 18 deletions
diff --git a/Attorney_Online_remake.pro b/Attorney_Online_remake.pro
index ab07286e..b24292f2 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 8ba9c399..c2eef1f6 100644
--- a/aoapplication.cpp
+++ b/aoapplication.cpp
@@ -1,12 +1,13 @@
#include <QDebug>
#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 194612c3..14ad5ce8 100644
--- a/aoapplication.h
+++ b/aoapplication.h
@@ -1,14 +1,20 @@
#ifndef AOAPPLICATION_H
#define AOAPPLICATION_H
+#include "aopacket.h"
+#include "datatypes.h"
+
#include <QApplication>
#include <QMainWindow>
+#include <QVector>
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_type> 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 00000000..553816bf
--- /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 00000000..13f47057
--- /dev/null
+++ b/aopacket.h
@@ -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
diff --git a/lobby.cpp b/lobby.cpp
index bb941a6b..2ba7973d 100644
--- a/lobby.cpp
+++ b/lobby.cpp
@@ -1,11 +1,13 @@
-#include <QDebug>
+#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 <QDebug>
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 ca903f96..8b33b977 100644
--- a/lobby.h
+++ b/lobby.h
@@ -3,9 +3,12 @@
#include <QMainWindow>
#include <QListWidget>
+#include <QLabel>
+#include <QPlainTextEdit>
#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 1c79671f..9425c1fa 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 d5a2dacb..31942647 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 ba539dd4..499ed9ec 100644
--- a/networkmanager.h
+++ b/networkmanager.h
@@ -1,12 +1,15 @@
#ifndef NETWORKMANAGER_H
#define NETWORKMANAGER_H
-#include <QTcpSocket>
+#include "aopacket.h"
+#include "aoapplication.h"
-class AOApplication;
+#include <QTcpSocket>
-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 00000000..334ac4ab
--- /dev/null
+++ b/packet_distribution.cpp
@@ -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();
+ }
+ }
+}