#include #include #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(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(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); }