00001
00020 #ifndef RTC_MODULEMANAGER_H
00021 #define RTC_MODULEMANAGER_H
00022
00023
00024 #include <string>
00025 #include <vector>
00026 #include <map>
00027
00028
00029 #include <coil/DynamicLib.h>
00030
00031
00032 #include <rtm/Manager.h>
00033 #include <coil/Properties.h>
00034 #include <rtm/ObjectManager.h>
00035
00036
00037 #define CONFIG_EXT "manager.modules.config_ext"
00038 #define CONFIG_PATH "manager.modules.config_path"
00039 #define DETECT_MOD "manager.modules.detect_loadable"
00040 #define MOD_LOADPTH "manager.modules.load_path"
00041 #define INITFUNC_SFX "manager.modules.init_func_suffix"
00042 #define INITFUNC_PFX "manager.modules.init_func_prefix"
00043 #define ALLOW_ABSPATH "manager.modules.abs_path_allowed"
00044 #define ALLOW_URL "manager.modules.download_allowed"
00045 #define MOD_DWNDIR "manager.modules.download_dir"
00046 #define MOD_DELMOD "manager.modules.download_cleanup"
00047 #define MOD_PRELOAD "manager.modules.preload"
00048
00049 #ifdef WIN32
00050 #pragma warning( disable : 4290 )
00051 #endif
00052
00053 namespace RTC
00054 {
00074 class ModuleManager
00075 {
00076 typedef std::vector<coil::Properties> vProperties;
00077 public:
00099 ModuleManager(coil::Properties& prop);
00100
00112 ~ModuleManager(void);
00113
00121 struct Error
00122 {
00123 Error(const std::string& _reason)
00124 : reason(_reason) {}
00125 std::string reason;
00126 };
00127
00136 struct NotFound
00137 {
00138 NotFound(const std::string& _name)
00139 : name(_name) {}
00140 std::string name;
00141 };
00142
00151 struct FileNotFound
00152 : public NotFound
00153 {
00154 FileNotFound(const std::string& _name)
00155 : NotFound(_name) {}
00156 };
00157
00166 struct ModuleNotFound
00167 : public NotFound
00168 {
00169 ModuleNotFound(const std::string& _name)
00170 : NotFound(_name) {}
00171 };
00172
00181 struct SymbolNotFound
00182 : public NotFound
00183 {
00184 SymbolNotFound(const std::string& _name)
00185 : NotFound(_name) {}
00186 };
00187
00196 struct NotAllowedOperation
00197 : public Error
00198 {
00199 NotAllowedOperation(const std::string& _reason)
00200 : Error(_reason) {}
00201 };
00202
00211 struct InvalidArguments
00212 : public Error
00213 {
00214 InvalidArguments(const std::string& _reason)
00215 : Error(_reason) {}
00216 };
00217
00226 struct InvalidOperation
00227 : public Error
00228 {
00229 InvalidOperation(const std::string& _reason)
00230 : Error(_reason) {}
00231 };
00232 typedef void (*ModuleInitFunc)(Manager*);
00233
00279 std::string load(const std::string& file_name);
00280
00308 std::string load(const std::string& file_name,
00309 const std::string& init_func);
00310
00328 void unload(const std::string& file_name);
00329
00343 void unloadAll();
00344
00352 void* symbol(const std::string& file_name, const std::string& func_name)
00353 throw (ModuleNotFound, SymbolNotFound);
00354
00372 void setLoadpath(const std::vector<std::string>& load_path);
00373
00391 inline std::vector<std::string> getLoadPath()
00392 {
00393 return m_loadPath;
00394 }
00395
00413 void addLoadpath(const std::vector<std::string>& load_path);
00414
00432 std::vector<coil::Properties> getLoadedModules();
00433
00452 std::vector<coil::Properties> getLoadableModules();
00453
00467 inline void allowAbsolutePath()
00468 {
00469 m_absoluteAllowed = true;
00470 }
00471
00485 inline void disallowAbsolutePath()
00486 {
00487 m_absoluteAllowed = false;
00488 }
00489
00507 inline void allowModuleDownload()
00508 {
00509 m_downloadAllowed = true;
00510 }
00511
00525 inline void disallowModuleDownload()
00526 {
00527 m_downloadAllowed = false;
00528 }
00529
00553 std::string findFile(const std::string& fname,
00554 const std::vector<std::string>& load_path);
00555
00577 bool fileExist(const std::string& filename);
00578
00600 std::string getInitFuncName(const std::string& file_path);
00601
00602 protected:
00610 void removeInvalidModules();
00611
00619 void getModuleList(const std::string& lang, coil::vstring& modules);
00620
00628 void addNewFile(const std::string& fpath, coil::vstring& modules);
00629
00637 void getModuleProfiles(const std::string& lang,
00638 const coil::vstring& modules, vProperties& modprops);
00639
00647 Logger rtclog;
00648
00656 struct DLLEntity
00657 {
00658 coil::Properties properties;
00659 coil::DynamicLib dll;
00660 };
00661
00662 typedef std::vector<std::string> StringVector;
00663 typedef StringVector::iterator StringVectorItr;
00664 typedef StringVector::const_iterator StringVectorConstItr;
00665
00666 typedef std::vector<DLLEntity> DllMap;
00667 typedef DllMap::iterator DllMapItr;
00668 typedef DllMap::const_iterator DllMapConstItr;
00669
00670
00678 coil::Properties& m_properties;
00679
00687 class DllPred
00688 {
00689 std::string m_filepath;
00690 public:
00691 DllPred(const char* filepath) : m_filepath(filepath) {}
00692 DllPred(const DLLEntity* dll) : m_filepath(dll->properties["file_path"]) {}
00693 bool operator()(DLLEntity* dllentity)
00694 {
00695 return m_filepath == dllentity->properties.getProperty("file_path");
00696 }
00697 };
00705 ObjectManager<const char*, DLLEntity, DllPred> m_modules;
00706
00714 StringVector m_loadPath;
00722 StringVector m_configPath;
00730 bool m_downloadAllowed;
00738 bool m_absoluteAllowed;
00739
00747 std::string m_initFuncSuffix;
00748
00756 std::string m_initFuncPrefix;
00757
00765 class UnloadPred
00766 {
00767 public:
00768 UnloadPred(){}
00769 void operator()(DLLEntity* dll)
00770 {
00771 dll->dll.close();
00772 delete dll;
00773 }
00774 };
00775
00776 vProperties m_modprofs;
00777
00778 };
00779 };
00780
00781 #ifdef WIN32
00782 #pragma warning( default : 4290 )
00783 #endif
00784
00785 #endif // RTC_MODULEMANAGER_H