X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcpPlugins%2FInterface.cxx;h=53b7b118174179807139737986a54f5e9a1ed93b;hb=e6bef8234ffd9030c68a6786466a08cf144b7871;hp=b8bffc65b6dc4e2f1f09f0c91ae3065876853b84;hpb=ddc5b66441101ed6584f4972ca0c4d13c588dacf;p=cpPlugins.git diff --git a/lib/cpPlugins/Interface.cxx b/lib/cpPlugins/Interface.cxx index b8bffc6..53b7b11 100644 --- a/lib/cpPlugins/Interface.cxx +++ b/lib/cpPlugins/Interface.cxx @@ -5,6 +5,8 @@ #else // cpPlugins_SYS_WINDOWS # include #endif // cpPlugins_SYS_WINDOWS +#include +#include // ------------------------------------------------------------------------- cpPlugins::Interface:: @@ -27,6 +29,26 @@ GetFilters( ) return( this->m_Filters ); } +// ------------------------------------------------------------------------- +void cpPlugins::Interface:: +GuessAccesiblePlugins( ) +{ + // Load environment configuration + char* path = std::getenv( "cpPlugins_PATHS" ); + if( path != NULL ) + { + std::vector< std::string > tokens; + cpPlugins::TokenizeString( tokens, path, "#" ); + for( auto tIt = tokens.begin( ); tIt != tokens.end( ); ++tIt ) + try { this->LoadPluginDir( *tIt ); } catch( ... ) { } + + } // fi + + // Load local path + auto lpath = cpPlugins::CanonicalPath( "." ); + try { this->LoadPluginDir( lpath ); } catch( ... ) { } +} + // ------------------------------------------------------------------------- bool cpPlugins::Interface:: LoadConfiguration( const std::string& filename ) @@ -38,18 +60,7 @@ LoadConfiguration( const std::string& filename ) this->UnloadAll( ); std::string line; while( std::getline( in, line ) ) - { - try - { - this->LoadPluginFile( line ); - } - catch( ... ) - { - // Do nothing - - } // yrt - - } // elihw + try { this->LoadPluginFile( line ); } catch( ... ) { } return( true ); } @@ -79,6 +90,14 @@ LoadPluginFile( const std::string& filename ) filename + std::string( "\" does not exist." ) ); + + // Check if it was already loaded + if( + this->m_DynLibraries.find( canonical_fn ) != this->m_DynLibraries.end( ) + ) + return; + + // Ok, try to load the library void* hnd = Self::_DLOpen( canonical_fn ); if( hnd == NULL ) throw std::runtime_error( @@ -134,6 +153,39 @@ LoadPluginFile( const std::string& filename ) Self::_DLClose( hnd ); } +// ------------------------------------------------------------------------- +unsigned int cpPlugins::Interface:: +LoadPluginDir( const std::string& dirname ) +{ + DIR* dir; + struct dirent* ent; + unsigned int count = 0; + if( ( dir = opendir( dirname.c_str( ) ) ) != NULL ) + { + while( ( ent = readdir( dir ) ) != NULL ) + { + try + { + this->LoadPluginFile( + dirname + + std::string( "/" ) + + ent->d_name + ); + count++; + } + catch( ... ) { } + + } // elihw + closedir( dir ); + } + else + throw std::runtime_error( + std::string( "cpPlugins::Interface: Could not load directory " ) + + std::string( "\"" ) + dirname + std::string( "\"" ) + ); + return( count ); +} + // ------------------------------------------------------------------------- void cpPlugins::Interface:: UnloadAll( )