From d0e562c0778481a823b84e11cac6b8ef3d50acb9 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 4 Nov 2012 07:51:52 -0500 Subject: [PATCH] fill in start_server() and stop_server() --- src/client/Client.cc | 42 ++++++++++++++++++++++++++++++++++++++---- src/client/Client.h | 7 +++++-- src/client/main.cc | 2 +- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index a4effce..ed29fa9 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1,12 +1,20 @@ +#include +#include +#include +#include +#include +#include #include #include "Client.h" #include "Types.h" +using namespace std; + /* TODO: this should be moved to common somewhere */ #define MAX_SHOT_DISTANCE 250.0 #define SHOT_EXPAND_SPEED 75.0 -Client::Client() +Client::Client(const string & exe_path) { connect(59243, "127.0.0.1"); // Just connect to local host for now - testing m_client_has_focus = true; @@ -15,6 +23,8 @@ Client::Client() m_left_button_pressed = false; m_drawing_shot = false; m_shot_fired = false; + m_exe_path = exe_path; + m_server_pid = 0; } Client::~Client() @@ -198,14 +208,38 @@ void Client::run_main_menu() } } -void Client::start_server() +bool Client::start_server() { - /* TODO */ + string server_exe_path = m_exe_path; + int length = server_exe_path.length(); + if (length > 4) + { + string ext = server_exe_path.substr(length - 4); + transform(ext.begin(), ext.end(), ext.begin(), ::tolower); + if (ext == ".exe") + server_exe_path = server_exe_path.substr(0, length - 4); + } + server_exe_path += "-server"; + pid_t pid = fork(); + if (pid < 0) + return false; + if (pid > 0) + { + m_server_pid = pid; + return true; + } + execl(server_exe_path.c_str(), "treacherous-terrain-server", NULL); + exit(-1); } void Client::stop_server() { - /* TODO */ + if (m_server_pid > 0) + { + kill(m_server_pid, SIGINT); + m_server_pid = 0; + waitpid(-1, NULL, 0); + } } void Client::run_client() diff --git a/src/client/Client.h b/src/client/Client.h index 3a15d89..9b8b625 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include "refptr.h" @@ -30,12 +31,12 @@ enum class Client { public: - Client(); + Client(const std::string & exe_path); ~Client(); void run(bool fullscreen, int width, int height, std::string pname); protected: void run_main_menu(); - void start_server(); + bool start_server(); void stop_server(); void run_client(); void connect(int port, const char *host); @@ -61,6 +62,8 @@ class Client void play_single_player_game_button_clicked(); void exit_button_clicked(); + int m_server_pid; + std::string m_exe_path; sfg::SFGUI m_sfgui; int m_menu_action; bool m_mouse_grabbed; diff --git a/src/client/main.cc b/src/client/main.cc index 276275d..ab09db3 100644 --- a/src/client/main.cc +++ b/src/client/main.cc @@ -38,7 +38,7 @@ int main(int argc, char *argv[]) } } - Client client; + Client client(argv[0]); client.run(fullscreen, width, height, player_name);