/* core/module.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "auxiliary/functions.h" #include "core/module.h" #include "sys/sys.h" namespace core { /*-- static functions ----------------------------------------------*/ Module *Module::module_preload = 0; Module *Module::module_active = 0; Module::Registry Module::module_registry; Module *Module::find(const std::string &label) { Registry::iterator it = module_registry.find(label); if (it == module_registry.end()) return 0; else return (*it).second; } Module *Module::find(const char *label) { return(find(std::string(label))); } Module *Module::add(Module *module) { Module *m = find(module->label()); if (m) { con_warn << "module '" << module->label() << "' already registered!" << std::endl; delete module; return 0; } module_registry[module->label()] = module; if (!module_preload) { module_preload = module; } con_debug << " " << module->label() << " " << module->name() << std::endl; return module; } Module *Module::load(const char *label) { if (!label) return 0; Module *module = find(label); if (!module) { con_warn << "Could not find module '" << label << "'" << std::endl; return 0; } con_print << " module " << module->label() << " " << module->name() << std::endl; module_preload = module; return module; } void Module::clear() { for (Registry::iterator it = module_registry.begin(); it != module_registry.end(); it++) { Module *module = (*it).second; con_print << " " << module->label() << " " << module->name() << std::endl; } module_registry.clear(); module_preload = 0; } void Module::list() { for (Registry::iterator it = module_registry.begin(); it != module_registry.end(); it++) { Module *module = (*it).second; con_print << " " << module->label() << " " << module->name() << std::endl; } con_print << module_registry.size() << " registered game " << aux::plural("modules", module_registry.size()) << std::endl; } /*-- instance functions --------------------------------------------*/ Module::Module(const char *label, const char *name, bool interactive) : module_label(label), module_name(name) { module_running = false; module_interactive = interactive; } Module::~Module() { module_running = false; module_name.clear(); } void Module::run() { module_active = this; module_running = true; init(); } void Module::terminate() { shutdown(); module_running = false; module_active = 0; } void Module::abort() { module_running = false; module_active = 0; } }