/* * ModuleManager.cpp * * Copyright (C) 2008 Matthias Schiffer * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "ModuleManager.h" #include "ConfigEntry.h" #include "Logger.h" namespace Mad { namespace Common { ModuleManager ModuleManager::moduleManager; void ModuleManager::doInit() { lt_dlinit(); } void ModuleManager::doDeinit() { while(!moduleOrder.empty()) { unloadModule(moduleOrder.top()); moduleOrder.pop(); } lt_dlexit(); } bool ModuleManager::handleConfigEntry(const ConfigEntry &entry, bool handled) { if(handled) return false; if(entry[0].getKey().matches("LoadModule")) { if(!loadModule(entry[0][0].c_str())) Logger::logf(Logger::ERROR, "Can't load module '%s'.", entry[0][0].c_str()); return true; } return false; } bool ModuleManager::loadModule(const std::string &name) { lt_dlhandle handle = lt_dlopen(name.c_str()); if(!handle) return false; void (*initFun)(); initFun = (void(*)())lt_dlsym(handle, "init"); if(initFun) (*initFun)(); modules.insert(std::make_pair(name, handle)); moduleOrder.push(name); return true; } void ModuleManager::unloadModule(const std::string &name) { void (*deinitFun)(); deinitFun = (void(*)())lt_dlsym(modules[name], "deinit"); if(deinitFun) (*deinitFun)(); lt_dlclose(modules[name]); modules.erase(name); } } }