Introduce MBFT::Module and MBFT::ModuleAPI
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
#include <iostream>
|
||||
|
||||
#include <dlfcn.h>
|
||||
|
||||
#include "modules/Module.h"
|
||||
|
||||
MBFT::Module::Module(const std::string& module_path)
|
||||
: module_path(module_path)
|
||||
{
|
||||
load();
|
||||
}
|
||||
|
||||
MBFT::Module::~Module(void)
|
||||
{
|
||||
unload();
|
||||
}
|
||||
|
||||
void MBFT::Module::load(void) {
|
||||
if (module_shared_object != nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
module_shared_object = dlopen(module_path.c_str(), RTLD_NOW);
|
||||
|
||||
if (module_shared_object == NULL)
|
||||
{
|
||||
std::cout << __FILE__ << ": Failed to open library " << module_path << "\n";
|
||||
std::cout << __FILE__ << ": " << dlerror() << "\n";
|
||||
module_shared_object = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
loaded_init = reinterpret_cast<void(*)(void)>(dlsym(module_shared_object, "init"));
|
||||
if (loaded_init == NULL)
|
||||
{
|
||||
std::cout << __FILE__ << ": No function init() in " << module_path << "\n";
|
||||
loaded_init = nullptr;
|
||||
}
|
||||
|
||||
loaded_process = reinterpret_cast<void(*)(MBFT::ModuleAPI&, const MBFT::InboundMessage&)>(dlsym(module_shared_object, "process"));
|
||||
if (loaded_process == NULL)
|
||||
{
|
||||
std::cout << __FILE__ << ": No function process() in " << module_path << "\n";
|
||||
loaded_process = nullptr;
|
||||
}
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
void MBFT::Module::unload(void)
|
||||
{
|
||||
if (module_shared_object == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
dlclose(module_shared_object);
|
||||
module_shared_object = nullptr;
|
||||
|
||||
loaded_init = nullptr;
|
||||
loaded_process = nullptr;
|
||||
}
|
||||
|
||||
void MBFT::Module::reload(void)
|
||||
{
|
||||
unload();
|
||||
load();
|
||||
}
|
||||
|
||||
void MBFT::Module::disable(void)
|
||||
{
|
||||
enabled = false;
|
||||
}
|
||||
|
||||
void MBFT::Module::enable(void)
|
||||
{
|
||||
enabled = true;
|
||||
}
|
||||
|
||||
void MBFT::Module::init(void)
|
||||
{
|
||||
if (loaded_init == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
loaded_init();
|
||||
}
|
||||
|
||||
void MBFT::Module::process(MBFT::ModuleAPI& api, const MBFT::InboundMessage& message)
|
||||
{
|
||||
if (!enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (loaded_process == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
loaded_process(api, message);
|
||||
}
|
||||
Reference in New Issue
Block a user