From 72a40536f90aca5bebb714a2d02af4cb2bc67fdd Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 24 Nov 2008 20:17:57 +0100 Subject: ModuleManager angefangen; libltdl zum Projekt hinzugefuegt --- src/Common/ModuleManager.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/Common/ModuleManager.cpp (limited to 'src/Common/ModuleManager.cpp') diff --git a/src/Common/ModuleManager.cpp b/src/Common/ModuleManager.cpp new file mode 100644 index 0000000..2df1078 --- /dev/null +++ b/src/Common/ModuleManager.cpp @@ -0,0 +1,89 @@ +/* + * 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); +} + +} +} -- cgit v1.2.3