]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Interface.cxx
Now it compiles again on Windows.
[cpPlugins.git] / lib / cpPlugins / Interface.cxx
index 259288243d5a309e803115bddb6e50a98645b210..611143e09d66ca6e170a44adb4edd73bcbc05e4b 100644 (file)
@@ -64,6 +64,7 @@ SaveConfiguration( const std::string& filename ) const
   for( ; dIt != this->m_DynLibraries.end( ); ++dIt )
     out << dIt->first << std::endl;
   out.close( );
+  return( true );
 }
 
 // -------------------------------------------------------------------------
@@ -104,7 +105,7 @@ LoadPluginFile( const std::string& filename )
       if( new_filter )
       {
         // Update filters container
-        TCreator creator = Self::_DLGetCreator( hnd, catIt->first, *clsIt );
+        auto creator = Self::_DLGetCreator( hnd, catIt->first, *clsIt );
         if( creator != NULL )
         {
           this->m_DynFilters[ catIt->first][ *clsIt ] =
@@ -146,13 +147,16 @@ UnloadAll( )
 cpPlugins::ProcessObject::Pointer cpPlugins::Interface::
 Create( const std::string& category, const std::string& name )
 {
-  cpPlugins::ProcessObject::Pointer filter = NULL;
+  typedef cpPlugins::ProcessObject::Pointer _TPointer;
+  _TPointer filter = NULL;
   auto catIt = this->m_DynFilters.find( category );
   if( catIt != this->m_DynFilters.end( ) )
   {
     auto clsIt = catIt->second.find( name );
     if( clsIt != catIt->second.end( ) )
-      filter = clsIt->second.second( );
+      filter =
+        ( reinterpret_cast< _TPointer* >( clsIt->second.second( ) ) )->
+        GetPointer( );
 
   } // fi
   return( filter );
@@ -177,29 +181,40 @@ cpPlugins::Interface::
 TFilters cpPlugins::Interface::
 _DLGetFilters( void* hnd )
 {
-  typedef const TFilters ( *f_t )( );
-
-  TFilters filters;
+  // Get descriptors
+  typedef const char* ( *f_t )( );
+  f_t f = NULL;
 #ifdef cpPlugins_SYS_WINDOWS
-  auto f = ( f_t )(
-    ::GetProcAddress( ( HMODULE )hnd, "cpPlugins_LoadedFilters" )
-    );
-  std::cout << f << std::endl;
+  f = ( f_t )( ::GetProcAddress( ( HMODULE )hnd, "cpPlugins_LoadedFilters" ) );
 #else // cpPlugins_SYS_WINDOWS
-  auto f = ( f_t ) dlsym( hnd, "cpPlugins_LoadedFilters" );
-  const char* err = dlerror( );
-  if( err != NULL )
+  f = ( f_t )( dlsym( hnd, "cpPlugins_LoadedFilters" ) );
+#endif // cpPlugins_SYS_WINDOWS
+  if( f == NULL )
   {
-    dlclose( hnd );
+    Self::_DLClose( hnd );
     throw std::runtime_error(
-      std::string(
-        "cpPlugins::Interface: Library not recognized as a cpPlugins library: "
-        ) + std::string( err )
+      "cpPlugins::Interface: Library not recognized as a cpPlugins library: "
       );
 
   } // fi
-#endif // cpPlugins_SYS_WINDOWS
-  filters = f( );
+  std::string descriptors = f( );
+
+  // Demangle descriptors
+  TFilters filters;
+  std::replace( descriptors.begin( ), descriptors.end( ), ';', ' ' );
+  std::istringstream str( descriptors );
+  while( str )
+  {
+    std::string value, category, name;
+    str >> value;
+    if( value == "" )
+      continue;
+    std::replace( value.begin( ), value.end( ), ':', ' ' );
+    std::istringstream value_str( value );
+    value_str >> category >> name;
+    filters[ category ].insert( name );
+
+  } // elihw
   return( filters );
 }
 
@@ -213,16 +228,16 @@ _DLGetCreator(
   TCreator c = NULL;
   std::string func_name = category + "_" + name;
 #ifdef cpPlugins_SYS_WINDOWS
-  // TODO:
+  c = ( TCreator )( ::GetProcAddress( ( HMODULE )hnd, func_name.c_str( ) ) );
 #else // cpPlugins_SYS_WINDOWS
-  c = ( TCreator )dlsym( hnd, func_name.c_str( ) );
+  c = ( TCreator )( dlsym( hnd, func_name.c_str( ) ) );
+#endif // cpPlugins_SYS_WINDOWS
   if( c == NULL )
     throw std::runtime_error(
       std::string( "cpPlugins::Interface: Class \"" ) +
       category + std::string( ":" ) + name +
       std::string( "\" does not have a valid creator function." )
       );
-#endif // cpPlugins_SYS_WINDOWS
   return( c );
 }