add modulemanager module

This commit is contained in:
Eduardo Bart
2012-02-05 23:44:47 -02:00
parent a55e138002
commit 64c9e4f1d5
25 changed files with 379 additions and 60 deletions

View File

@@ -25,6 +25,7 @@
#include <framework/global.h>
class ModuleManager;
class Module;
class Event;
class ScheduledEvent;

View File

@@ -31,36 +31,6 @@ Module::Module(const std::string& name)
m_name = name;
}
void Module::discover(const OTMLNodePtr& moduleNode)
{
const static std::string none = "none";
m_description = moduleNode->valueAt("description", none);
m_author = moduleNode->valueAt("author", none);
m_website = moduleNode->valueAt("website", none);
m_version = moduleNode->valueAt("version", none);
m_autoLoad = moduleNode->valueAt<bool>("autoLoad", false);
m_autoLoadAntecedence = moduleNode->valueAt<int>("autoLoadAntecedence", 100);
if(OTMLNodePtr node = moduleNode->get("dependencies")) {
for(const OTMLNodePtr& tmp : node->children())
m_dependencies.push_back(tmp->value());
}
// set onLoad callback
if(OTMLNodePtr node = moduleNode->get("onLoad")) {
g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]");
g_lua.useValue();
m_loadCallback = g_lua.polymorphicPop<SimpleCallback>();
}
// set onUnload callback
if(OTMLNodePtr node = moduleNode->get("onUnload")) {
g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]");
g_lua.useValue();
m_unloadCallback = g_lua.polymorphicPop<SimpleCallback>();
}
}
bool Module::load()
{
if(m_loaded)
@@ -95,3 +65,34 @@ void Module::unload()
m_loaded = false;
}
}
void Module::discover(const OTMLNodePtr& moduleNode)
{
const static std::string none = "none";
m_description = moduleNode->valueAt("description", none);
m_author = moduleNode->valueAt("author", none);
m_website = moduleNode->valueAt("website", none);
m_version = moduleNode->valueAt("version", none);
m_autoLoad = moduleNode->valueAt<bool>("autoLoad", false);
m_autoLoadAntecedence = moduleNode->valueAt<int>("autoLoadAntecedence", 100);
if(OTMLNodePtr node = moduleNode->get("dependencies")) {
for(const OTMLNodePtr& tmp : node->children())
m_dependencies.push_back(tmp->value());
}
// set onLoad callback
if(OTMLNodePtr node = moduleNode->get("onLoad")) {
g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]");
g_lua.useValue();
m_loadCallback = g_lua.polymorphicPop<SimpleCallback>();
}
// set onUnload callback
if(OTMLNodePtr node = moduleNode->get("onUnload")) {
g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]");
g_lua.useValue();
m_unloadCallback = g_lua.polymorphicPop<SimpleCallback>();
}
}

View File

@@ -26,12 +26,12 @@
#include "declarations.h"
#include <framework/otml/declarations.h>
#include <framework/luascript/luaobject.h>
class Module
class Module : public LuaObject
{
public:
Module(const std::string& name);
void discover(const OTMLNodePtr& moduleNode);
bool load();
void unload();
@@ -46,6 +46,10 @@ public:
bool isAutoLoad() { return m_autoLoad; }
int getAutoLoadAntecedence() { return m_autoLoadAntecedence; }
protected:
void discover(const OTMLNodePtr& moduleNode);
friend class ModuleManager;
private:
Boolean<false> m_loaded;
Boolean<false> m_autoLoad;

View File

@@ -30,6 +30,9 @@ ModuleManager g_modules;
void ModuleManager::discoverModules()
{
// remove modules that are not loaded
m_autoLoadModules.clear();
auto moduleDirs = g_resources.listDirectoryFiles("/");
for(const std::string& moduleDir : moduleDirs) {
auto moduleFiles = g_resources.listDirectoryFiles("/" + moduleDir);
@@ -85,12 +88,19 @@ ModulePtr ModuleManager::discoverModule(const std::string& moduleFile)
OTMLNodePtr moduleNode = doc->at("Module");
std::string name = moduleNode->valueAt("name");
if(getModule(name))
Fw::throwException("module '", name, "' already exists, cannot have duplicate module names");
//if(getModule(name))
// Fw::throwException("module '", name, "' already exists, cannot have duplicate module names");
module = ModulePtr(new Module(name));
bool push = false;
module = getModule(name);
if(!module) {
module = ModulePtr(new Module(name));
push = true;
}
module->discover(moduleNode);
m_modules.push_back(module);
if(push)
m_modules.push_back(module);
} catch(Exception& e) {
logError("Unable to discover module from file '", moduleFile, "': ", e.what());
}

View File

@@ -36,6 +36,7 @@ public:
void unloadModules();
ModulePtr getModule(const std::string& moduleName);
std::vector<ModulePtr> getModules() { return m_modules; }
private:
std::vector<ModulePtr> m_modules;