32#include <Pt/System/Api.h>
33#include <Pt/System/SystemError.h>
34#include <Pt/System/Library.h>
64 const std::type_info&
iface()
const
73 virtual const char*
info()
const = 0;
76 const std::type_info* _iface;
96template <
typename Iface>
125template <
typename Class,
typename Iface>
138 {
return new Class; }
146 {
return _feature.c_str(); }
149 virtual const char*
info()
const
150 {
return _info.c_str(); }
153 std::string _feature;
183template <
typename IfaceT,
typename PluginT = Plugin<IfaceT> >
187 typedef typename std::multimap< std::string, PluginT* > PluginMap;
188 typedef typename std::multimap< IfaceT*, PluginT* > InstanceMap;
194 friend class PluginManager;
203 Iterator(
typename PluginMap::const_iterator it)
209 { ++_it;
return *
this; }
213 {
return *(_it->second); }
217 {
return _it->second; }
221 {
return _it == it._it; }
225 {
return _it != it._it; }
229 typename PluginMap::const_iterator _it;
236 : _iface( typeid(IfaceT) )
240 : _iface( typeid(IfaceT) )
245 for(; *plugins != 0; ++plugins)
247 if( (*plugins)->iface() == _iface )
249 PluginT* p = (PluginT*)(*plugins);
261 void loadPlugin(
const std::string& sym,
const Path& path);
273 IfaceT*
create(
const std::string& feature);
286 {
return Iterator( _plugins.begin() ); }
291 {
return Iterator( _plugins.end() ); }
299 InstanceMap& instances()
300 {
return _instances; }
304 const std::type_info& _iface;
307 std::list<Library> _libs;
313 InstanceMap _instances;
317template <
class IfaceT,
typename PluginT >
321 for(
typename InstanceMap::iterator it = _instances.begin(); it != _instances.end(); ++it)
323 it->second->destroy( it->first );
329template <
class IfaceT,
typename PluginT >
334 void* symbol = shlib.
resolve( sym.c_str() );
340 for(; *plugins != 0; ++plugins)
342 if( (*plugins)->iface() == _iface )
344 PluginT* p = (PluginT*)(*plugins);
349 _libs.push_back(shlib);
353template <
class IfaceT,
typename PluginT >
356 typename PluginMap::value_type p(plugin.feature(), &plugin);
361template <
class IfaceT,
typename PluginT >
364 typename PluginMap::iterator it = _plugins.find( plugin.feature() );
365 if( it != _plugins.end() )
372template <
class IfaceT,
typename PluginT >
375 typename PluginMap::iterator it = _plugins.find(feature);
376 if( it == _plugins.end() )
381 PluginT* plugin = it->second;
382 IfaceT* iface = plugin->create();
385 typename InstanceMap::value_type elem(iface, plugin);
386 _instances.insert( elem );
393template <
class IfaceT,
typename PluginT >
396 typename PluginMap::const_iterator it = pit._it;
398 PluginT* plugin = it->second;
399 IfaceT* iface = plugin->create();
402 _instances.insert( std::make_pair(iface, plugin) );
409template <
class IfaceT,
typename PluginT >
412 typename InstanceMap::iterator it = _instances.find(inst);
413 if( it == _instances.end() )
418 it->second->destroy(inst);
419 _instances.erase(it);
virtual const char * feature() const
Returns the plugin feature string.
Definition Plugin.h:145
BasicPlugin(const std::string &feature, const std::string &info=std::string())
Constructs with feature string and info.
Definition Plugin.h:130
Iface * create()
Creates an instance.
Definition Plugin.h:137
virtual const char * info() const
Returns the plugin info string.
Definition Plugin.h:149
void destroy(Iface *instance)
Destroys an instance.
Definition Plugin.h:141
Shared library loader.
Definition Library.h:123
void * resolve(const char *symbol) const
Resolves the symbol symbol from the shared library Returns the address of the symbol or 0 if it was n...
Represents a path in the file-system.
Definition Path.h:48
ID for plugin exports.
Definition Plugin.h:49
virtual ~PluginId()
Destructor.
Definition Plugin.h:59
virtual const char * feature() const =0
Returns the plugin feature string.
PluginId(const std::type_info &iface)
Construct with type info of plugin interface.
Definition Plugin.h:53
virtual const char * info() const =0
Returns the plugin info string.
const std::type_info & iface() const
Returns the type of the plugin interface.
Definition Plugin.h:64
Iterator for loaded plugins.
Definition Plugin.h:193
const PluginId * operator->() const
Access iterator value.
Definition Plugin.h:216
bool operator!=(const Iterator &it) const
Comparison operator.
Definition Plugin.h:224
Iterator()
Default Constructor.
Definition Plugin.h:199
const PluginId & operator*() const
Access iterator value.
Definition Plugin.h:212
bool operator==(const Iterator &it) const
Comparison operator.
Definition Plugin.h:220
Iterator & operator++()
Advances the iterator.
Definition Plugin.h:208
Iterator begin() const
Begin of loaded plugins.
Definition Plugin.h:285
void loadPlugin(const std::string &sym, const Path &path)
Loads plugins from a library.
Definition Plugin.h:330
void unregisterPlugin(PluginT &plugin)
Unregisters a plugin.
Definition Plugin.h:362
Iterator end() const
End of loaded plugins.
Definition Plugin.h:290
void registerPlugin(PluginT &plugin)
Registers a plugin.
Definition Plugin.h:354
PluginManager()
Default Constructor.
Definition Plugin.h:235
void destroy(IfaceT *inst)
Destroys an instance.
Definition Plugin.h:410
IfaceT * create(const std::string &feature)
Creates an instance by name.
Definition Plugin.h:373
~PluginManager()
Destructor.
Definition Plugin.h:318
virtual Iface * create()=0
Creates an instance.
virtual void destroy(Iface *instance)=0
Destroys an instance.
Plugin()
Default Constructor.
Definition Plugin.h:102
SystemError(const std::string &what)
Construct with error message.
System programming
Definition Connection.h:26
Core module.
Definition Allocator.h:33