From 8ee5d47d7e1336eb69064ca31e27bbfa7d86b51e Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Tue, 5 Feb 2008 00:41:59 +0000 Subject: renamed ApplicationInterface to Application --- src/core/application.cc | 198 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 src/core/application.cc (limited to 'src/core/application.cc') diff --git a/src/core/application.cc b/src/core/application.cc new file mode 100644 index 0000000..810bacb --- /dev/null +++ b/src/core/application.cc @@ -0,0 +1,198 @@ +/* + core/application.cc + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +#include "core/core.h" +#include "filesystem/filesystem.h" +#include "sys/sys.h" + +#include +#include +#include + +namespace core +{ + +// --------------- function repository ------------------------------ +extern "C" void func_print(std::stringstream &args) +{ + char text[MAXCMDSIZE]; + // FIXME leading space + if (args.getline(text, MAXCMDSIZE)) + con_print << text << std::endl; +} + +extern "C" void func_help(std::stringstream &args) +{ + con_print << "This is the help function" << std::endl; +} + +extern "C" void func_quit(std::stringstream &args) +{ + if (Application::instance()) { + Application::instance()->shutdown(); + Application::instance()->quit(0); + } +} + +extern "C" void func_connect(std::stringstream &args) +{ + if (Application::instance()) + Application::instance()->connect(); +} + +extern "C" void func_disconnect(std::stringstream &args) +{ + if (Application::instance()) + Application::instance()->disconnect(); +} + +// --------------- signal_handler ----------------------------------- + +extern "C" void signal_handler(int signum) +{ + switch (signum) { + case SIGHUP: + case SIGINT: + case SIGQUIT: + case SIGTERM: + if (Application::instance()) { + con_warn << "received signal " << signum << ", shutting down..." << std::endl; + Application::instance()->shutdown(); + Application::instance()->quit(0); + } else { + std::cerr << "received signal " << signum << ", terminated..." << std::endl; + sys::quit(1); + } + break; + default: + std::cerr << "received signal " << signum << ", terminated..." << std::endl; + sys::quit(1); + break; + } +} + +// --------------- Application ----------------------------- + +Application *Application::application_instance = 0; + +Application::Application() +{ + if (application_instance) { + std::cerr << "multiple core::Application instances!" << std::endl; + sys::quit(2); + } + application_instance = this; + + sys::signal(SIGHUP, signal_handler); + sys::signal(SIGINT, signal_handler); + sys::signal(SIGQUIT, signal_handler); + sys::signal(SIGTERM, signal_handler); +} + +Application::~Application() +{ + application_instance = 0; +} + +Application *Application::instance() +{ + return application_instance; +} + +void Application::init() +{ + con_print << "Initializing core..." << std::endl; + con_debug << "Debug messages enabled" << std::endl; + + // initialize core subsystems + filesystem::init(); + + // register our functions + func::add("print", func_print); + func::add("help", func_help); + func::add("quit", func_quit); + + func::add("connect", func_connect); + func::add("disconnect", func_disconnect); + + if (game()) + game()->connected = false; + else + con_warn << "No game module loaded!" << std::endl; + current_time = 0; +} + +void Application::shutdown() +{ + con_print << "Shutting down core..." << std::endl; + + if (game()) + if (game()->connected) + disconnect(); + else + con_warn << "No game module loaded!" << std::endl; + + filesystem::shutdown(); +} + +void Application::quit(int status) +{ + sys::quit(status); +} + +void Application::connect() +{ + if (!game()) { + con_warn << "No game module loaded!" << std::endl; + return; + } + + if (game()->connected) { + con_warn << "Connected. Disconnect first." << std::endl; + } + + game()->current_time = 0; + if (game()->connected = game()->init()) { + con_print << "Connected." << std::endl; + } else { + con_warn << "Connect failed." << std::endl; + } +} + +void Application::disconnect() +{ + if (!game()) { + con_warn << "No game module loaded!" << std::endl; + return; + } + + if (!game()->connected) { + con_warn << "Not connected." << std::endl; + return; + } + + game()->shutdown(); + + game()->connected = false; + game()->current_time = 0; + + con_print << "Disconnected." << std::endl; +} + +void Application::frame(float seconds) +{ + current_time += seconds; + + if (game() && game()->connected) { + game()->current_time += seconds; + game()->frame(seconds); + } + + // execute commands in the buffer + commandbuffer::execute(); +} + +} -- cgit v1.2.3