]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkFactory.cxx
BUG MACOS
[bbtk.git] / kernel / src / bbtkFactory.cxx
index c024617d59d01416250563110db678ffe8f2855b..ad64151ba1696592f5611f2095d42125f86b6155 100644 (file)
@@ -1,22 +1,33 @@
-/*=========================================================================
-                                                                                
-Program:   bbtk
-Module:    $RCSfile: bbtkFactory.cxx,v $
-Language:  C++
-
-Date:      $Date: 2008/04/18 12:59:15 $
-Version:   $Revision: 1.33 $
-                                                                                
-
-Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
-l'Image). All rights reserved. See doc/license.txt or
-http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
+/*=========================================================================                                                                               
+  Program:   bbtk
+  Module:    $RCSfile: bbtkFactory.cxx,v $
+  Language:  C++
+  Date:      $Date: 2009/03/30 15:22:51 $
+  Version:   $Revision: 1.42 $
+=========================================================================*/
 
-This software is distributed WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE.  See the above copyright notices for more information.
+/* ---------------------------------------------------------------------
+
+* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
+* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
+*
+*  This software is governed by the CeCILL-B license under French law and 
+*  abiding by the rules of distribution of free software. You can  use, 
+*  modify and/ or redistribute the software under the terms of the CeCILL-B 
+*  license as circulated by CEA, CNRS and INRIA at the following URL 
+*  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
+*  or in the file LICENSE.txt.
+*
+*  As a counterpart to the access to the source code and  rights to copy,
+*  modify and redistribute granted by the license, users are provided only
+*  with a limited warranty  and the software's author,  the holder of the
+*  economic rights,  and the successive licensors  have only  limited
+*  liability. 
+*
+*  The fact that you are presently reading this means that you have had
+*  knowledge of the CeCILL-B license and that you accept its terms.
+* ------------------------------------------------------------------------ */                                                                         
 
