/* 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 { // --------------- 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() { filesystem::init(); con_debug << "Initializing core..." << std::endl; if (game()) game()->init(); else con_warn << "No game module found!" << std::endl; } void ApplicationInterface::shutdown() { con_debug << "Shutting down core..." << std::endl; if (game()) game()->shutdown(); else con_warn << "No game module found!" << std::endl; filesystem::shutdown(); } void ApplicationInterface::quit(int status) { sys::quit(status); } void ApplicationInterface::frame(float seconds) { if (game()) game()->frame(seconds); } }