]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Manager.cxx
Moved to version 1.0
[cpPlugins.git] / lib / cpPlugins / Manager.cxx
diff --git a/lib/cpPlugins/Manager.cxx b/lib/cpPlugins/Manager.cxx
new file mode 100644 (file)
index 0000000..4705928
--- /dev/null
@@ -0,0 +1,177 @@
+// =========================================================================
+// @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co)
+// =========================================================================
+
+#include <cpPlugins/Manager.h>
+
+#include <cstdlib>
+#include <boost/filesystem.hpp>
+#include <boost/tokenizer.hpp>
+#include <cpPlugins/ProcessObject.h>
+
+// -------------------------------------------------------------------------
+namespace cpPlugins
+{
+  bool                Manager::m_Configured = false;
+  Manager::TLibraries Manager::m_Libraries;
+  Manager::TPlugins   Manager::m_Plugins;
+} // end namespace
+
+// -------------------------------------------------------------------------
+cpPlugins::Manager::
+Manager( )
+{
+}
+
+// -------------------------------------------------------------------------
+cpPlugins::Manager::
+~Manager( )
+{
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Manager::
+Print( std::ostream& out ) const
+{
+  out
+    << "----------------------------------------------" << std::endl
+    << " *** cpPlugins::Interface::Manager ***" << std::endl
+    << "  * Reachable plugins:" << std::endl << std::endl;
+  for( const TLibraries::value_type& l: this->m_Libraries )
+  {
+    out << "    + " << l.first << std::endl;
+    out << "      --> Library:" << l.second.GetPath( ) << std::endl;
+    out << "      --> Loadable objects:" << std::endl;
+    for( const std::string& o: l.second.GetContents( ) )
+      out << "        > " << o << std::endl;
+    out << std::endl;
+  } // end for
+  out << "----------------------------------------------";
+}
+
+// -------------------------------------------------------------------------
+const cpPlugins::Manager::
+TPlugins& cpPlugins::Manager::
+GetPlugins( ) const
+{
+  return( Self::m_Plugins );
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Manager::
+Configure( )
+{
+  static const std::string paths[] =
+  {
+    cpPlugins_ENV,
+    "LD_LIBRARY_PATH",
+    "PATH",
+    "Path",
+    "DYLD_LIBRARY_PATH"
+  };
+  static const unsigned int paths_count = 4;
+  if( !Self::m_Configured )
+  {
+    this->AddPath( "." );
+    for( unsigned int i = 0; i < paths_count; ++i )
+    {
+      const char* env_p = std::getenv( paths[ i ].c_str( ) );
+      if( env_p != NULL )
+      {
+        std::string str = env_p;
+        typedef boost::char_separator< char > _TSep;
+        typedef boost::tokenizer< _TSep > _TTok;
+        _TSep sep{ cpPlugins_ENV_SEP };
+        _TTok tokens{ str, sep };
+        for( const std::string& t: tokens )
+          this->AddPath( t );
+      } // end if
+    } // end for
+    Self::m_Configured = true;
+  } // end if
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Manager::
+AddPath( const std::string& p )
+{
+  namespace bf = boost::filesystem;
+
+  try
+  {
+    bf::path cp = bf::canonical( bf::path( p ) );
+    if( bf::is_directory( cp ) )
+    {
+      bf::directory_iterator dIt( cp );
+      for( ; dIt != bf::directory_iterator( ); ++dIt )
+      {
+        if( dIt->path( ).extension( ).string( ) == cpPlugins_EXT )
+          this->AddFile( dIt->path( ).string( ) );
+      } // end for
+    }
+    else
+    {
+      if( cp.extension( ).string( ) == cpPlugins_EXT )
+        this->AddFile( cp.string( ) );
+    } // end if
+  }
+  catch( ... ) { }
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Manager::
+AddFile( const std::string& f )
+{
+  typedef TLibraries::value_type _TLib;
+  typedef TPlugins::value_type   _TPlg;
+  namespace bf = boost::filesystem;
+
+  try
+  {
+    bf::path cf = bf::canonical( bf::path( f ) );
+    if( bf::is_directory( cf ) )
+    {
+      bf::directory_iterator dIt( cf );
+      for( ; dIt != bf::directory_iterator( ); ++dIt )
+      {
+        if( dIt->path( ).extension( ).string( ) == cpPlugins_EXT )
+          this->AddFile( dIt->path( ).string( ) );
+      } // end for
+    }
+    else
+    {
+      if( cf.extension( ).string( ) == cpPlugins_EXT )
+      {
+        std::string n = cf.filename( ).string( );
+        if( Self::m_Libraries.find( n ) == Self::m_Libraries.end( ) )
+        {
+          TLibraries::iterator lIt =
+            Self::m_Libraries.insert(
+              _TLib( n, cpPlugins::Library( cf.string( ) ) )
+              ).first;
+          for( const std::string& f: lIt->second.GetContents( ) )
+            Self::m_Plugins.insert( _TPlg( f, n ) );
+        } // end if
+      } // end if
+    } // end if
+  }
+  catch( ... ) { }
+}
+
+// -------------------------------------------------------------------------
+std::shared_ptr< cpPlugins::ProcessObject >  cpPlugins::Manager::
+Create( const std::string& name )
+{
+  TPlugins::iterator pIt = Self::m_Plugins.find( name );
+  if( pIt != Self::m_Plugins.end( ) )
+  {
+    TLibraries::iterator lIt = Self::m_Libraries.find( pIt->second );
+    if( lIt != Self::m_Libraries.end( ) )
+      return( lIt->second.Create( name ) );
+  } // end if
+  cpPluginsErrorMacro(
+    this, << "Could not create an object of type \"" << name << "\"."
+    );
+}
+
+// eof - $RCSfile$