1 #include <cpPlugins/Interface/Interface.h>
6 #include <Pluma/Pluma.hpp>
9 # define PLUGIN_PREFIX ""
10 # define PLUGIN_EXT ".dll"
12 # define PLUGIN_PREFIX "lib"
13 # define PLUGIN_EXT ".so"
15 #define PLUGIN_CONFIG_FILE "plugins.cfg"
23 bool operator()( char c ) const
26 return( c == '\\' || c == '/' );
37 // -------------------------------------------------------------------------
38 cpPlugins::Interface::Interface::
41 this->m_Pluma = new pluma::Pluma( );
42 this->m_Pluma->acceptProviderType< ProcessObjectProvider >( );
45 // -------------------------------------------------------------------------
46 cpPlugins::Interface::Interface::
53 // -------------------------------------------------------------------------
54 bool cpPlugins::Interface::Interface::
55 LoadDefaultConfiguration( const std::string& path )
57 std::ifstream file( PLUGIN_CONFIG_FILE );
61 while( file.getline( buffer, 1000 ) )
63 // std::string line( buffer );
64 std::istringstream line( buffer );
65 std::string name, folder;
66 std::getline( line, name, '@' );
67 std::getline( line, folder, '@' );
68 std::stringstream path;
69 path << folder << "/" << PLUGIN_PREFIX << name << PLUGIN_EXT;
70 this->Load( path.str( ) );
81 // -------------------------------------------------------------------------
82 bool cpPlugins::Interface::Interface::
83 SaveDefaultConfiguration( const std::string& path )
85 std::ofstream file( PLUGIN_CONFIG_FILE );
88 auto pIt = this->m_LoadedPlugins.begin( );
89 for( ; pIt != this->m_LoadedPlugins.end( ); ++pIt )
91 auto fIt = pIt->second.begin( );
92 for( ; fIt != pIt->second.end( ); ++fIt )
93 file << *fIt << "@" << pIt->first << std::endl;
103 // -------------------------------------------------------------------------
104 cpPlugins::Interface::Interface::
105 TClasses& cpPlugins::Interface::Interface::
108 return( this->m_Classes );
111 // -------------------------------------------------------------------------
112 const cpPlugins::Interface::Interface::
113 TClasses& cpPlugins::Interface::Interface::
116 return( this->m_Classes );
119 // -------------------------------------------------------------------------
120 cpPlugins::Interface::Interface::
121 TLoadedPlugins& cpPlugins::Interface::Interface::
124 return( this->m_LoadedPlugins );
127 // -------------------------------------------------------------------------
128 const cpPlugins::Interface::Interface::
129 TLoadedPlugins& cpPlugins::Interface::Interface::
130 GetLoadedPlugins( ) const
132 return( this->m_LoadedPlugins );
135 // -------------------------------------------------------------------------
136 cpPlugins::Interface::ProcessObject::Pointer
137 cpPlugins::Interface::Interface::
138 CreateObject( const std::string& name ) const
140 cpPlugins::Interface::ProcessObject::Pointer po = NULL;
141 auto catIt = this->m_Classes.begin( );
142 while( catIt != this->m_Classes.end( ) )
144 auto classIt = catIt->second.find( name );
145 if( classIt != catIt->second.end( ) )
147 ProcessObjectProvider* provider =
148 dynamic_cast< ProcessObjectProvider* >(
149 this->m_Providers[ classIt->second ]
151 if( provider != NULL )
153 po = provider->create( );
157 catIt = this->m_Classes.end( );
167 // -------------------------------------------------------------------------
168 bool cpPlugins::Interface::Interface::
169 Load( const std::string& path )
174 ret = this->m_Pluma->load( path );
177 std::string folder, name;
178 Self::_SepFName( path, folder, name );
179 this->m_LoadedPlugins[ folder ].push_back( name );
180 this->_LoadClasses( );
192 // -------------------------------------------------------------------------
193 bool cpPlugins::Interface::Interface::
194 Load( const std::string& folder, const std::string& name )
196 std::string real_folder = folder;
198 if( sep( folder[ folder.size( ) - 1 ] ) )
199 real_folder = folder.substr( 0, folder.size( ) - 1 );
203 TCHAR buffer[4096]=TEXT("");
204 TCHAR buf[4096]=TEXT("");
205 TCHAR** lppPart={NULL};
206 // Retrieve the full path name for a file.
207 // The file does not need to exist.
208 retval = GetFullPathName(folder.c_str( ),
212 real_folder = buffer;
214 real_folder = std::string( realpath( real_folder.c_str( ), NULL ) );
219 ret = this->m_Pluma->load( real_folder, name );
222 // Update loaded plugins
223 std::string prefix( PLUGIN_PREFIX );
224 std::string ext( PLUGIN_EXT );
225 std::string real_name = name;
227 real_name.replace( real_name.find( prefix ), prefix.size( ), "" );
228 real_name.replace( real_name.find( ext ), ext.size( ), "" );
229 this->m_LoadedPlugins[ real_folder ].push_back( real_name );
230 this->_LoadClasses( );
242 // -------------------------------------------------------------------------
243 bool cpPlugins::Interface::Interface::
244 LoadFromFolder( const std::string& folder, bool r )
248 std::list< std::string > f = this->m_Pluma->loadFromFolder( folder, r );
251 // Update loaded plugins
252 for( auto i = f.begin( ); i != f.end( ); ++i )
254 std::string folder, name;
255 Self::_SepFName( *i, folder, name );
256 this->m_LoadedPlugins[ folder ].push_back( name );
261 this->_LoadClasses( );
274 // -------------------------------------------------------------------------
275 bool cpPlugins::Interface::Interface::
276 Unload( const std::string& name )
281 ret = this->m_Pluma->unload( name );
284 this->m_Providers.clear( );
285 this->m_Classes.clear( );
287 // TODO: this->m_LoadedPlugins
289 this->_LoadClasses( );
301 // -------------------------------------------------------------------------
302 void cpPlugins::Interface::Interface::
307 this->m_Pluma->unloadAll( );
314 this->m_Providers.clear( );
315 this->m_Classes.clear( );
316 this->m_LoadedPlugins.clear( );
319 // -------------------------------------------------------------------------
320 bool cpPlugins::Interface::Interface::
321 IsLoaded( const std::string& name ) const
323 return( this->m_Pluma->isLoaded( name ) );
326 // -------------------------------------------------------------------------
327 void cpPlugins::Interface::Interface::
330 this->m_Providers.clear( );
331 this->m_Classes.clear( );
332 this->m_Pluma->getProviders( this->m_Providers );
334 // Get reader provider
335 for( unsigned int i = 0; i < this->m_Providers.size( ); ++i )
337 ProcessObject::Pointer d = this->m_Providers[ i ]->create( );
338 this->m_Classes[ d->GetClassCategory( ) ][ d->GetClassName( ) ] = i;
343 // -------------------------------------------------------------------------
344 void cpPlugins::Interface::Interface::
345 _SepFName( const std::string& path, std::string& folder, std::string& name )
350 std::string real_path = "";
354 TCHAR buffer[4096]=TEXT("");
355 TCHAR buf[4096]=TEXT("");
356 TCHAR** lppPart={NULL};
357 // Retrieve the full path name for a file.
358 // The file does not need to exist.
359 retval = GetFullPathName(path.c_str( ),
365 real_path = std::string( realpath( path.c_str( ), NULL ) );
370 std::find_if( real_path.rbegin( ), real_path.rend( ), sep ).base( ),
374 // Get containing folder
376 folder.replace( folder.find( name ), name.size( ), "" );
377 if( sep( folder[ folder.size( ) - 1 ] ) )
378 folder = folder.substr( 0, folder.size( ) - 1 );
380 // Erase prefix and extension from filename
381 std::string prefix( PLUGIN_PREFIX );
382 std::string ext( PLUGIN_EXT );
384 name.replace( name.find( prefix ), prefix.size( ), "" );
385 name.replace( name.find( ext ), ext.size( ), "" );