mirror of
https://github.com/edubart/otclient.git
synced 2025-10-19 05:53:26 +02:00
reorganize modules
This commit is contained in:
@@ -24,13 +24,12 @@
|
||||
#include "resourcemanager.h"
|
||||
|
||||
#include <framework/otml/otml.h>
|
||||
#include <framework/application.h>
|
||||
|
||||
ModuleManager g_modules;
|
||||
|
||||
void ModuleManager::discoverAndLoadModules()
|
||||
void ModuleManager::discoverModules()
|
||||
{
|
||||
std::multimap<int, ModulePtr> m_autoLoadModules;
|
||||
|
||||
auto moduleDirs = g_resources.listDirectoryFiles("/");
|
||||
for(const std::string& moduleDir : moduleDirs) {
|
||||
auto moduleFiles = g_resources.listDirectoryFiles("/" + moduleDir);
|
||||
@@ -42,14 +41,42 @@ void ModuleManager::discoverAndLoadModules()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ModuleManager::autoLoadModules(int maxPriority)
|
||||
{
|
||||
for(auto& pair : m_autoLoadModules) {
|
||||
int priority = pair.first;
|
||||
if(priority > maxPriority)
|
||||
break;
|
||||
ModulePtr module = pair.second;
|
||||
if(!module->isLoaded() && !module->load())
|
||||
logFatal("A required module has failed to load, cannot continue to run.");
|
||||
}
|
||||
}
|
||||
|
||||
void ModuleManager::discoverModulesPath()
|
||||
{
|
||||
// search for modules directory
|
||||
std::string possibleDirs[] = { "modules",
|
||||
g_resources.getBaseDir() + "modules",
|
||||
g_resources.getBaseDir() + "../modules",
|
||||
g_resources.getBaseDir() + "../share/" + g_app->getAppName() + "/modules",
|
||||
"" };
|
||||
bool found = false;
|
||||
for(const std::string& dir : possibleDirs) {
|
||||
// try to add module directory
|
||||
if(g_resources.addToSearchPath(dir)) {
|
||||
logInfo("Using modules directory '", dir.c_str(), "'");
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!found)
|
||||
logFatal("Could not find modules directory");
|
||||
}
|
||||
|
||||
ModulePtr ModuleManager::discoverModule(const std::string& moduleFile)
|
||||
{
|
||||
ModulePtr module;
|
||||
@@ -70,6 +97,13 @@ ModulePtr ModuleManager::discoverModule(const std::string& moduleFile)
|
||||
return module;
|
||||
}
|
||||
|
||||
void ModuleManager::ensureModuleLoaded(const std::string& moduleName)
|
||||
{
|
||||
ModulePtr module = g_modules.getModule(moduleName);
|
||||
if(!module || !module->load())
|
||||
logFatal("Unable to load '", moduleName, "' module");
|
||||
}
|
||||
|
||||
void ModuleManager::unloadModules()
|
||||
{
|
||||
for(const ModulePtr& module : m_modules)
|
||||
|
@@ -28,14 +28,18 @@
|
||||
class ModuleManager
|
||||
{
|
||||
public:
|
||||
void discoverAndLoadModules();
|
||||
void discoverModulesPath();
|
||||
void discoverModules();
|
||||
void autoLoadModules(int maxPriority);
|
||||
ModulePtr discoverModule(const std::string& moduleFile);
|
||||
void ensureModuleLoaded(const std::string& moduleName);
|
||||
void unloadModules();
|
||||
|
||||
ModulePtr getModule(const std::string& moduleName);
|
||||
|
||||
private:
|
||||
std::vector<ModulePtr> m_modules;
|
||||
std::multimap<int, ModulePtr> m_autoLoadModules;
|
||||
};
|
||||
|
||||
extern ModuleManager g_modules;
|
||||
|
Reference in New Issue
Block a user