1#include "Modules/ModuleManager.h"
2#include "Utils/Utils.h"
3#include "Data/ApplicationState.h"
13#define MODULE_EXT ".dll"
17#define MODULE_EXT ".so"
24 this->appState = appState;
28void ModuleManager::UnloadModules()
30 for(
Module *module : loadedModules)
34 FreeLibrary((HMODULE)module->nativeHandle);
36 dlclose(module->nativeHandle);
40 loadedModules.clear();
43void ModuleManager::LoadModules()
47 std::string modulesFolder = appState->constants.modulesDir + PATH_SEPARATOR;
48 for (
auto &p : std::filesystem::directory_iterator(modulesFolder))
50 std::string path = p.path().string();
51 if (p.is_directory() && FileExists(path + PATH_SEPARATOR
"module" MODULE_EXT ))
53 LoadModule(path + PATH_SEPARATOR
"module" MODULE_EXT);
58void ModuleManager::LoadModule(std::string path)
61 HINSTANCE dll = LoadLibrary(s2ws(path).c_str());
65 std::cout <<
"Failed to load module: " << path << std::endl;
69 GetModuleFunc getModule = (GetModuleFunc)GetProcAddress(dll,
"GetModule");
73 std::cout <<
"Failed to get module function: " << path << std::endl;
78 std::string uid = GenerateId(32);
79 Module *module = getModule(uid.data(), appState);
85 handle = dlopen(path.data(), RTLD_LAZY);
88 std::cout <<
"Failed to load module: " << path << std::endl;
92 GetModuleFunc getModule = (GetModuleFunc)dlsym(handle,
"GetModule");
95 std::cout <<
"Failed to get module function: " << path << std::endl;
100 std::string uid = GenerateId(32);
101 Module *module = getModule(uid.data(), appState);
108ModuleManager::~ModuleManager()
113void ModuleManager::InstallModule(std::string path)
116 zip_extract(path.data(), (appState->constants.modulesDir + PATH_SEPARATOR + GenerateId(32)).data(), [](
const char* f,
void* arg){
return 1;}, 0);
118 LoadModule(appState->constants.modulesDir + PATH_SEPARATOR + GenerateId(32) + PATH_SEPARATOR
"module" MODULE_EXT);
121void ModuleManager::UninstallModule(std::string uid)
123 if(modules.find(uid) == modules.end())
128 Module *module = modules[uid];
129 modules.erase(modules.find(uid));
130 loadedModules.erase(std::find(loadedModules.begin(), loadedModules.end(), module));
140void ModuleManager::ShowSettings(
bool *pOpen)
142 ImGui::Begin(
"Module Manager##TerraForge3DModuleManager", pOpen);
143 ImGui::Text(
"Currently Installed Modules : %d", loadedModules.size());
145 for(
Module *module : loadedModules)
147 ImGui::PushID(module->
uid.data());
149 if(ImGui::CollapsingHeader(module->
info.
name.data()))
151 ImGui::Text(
"Name : %s", module->
info.
name.data());
154 ImGui::Text(
"Website : %s", module->
info.
website.data());
155 ImGui::Text(
"Contact : %s", module->
info.
contact.data());
156 ImGui::Checkbox(
"Enabled", &module->
isEnabled);
165 void *imguiContext =
static_cast<void *
>(ImGui::GetCurrentContext());
167 for(
Module *module : loadedModules)
173void ModuleManager::UpdateModules()
175 for(
Module *module : loadedModules)
void Update()
Module Update Function.
void RenderImGui(void *imguiContext)
Module ImGui Render Function.
virtual void OnUninstall()
OnUninstall.
std::string versionString