$search
00001 #ifndef TYPELIB_PLUGINMANAGER_HH 00002 #define TYPELIB_PLUGINMANAGER_HH 00003 00004 #include <map> 00005 #include <string> 00006 #include <vector> 00007 #include <utilmm/singleton/use.hh> 00008 #include <utilmm/configfile/configset.hh> 00009 #include <stdexcept> 00010 00011 namespace Typelib 00012 { 00013 class Registry; 00014 00015 class Exporter; 00016 class ExportPlugin; 00017 00018 class Importer; 00019 class ImportPlugin; 00020 00021 class TypeDefinitionPlugin; 00022 00024 struct PluginNotFound : std::runtime_error 00025 { 00026 PluginNotFound() : std::runtime_error("plugin not found") { } 00027 }; 00028 00030 struct ExportError : std::runtime_error 00031 { 00032 ExportError(std::string const& msg) : std::runtime_error(msg) {} 00033 }; 00034 00048 class PluginManager 00049 { 00050 std::map<std::string, ExportPlugin*> m_exporters; 00051 std::map<std::string, ImportPlugin*> m_importers; 00052 std::vector<TypeDefinitionPlugin*> m_definition_plugins; 00053 std::vector<void*> m_library_handles; 00054 bool loadPlugin(std::string const& path); 00055 00056 typedef void (*PluginEntryPoint)(PluginManager&); 00057 00058 PluginManager(); 00059 ~PluginManager(); 00060 00061 public: 00063 bool add(ExportPlugin* plugin); 00064 00067 Importer* importer(std::string const& name) const; 00068 00070 bool add(ImportPlugin* plugin); 00071 00074 Exporter* exporter(std::string const& name) const; 00075 00080 void add(TypeDefinitionPlugin* plugin); 00081 00084 void registerPluginTypes(Registry& registry); 00085 00089 static std::string save 00090 ( std::string const& kind 00091 , Registry const& registry); 00092 00095 static std::string save 00096 ( std::string const& kind 00097 , utilmm::config_set const& config 00098 , Registry const& registry); 00099 00103 static void save 00104 ( std::string const& kind 00105 , Registry const& registry 00106 , std::ostream& into); 00107 00117 static void save 00118 ( std::string const& kind 00119 , utilmm::config_set const& config 00120 , Registry const& registry 00121 , std::ostream& into); 00122 00125 static Registry* load 00126 ( std::string const& kind 00127 , std::istream& stream ); 00128 00131 static void load 00132 ( std::string const& kind 00133 , std::istream& stream 00134 , Registry& into ); 00135 00139 static Registry* load 00140 ( std::string const& kind 00141 , std::string const& file ); 00142 00146 static void load 00147 ( std::string const& kind 00148 , std::string const& file 00149 , Registry& into ); 00150 00151 00154 static Registry* load 00155 ( std::string const& kind 00156 , std::istream& stream 00157 , utilmm::config_set const& config ); 00158 00161 static void load 00162 ( std::string const& kind 00163 , std::istream& stream 00164 , utilmm::config_set const& config 00165 , Registry& into ); 00166 00170 static Registry* load 00171 ( std::string const& kind 00172 , std::string const& file 00173 , utilmm::config_set const& config ); 00174 00178 static void load 00179 ( std::string const& kind 00180 , std::string const& file 00181 , utilmm::config_set const& config 00182 , Registry& into ); 00183 00187 typedef utilmm::singleton::use<PluginManager> self; 00188 00189 private: 00190 friend class utilmm::singleton::wrapper<PluginManager>; 00191 }; 00192 } 00193 00194 #endif 00195