OpenRTM-aist  2.1.0
ModuleManager.h
[詳解]
1 // -*- C++ -*-
20 #ifndef RTC_MODULEMANAGER_H
21 #define RTC_MODULEMANAGER_H
22 
23 
24 // ACE includes
25 #include <coil/DynamicLib.h>
26 
27 // RTC includes
28 #include <rtm/Manager.h>
29 #include <coil/Properties.h>
30 #include <rtm/ObjectManager.h>
31 
32 // STL includes
33 #include <string>
34 #include <utility>
35 #include <vector>
36 #include <map>
37 
38 #define CONFIG_EXT "manager.modules.config_ext"
39 #define CONFIG_PATH "manager.modules.config_path"
40 #define DETECT_MOD "manager.modules.detect_loadable"
41 #define MOD_LOADPTH "manager.modules.load_path"
42 #define INITFUNC_SFX "manager.modules.init_func_suffix"
43 #define INITFUNC_PFX "manager.modules.init_func_prefix"
44 #define ALLOW_ABSPATH "manager.modules.abs_path_allowed"
45 #define ALLOW_URL "manager.modules.download_allowed"
46 #define MOD_DWNDIR "manager.modules.download_dir"
47 #define MOD_DELMOD "manager.modules.download_cleanup"
48 #define MOD_PRELOAD "manager.modules.preload"
49 
50 namespace RTC
51 {
72  {
73  using vProperties = std::vector<coil::Properties>;
74  public:
97 
110 
118  struct Error
119  {
120  explicit Error(std::string _reason)
121  : reason(std::move(_reason)) {}
122  std::string reason;
123  };
124 
133  struct NotFound
134  {
135  explicit NotFound(std::string _name)
136  : name(std::move(_name)) {}
137  std::string name;
138  };
139 
149  : public NotFound
150  {
151  explicit FileNotFound(const std::string& _name)
152  : NotFound(_name) {}
153  };
154 
164  : public NotFound
165  {
166  explicit ModuleNotFound(const std::string& _name)
167  : NotFound(_name) {}
168  };
169 
179  : public NotFound
180  {
181  explicit SymbolNotFound(const std::string& _name)
182  : NotFound(_name) {}
183  };
184 
194  : public Error
195  {
196  explicit NotAllowedOperation(const std::string& _reason)
197  : Error(_reason) {}
198  };
199 
209  : public Error
210  {
211  explicit InvalidArguments(const std::string& _reason)
212  : Error(_reason) {}
213  };
214 
224  : public Error
225  {
226  explicit InvalidOperation(const std::string& _reason)
227  : Error(_reason) {}
228  };
229  using ModuleInitFunc = void (*)(Manager*);
230 
276  std::string load(const std::string& file_name);
328  std::string load(coil::Properties& prop);
329 
330 
358  std::string load(const std::string& file_name,
359  const std::string& init_func);
391  std::string load(coil::Properties& prop,
392  const std::string& init_func);
393 
394 
412  void unload(const std::string& file_name);
413 
427  void unloadAll();
428 
436  void* symbol(const std::string& file_name, const std::string& func_name);
437 
455  void setLoadpath(const std::vector<std::string>& load_path);
456 
474  inline std::vector<std::string> getLoadPath()
475  {
476  return m_loadPath;
477  }
478 
496  void addLoadpath(const std::vector<std::string>& load_path);
497 
515  std::vector<coil::Properties> getLoadedModules();
516 
535  std::vector<coil::Properties> getLoadableModules();
536 
550  inline void allowAbsolutePath()
551  {
552  m_absoluteAllowed = true;
553  }
554 
568  inline void disallowAbsolutePath()
569  {
570  m_absoluteAllowed = false;
571  }
572 
590  inline void allowModuleDownload()
591  {
592  m_downloadAllowed = true;
593  }
594 
609  {
610  m_downloadAllowed = false;
611  }
612 
636  std::string findFile(const std::string& fname,
637  const std::vector<std::string>& load_path);
638 
660  bool fileExist(const std::string& filename);
661 
683  std::string getInitFuncName(const std::string& file_path);
684 
685  protected:
694 
702  void getModuleList(const std::string& lang, coil::vstring& modules);
703 
711  void addNewFile(const std::string& fpath, coil::vstring& modules, const std::string& lang);
712 
720  void getModuleProfiles(const std::string& lang,
721  const coil::vstring& modules, vProperties& modprops);
722 
731 
739  struct DLLEntity
740  {
742  coil::DynamicLib dll;
743  };
744 
745  using StringVector = std::vector<std::string>;
746  using StringVectorItr = StringVector::iterator;
747  using StringVectorConstItr = StringVector::const_iterator;
748 
749  using DllMap = std::vector<DLLEntity>;
750  using DllMapItr = DllMap::iterator;
751  using DllMapConstItr = DllMap::const_iterator;
752 
753 
762 
770  class DllPred
771  {
772  std::string m_filepath;
773  public:
774  explicit DllPred(const char* filepath)
775  {
776  m_filepath = coil::replaceString(filepath, "\\", "/");
777  m_filepath = coil::replaceString(m_filepath, "//", "/");
778  }
779  explicit DllPred(const DLLEntity* dll)
780  {
781  m_filepath = coil::replaceString(dll->properties["file_path"], "\\", "/");
782  m_filepath = coil::replaceString(m_filepath, "//", "/");
783  }
784  bool operator()(DLLEntity* dllentity)
785  {
786  std::string file_path = coil::replaceString(
787  dllentity->properties.getProperty("file_path"), "\\", "/");
788  file_path = coil::replaceString(file_path, "//", "/");
789  return m_filepath == file_path;
790  }
791  };
800 
833 
841  std::string m_initFuncSuffix;
842 
850  std::string m_initFuncPrefix;
851 
859  coil::vstring m_supported_languages;
860 
869  {
870  public:
871  UnloadPred() = default;
873  {
874  dll->dll.close();
875  delete dll;
876  }
877  };
878 
879  vProperties m_modprofs;
880  std::map<std::string, coil::vstring> m_loadfailmods;
881 
882  }; // class ModuleManager
883 } // namespace RTC
884 
885 #endif // RTC_MODULEMANAGER_H
-*- C++ -*-
Object management class
オブジェクト管理用クラス
Definition: ObjectManager.h:52
Logger クラス
Definition: SystemLogger.h:101
Manager クラス
Definition: Manager.h:91
ロード済みモジュールリスト
Definition: ModuleManager.h:771
DllPred(const char *filepath)
Definition: ModuleManager.h:774
DllPred(const DLLEntity *dll)
Definition: ModuleManager.h:779
bool operator()(DLLEntity *dllentity)
Definition: ModuleManager.h:784
モジュールアンロードファンクタ
Definition: ModuleManager.h:869
void operator()(DLLEntity *dll)
Definition: ModuleManager.h:872
モジュールマネージャクラス
Definition: ModuleManager.h:72
void(*)(Manager *) ModuleInitFunc
Definition: ModuleManager.h:229
StringVector m_loadPath
モジュール・ロード・パス・リスト
Definition: ModuleManager.h:808
std::string m_initFuncPrefix
初期実行関数プリフィックス
Definition: ModuleManager.h:850
std::vector< std::string > getLoadPath()
モジュールロードパスを取得する
Definition: ModuleManager.h:474
void addLoadpath(const std::vector< std::string > &load_path)
モジュールロードパスを追加する
std::string load(const std::string &file_name)
モジュールのロード
StringVector::iterator StringVectorItr
Definition: ModuleManager.h:746
std::string load(coil::Properties &prop, const std::string &init_func)
モジュールのロード、初期化
void disallowAbsolutePath()
モジュールの絶対パス指定禁止
Definition: ModuleManager.h:568
void unload(const std::string &file_name)
モジュールのアンロード
std::map< std::string, coil::vstring > m_loadfailmods
Definition: ModuleManager.h:880
ObjectManager< const char *, DLLEntity, DllPred > m_modules
ロード済みモジュールリスト
Definition: ModuleManager.h:799
ModuleManager(coil::Properties &prop)
コンストラクタ
void allowAbsolutePath()
モジュールの絶対パス指定許可
Definition: ModuleManager.h:550
coil::vstring m_supported_languages
サポートするRTCの実装言語
Definition: ModuleManager.h:859
std::string load(const std::string &file_name, const std::string &init_func)
モジュールのロード、初期化
void * symbol(const std::string &file_name, const std::string &func_name)
モジュールのシンボルの参照
void getModuleProfiles(const std::string &lang, const coil::vstring &modules, vProperties &modprops)
指定言語、ファイルリストからモジュールのプロパティを返す
std::vector< DLLEntity > DllMap
Definition: ModuleManager.h:749
DllMap::iterator DllMapItr
Definition: ModuleManager.h:750
void disallowModuleDownload()
モジュールのURL指定禁止
Definition: ModuleManager.h:608
std::string findFile(const std::string &fname, const std::vector< std::string > &load_path)
LoadPath からのファイルの検索
void removeInvalidModules()
無効なモジュールプロファイルを削除する
std::string getInitFuncName(const std::string &file_path)
初期化関数シンボルを生成する
bool m_absoluteAllowed
モジュール絶対パス指定許可フラグ
Definition: ModuleManager.h:832
std::vector< coil::Properties > getLoadableModules()
ロード可能モジュールリストを取得する
void addNewFile(const std::string &fpath, coil::vstring &modules, const std::string &lang)
キャッシュに無いパスだけmodulesに追加する
void allowModuleDownload()
モジュールのURL指定許可
Definition: ModuleManager.h:590
void unloadAll()
全モジュールのアンロード
DllMap::const_iterator DllMapConstItr
Definition: ModuleManager.h:751
void setLoadpath(const std::vector< std::string > &load_path)
モジュールロードパスを指定する
coil::Properties & m_properties
Module Manager プロパティ
Definition: ModuleManager.h:761
void getModuleList(const std::string &lang, coil::vstring &modules)
指定言語におけるロードパス上のローダブルなファイルリストを返す
bool m_downloadAllowed
モジュールURL指定許可フラグ
Definition: ModuleManager.h:824
bool fileExist(const std::string &filename)
ファイルが存在するかどうかのチェック
StringVector::const_iterator StringVectorConstItr
Definition: ModuleManager.h:747
std::string m_initFuncSuffix
初期実行関数サフィックス
Definition: ModuleManager.h:841
StringVector m_configPath
コンフィギュレーション・パス・リスト
Definition: ModuleManager.h:816
std::vector< coil::Properties > getLoadedModules()
ロード済みのモジュールリストを取得する
~ModuleManager()
デストラクタ
vProperties m_modprofs
Definition: ModuleManager.h:879
std::vector< std::string > StringVector
Definition: ModuleManager.h:745
std::string load(coil::Properties &prop)
モジュールのロード
Logger rtclog
ロガーストリーム
Definition: ModuleManager.h:730
RTコンポーネント
coil::Properties Properties
Definition: RTC.h:72
DLL管理用構造体
Definition: ModuleManager.h:740
coil::Properties properties
Definition: ModuleManager.h:741
coil::DynamicLib dll
Definition: ModuleManager.h:742
ファイル・オープン失敗例外処理用構造体
Definition: ModuleManager.h:119
std::string reason
Definition: ModuleManager.h:122
Error(std::string _reason)
Definition: ModuleManager.h:120
指定ファイル不明例外処理用構造体
Definition: ModuleManager.h:150
FileNotFound(const std::string &_name)
Definition: ModuleManager.h:151
指定引数不正時例外処理用構造体
Definition: ModuleManager.h:210
InvalidArguments(const std::string &_reason)
Definition: ModuleManager.h:211
指定操作不正時例外処理用構造体
Definition: ModuleManager.h:225
InvalidOperation(const std::string &_reason)
Definition: ModuleManager.h:226
指定モジュール不明例外処理用構造体
Definition: ModuleManager.h:165
ModuleNotFound(const std::string &_name)
Definition: ModuleManager.h:166
指定操作禁止時例外処理用構造体
Definition: ModuleManager.h:195
NotAllowedOperation(const std::string &_reason)
Definition: ModuleManager.h:196
未実装部,指定モジュール不明例外処理用構造体
Definition: ModuleManager.h:134
std::string name
Definition: ModuleManager.h:137
NotFound(std::string _name)
Definition: ModuleManager.h:135
指定シンボル不明例外処理用構造体
Definition: ModuleManager.h:180
SymbolNotFound(const std::string &_name)
Definition: ModuleManager.h:181