#include "commonheaders.h" extern std::list plugins; extern PLUGINLINK pluglink; void load_modules() { std::string path = boost::filesystem::initial_path().directory_string(); //need some workaround for windows than called indirectly path.append("/plugins"); logger.log(LM_DEBUG, "Loading plugins...\n"); boost::filesystem::path pth(path); if(!boost::filesystem::is_directory(pth)) return; boost::filesystem::directory_iterator i(pth), end; while(i != end) { if(boost::filesystem::is_directory(*i)) //we not look in subdirectories { ++i; continue; } if(!boost::filesystem::status_known((*i).status())) //worng data { ++i; continue; } bool is_plugin = true; plugin::exported_functions_s *funcs = new plugin::exported_functions_s; ACE_DLL *dll = new ACE_DLL; boost::filesystem::path pth = i->path(); if(dll->open(pth.string().c_str()) != -1) { if((funcs->Load = (load)dll->symbol("load")) == NULL) is_plugin = false; if((funcs->OnModulesLoaded = (on_modules_loaded)dll->symbol("on_modules_loaded")) == NULL) is_plugin = false; if((funcs->Unload = (unload)dll->symbol("unload")) == NULL) is_plugin = false; if((funcs->SetPluginInfo = (set_plugin_info)dll->symbol("set_plugin_info")) == NULL) is_plugin = false; } if(!is_plugin) { delete funcs; delete dll; continue; } PLUGININFO *info = funcs->SetPluginInfo(); plugins.push_back(new plugin(dll, info, funcs)); ++i; } } void run_plugins() { //now for testing only if(!plugins.empty()) { std::list::iterator end = plugins.end(); for(std::list::iterator i = plugins.begin(); i != end; ++i) { boost::thread *thr; thr = new boost::thread(boost::bind((*i)->get_exported_functions()->Load, &pluglink)); thr->timed_join(boost::posix_time::seconds(10)); delete thr; thr = new boost::thread(boost::bind((*i)->get_exported_functions()->OnModulesLoaded)); thr->timed_join(boost::posix_time::seconds(15)); delete thr; } } } plugin::plugin(ACE_DLL *lib, PLUGININFO *info, exported_functions_s *funcs) { if(lib) plug = lib; else plug = NULL; if(info) plugininfo = info; else plugininfo = NULL; if(funcs) exported_funcs = funcs; else exported_funcs = NULL; } plugin::~plugin() { if(plug) delete plug; if(exported_funcs) delete exported_funcs; } const plugin::exported_functions_s* plugin::get_exported_functions() { return exported_funcs; }