-=========================================================================*/
 /**
  *\file
  *\brief  Class bbtk::Factory : can load and unload dynamic libraries containing 
@@ -28,6 +39,7 @@ PURPOSE.  See the above copyright notices for more information.
 #include "bbtkConnection.h"
 #include "bbtkConfigurationFile.h"
 #include "bbtkUtilities.h"
+#include "bbtkConfigurationFile.h"
 
 #include <sys/stat.h> // for struct stat stFileInfo
 
@@ -37,6 +49,7 @@ PURPOSE.  See the above copyright notices for more information.
 
 #include <cctype>    // std::toupper
 
+#include <time.h>
 
 namespace bbtk
 {
@@ -137,7 +150,7 @@ namespace bbtk
   // lastname : string before the last / (if any), or user supplied name
 
     bbtkDebugMessageInc("Kernel",7,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);
-    bbtkMessage("Debug",1,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);
+    bbtkMessage("debug",1,"Factory::LoadPackage(\""<<name<<"\")"<<std::endl);
 
     std::vector<std::string> package_paths;
     std::string libname;  // full path library name
@@ -146,8 +159,8 @@ namespace bbtk
     std::string upath;
     pkgname = Utilities::ExtractPackageName(name,upath);
 
-    bbtkMessage("Debug",1,"Package name ["<<pkgname<<"]"<<std::endl);
-    bbtkMessage("Debug",1,"Package path ["<<upath<<"]"<<std::endl);
+    bbtkMessage("debug",1,"Package name ["<<pkgname<<"]"<<std::endl);
+    bbtkMessage("debug",1,"Package path ["<<upath<<"]"<<std::endl);
 
     // no loading package if already loaded
     PackageMapType::iterator iUnload;
@@ -231,7 +244,7 @@ namespace bbtk
 
         libname = Utilities::MakeLibnameFromPath(path, pkgname);
 
-        bbtkMessage("Debug",2,"-> Trying to load [" << libname << "]" <<std::endl);
+        bbtkMessage("debug",2,"-> Trying to load [" << libname << "]" <<std::endl);
 
       // Check if library exists           
         if ( !Utilities::FileExists(libname) )
@@ -250,9 +263,9 @@ namespace bbtk
         ok = DoLoadPackage( libname, pkgname, path);
         if (ok)
         {
-           bbtkMessage("Debug",2,"   OK"<<std::endl);
-           break; // a package was found; we stop iterating
+           bbtkMessage("debug",2,"   OK"<<std::endl);
         }
+       break; // we stop iterating even if error : have to signal it to user
     } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
 
 }
@@ -267,10 +280,12 @@ namespace bbtk
       {
 #if defined(__GNUC__)
         bbtkError("Could not load package ["<< pkgname
-                  <<"] :" << std::endl << "   " << dlerror());
+                  <<"] :" << std::endl 
+                 << "  Opening "<<libname<<" failed"
+                 << "  Reason: "<< dlerror());
 #elif defined(_WIN32)
         bbtkError("Could not load package ["<<pkgname
-                 <<"] : " << std::endl << "   " <<libname<<" not found");
+                 <<"] :"<< std::endl << "   Error loading " <<libname);
 
     // look how to get the error message on win
     //<<dlerror());
@@ -310,11 +325,31 @@ namespace bbtk
   void Factory::CloseAllPackages()
   {
     bbtkDebugMessageInc("Kernel",7,"Factory::CloseAllPackages()"<<std::endl);
-    while (mPackageMap.begin() != mPackageMap.end())
-      {
-        PackageMapType::iterator i = mPackageMap.begin();
-        ClosePackage(i);
-      }
+    
+    std::vector< Package::WeakPointer > mAlive;  
+    do {
+      mAlive.clear();  
+      while (mPackageMap.begin() != mPackageMap.end())
+       {
+         PackageMapType::iterator i = mPackageMap.begin();
+         Package::WeakPointer p = i->second;
+         ClosePackage(i);
+         if (p.lock()) mAlive.push_back(p);
+       }
+      std::vector< Package::WeakPointer >::iterator i;
+      for (i=mAlive.begin();i!=mAlive.end();++i)
+       {
+         // If not dead : reinsert
+         if (i->lock())
+           {
+             bbtkDebugMessage("Kernel",7,"Package "<<i->lock()->GetName()
+                              <<" still alive"<<std::endl);
+             // InsertPackage(i->lock());
+           }
+       }      
+    }
+    while (mPackageMap.size()>0);
+
     bbtkDebugDecTab("Kernel",7);
   }
   //===================================================================
@@ -344,9 +379,10 @@ namespace bbtk
      // remove the entry in the map
      mPackageMap.erase(i);
      // Release the package if not already destroyed
-     if (p.lock()) Package::Release(p);
-
-
+     if (p.lock()) 
+       {
+        Package::Release(p);
+       }
      bbtkDebugDecTab("Kernel",7);
   }
   //===================================================================
@@ -456,13 +492,9 @@ namespace bbtk
     bbtkDebugMessageInc("Kernel",9,"Factory::InsertPackage(\""<<
                         p->GetName()<<"\")"<<std::endl);
 
-    std::cout << p.use_count() <<std::endl;
-
     p->AddFactory(GetThisPointer<Factory>());
     mPackageMap[p->GetName()] = p;
 
-    std::cout << p.use_count() <<std::endl;
-
     bbtkDebugDecTab("Kernel",9);
   }
   //===================================================================
@@ -674,7 +706,7 @@ namespace bbtk
                 ++j)
              {
                if ( ( j->first.mKind ==  
-                      BlackBoxDescriptor::DEFAULT_WIDGET_ADAPTOR) &&
+                      BlackBoxDescriptor::DEFAULT_GUI) &&
                     //(j->first.mTypeIn == typein) &&
                     (j->first.mTypeOut.GetNature() == typeout.GetNature() ) 
                     )
@@ -754,14 +786,14 @@ namespace bbtk
   //===================================================================
   void Factory::CheckPackages() const
   {
-    bbtkMessage("Debug",1,"****** Checking Factory "<<(void*)this
+    bbtkMessage("debug",1,"****** Checking Factory "<<(void*)this
                 <<std::endl);
     PackageMapType::const_iterator i;
     for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i )
       {
        i->second->CheckBoxes();
       }
-    bbtkMessage("Debug",1,"****** Checking Factory "<<(void*)this
+    bbtkMessage("debug",1,"****** Checking Factory "<<(void*)this
                <<" ... OK"<<std::endl);
   }
   //===================================================================
@@ -980,7 +1012,9 @@ namespace bbtk
            s << "&nbsp;&nbsp;-&nbsp;&nbsp;\n"; 
 
            s << "<a name=\"doxygen\"></a>\n"; 
-           s << "<a href=..\\doxygen\\" << ii->first << "/main.html>(Doxygen documentation of the source)</a>\n"; 
+//EED 26Mars2009                 
+               std::string bin_path = bbtk::ConfigurationFile::GetInstance().Get_bin_path();
+           s << "<a href=" << bin_path <<"/../share/bbtk/doc/doxygen/" << ii->first << "/main.html>(Doxygen documentation of the source)</a>\n"; 
          }
        else 
          {
@@ -1020,7 +1054,7 @@ namespace bbtk
     ptm = gmtime ( &rawtime );
 
     s << "<p><hr>\n";
-    s << "Automatically generated by <b>bbi</b> on "
+    s << "Automatically generated by <b>bbtk</b> on "
       << ptm->tm_mday << "/" << ptm->tm_mon << "/" << ptm->tm_year+1900 
       << " - " << ptm->tm_hour << ":" << ptm->tm_min << " GMT\n";
     s << "</body></html>\n";