/* core/applicationinterface.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(ApplicationInterface::instance()) { ApplicationInterface::instance()->shutdown(); ApplicationInterface::instance()->quit(0); } } extern "C" void func_connect(std::stringstream &args) { if(ApplicationInterface::instance()) ApplicationInterface::instance()->connect(); } extern "C" void func_disconnect(std::stringstream &args) { if(ApplicationInterface::instance()) ApplicationInterface::instance()->disconnect(); } // --------------- signal_handler ----------------------------------- extern "C" void signal_handler(int signum) { switch(signum){ case SIGHUP: case SIGINT: case SIGQUIT: case SIGTERM: if (ApplicationInterface::instance()) { con_warn << "received signal " << signum << ", shutting down..." << std::endl; ApplicationInterface::instance()->shutdown(); ApplicationInterface::instance()->quit(0); } else { std::cerr << "received signal " << signum << ", no application found, terminated..." << std::endl; sys::quit(1); } break; default: std::cerr << "received signal " << signum << ", terminated..." << std::endl; sys::quit(1); break; } } // --------------- ApplicationInterface ----------------------------- ApplicationInterface *ApplicationInterface::applicationinterface_instance = 0; ApplicationInterface::ApplicationInterface() { if (applicationinterface_instance) { std::cerr << "multiple singleton instances: core::ApplicationInterface" << std::endl; sys::quit(2); } applicationinterface_instance = this; sys::signal(SIGHUP, signal_handler); sys::signal(SIGINT, signal_handler); sys::signal(SIGQUIT, signal_handler); sys::signal(SIGTERM, signal_handler); } ApplicationInterface::~ApplicationInterface() { applicationinterface_instance = 0; } ApplicationInterface *ApplicationInterface::instance() { return applicationinterface_instance; } void ApplicationInterface::init() { con_print << "Initializing core..." << std::endl; con_debug << "Debug messages enabled" << std::endl; // initialize core subsystems filesystem::init(); // register our functions func_register("print", func_print); func_register("help", func_help); func_register("quit", func_quit); func_register("connect", func_connect); func_register("disconnect", func_disconnect); if (game()) game()->connected = false; else con_warn << "No game module loaded!" << std::endl; current_time = 0; } void ApplicationInterface::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 ApplicationInterface::quit(int status) { sys::quit(status); } void ApplicationInterface::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 ApplicationInterface::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 ApplicationInterface::frame(float seconds) { current_time += seconds; if (game() && game()->connected) { game()->current_time += seconds; game()->frame(seconds); } // execute commands in the buffer commandbuffer::execute(); } }