X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkFactory.cxx;h=6b4079344912f2c976bba2e3e209c044990f6d7e;hb=981ac411655ee59f6cf7a6e89099a4366ac4b18b;hp=7cda690e1aaa71d50690300928fefc2d9ef88d46;hpb=027bd220c2819146658da884f08b10ffc40545e3;p=bbtk.git diff --git a/kernel/src/bbtkFactory.cxx b/kernel/src/bbtkFactory.cxx index 7cda690..6b40793 100644 --- a/kernel/src/bbtkFactory.cxx +++ b/kernel/src/bbtkFactory.cxx @@ -4,8 +4,8 @@ Program: bbtk Module: $RCSfile: bbtkFactory.cxx,v $ Language: C++ -Date: $Date: 2008/02/18 10:41:02 $ -Version: $Revision: 1.22 $ +Date: $Date: 2008/03/11 12:27:21 $ +Version: $Revision: 1.30 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de @@ -37,20 +37,6 @@ PURPOSE. See the above copyright notices for more information. #include // std::toupper -// was in gdcm ... -/* -#ifdef _MSC_VER -# define getcwd _getcwd -#endif - -#if defined(_MSC_VER) || defined(__BORLANDC__) -# include -#else -# include -#endif - -*/ - namespace bbtk { @@ -61,6 +47,7 @@ namespace bbtk //=================================================================== /// Default ctor Factory::Factory() + : mExecuter(0) { bbtkDebugMessage("Kernel",7,"Factory::Factory()"<GetBBTKVersion() != bbtk::GetVersion() ) { @@ -215,6 +208,9 @@ namespace bbtk << " whereas application build with version " << bbtk::GetVersion()); } + + pack.mPackage->AddFactory(this); + mPackageMap[pkgname] = pack; std::string separator = ConfigurationFile::GetInstance().Get_file_separator (); @@ -261,8 +257,7 @@ namespace bbtk - void Factory::LoadPackage( const std::string& name, - bool use_configuration_file) + void Factory::LoadPackage( const std::string& name ) { // Note : in the following : // name : the user supplied name @@ -275,8 +270,6 @@ namespace bbtk bbtkDebugMessageInc("Kernel",7,"Factory::LoadPackage(\""< package_paths; std::string libname; // full path library name @@ -447,71 +440,85 @@ namespace bbtk //=================================================================== /// \brief Close the package referenced by the iterator - /// - /// If it is a dynamically loaded package - /// - Loads and calls the function "DeletePackage" of the dynamic library (responsible for package desallocation) - /// - Closes the dynamic library - /// - Erases the package entry in the packages map - /// - /// Else simply erases the package entry in the packages map - void Factory::ClosePackage(PackageMapType::iterator& i) + /// + /// First removes the factory from the set of factories which use the package + /// If the set is empty then : + /// If it is a dynamically loaded package : + /// - Loads and calls the function "DeletePackage" of the dynamic library (responsible for package desallocation) + /// - Closes the dynamic library + /// Else : + /// - deletes the package normally + /// + /// Finally erases the package entry in the packages map + void Factory::ClosePackage(PackageMapType::iterator& i) { bbtkDebugMessageInc("Kernel",7,"Factory::ClosePackage(\"" <second.mPackage->GetName() <<"\")"<second.mDynamicLibraryHandler) - { - - // If it is a dynamically loaded package - // Loads the Package delete function - - std::string delfname(i->second.mPackage->GetName()); - delfname += "DeletePackage"; + + // Removes this from the set of factories which use the package + i->second.mPackage->RemoveFactory(this); + + // If no more factory which use it + if (i->second.mPackage->GetFactorySet().empty()) + { + // If it is a dynamically loaded package + if (i->second.mDynamicLibraryHandler) + { + + + // Loads the Package delete function + + std::string delfname(i->second.mPackage->GetName()); + delfname += "DeletePackage"; #if defined(__GNUC__) - void *delf = dlsym(i->second.mDynamicLibraryHandler, delfname.c_str()); - if (!delf) - { - bbtkError("could not close package \"" - <second.mPackage->GetName() - <<"\" :"<second.mDynamicLibraryHandler, delfname.c_str()); + if (!delf) + { + bbtkError("could not close package \"" + <second.mPackage->GetName() + <<"\" :"<second.mDynamicLibraryHandler, - delfname.c_str()); - if (!delf) - { - bbtkError("could not close package \"" - <second.mPackage->GetName() - <<"\" : "<second.mDynamicLibraryHandler, + delfname.c_str()); + if (!delf) + { + bbtkError("could not close package \"" + <second.mPackage->GetName() + <<"\" : "<second.mDynamicLibraryHandler); + dlclose(i->second.mDynamicLibraryHandler); #elif defined(_WIN32) - - FreeLibrary(i->second.mDynamicLibraryHandler); + + FreeLibrary(i->second.mDynamicLibraryHandler); #endif - } - else - { - // If it is a manually inserted package - delete i->second.mPackage; - } + } - // remove the entry in the map - mPackageMap.erase(i); - bbtkDebugDecTab("Kernel",7); - } - //=================================================================== + else + { + // If it is a manually inserted package : delete it normally + delete i->second.mPackage; + } + } + + // in any cases remove the entry in the map + mPackageMap.erase(i); + bbtkDebugDecTab("Kernel",7); + } + //=================================================================== + //=================================================================== @@ -617,12 +624,12 @@ namespace bbtk bbtkDebugMessageInc("Kernel",9,"Factory::InsertPackage(\""<< p->GetName()<<"\")"<AddFactory(this); PackageInfoType pack; pack.mDynamicLibraryHandler = 0; - pack.mPackage = p; - mPackageMap[p->GetName()] = pack; + bbtkDebugDecTab("Kernel",9); } //=================================================================== @@ -642,12 +649,12 @@ namespace bbtk if (i!=mPackageMap.end()) { - ClosePackage(i); + ClosePackage(i); } else { - bbtkError("Factory::RemovePackage(\""<< - p->GetName()<<"\") : package absent from factory"); + bbtkError("Factory::RemovePackage(\""<< + p->GetName()<<"\") : package absent from factory"); } bbtkDebugDecTab("Kernel",9); @@ -724,53 +731,7 @@ namespace bbtk <bbGetName()<<"\",\""<bbGetOutputType(output).name() ); - std::string t2 ( to->bbGetInputType(input).name() ); - - - if ( t1 == t2 ) - //from->bbGetOutputType(output) == - // to->bbGetInputType(input) ) - { - c = new Connection(from,output,to,input); - } - else - { - // std::cout << "Adaptive connection "<bbGetName() + "." + output + "-" - + to->bbGetName() + "." + input; - - BlackBox* b = 0; - PackageMapType::const_iterator i; - for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i ) - { - b = i->second.mPackage->NewAdaptor(from->bbGetOutputType(output), - to->bbGetInputType(input), - name); - if (b) break; - } - if (!b) - { - bbtkError("did not find any <" - <bbGetOutputType(output)) - <<"> to <" - <bbGetInputType(input)) - <<"> adaptor"); - } - c = new AdaptiveConnection(from,output,to,input,b); - } - bbtkDebugDecTab("Kernel",7); - - return c; - */ + return new Connection(from,output,to,input,this); } //=================================================================== @@ -823,7 +784,6 @@ namespace bbtk //=================================================================== void Factory::WriteDotFilePackagesList(FILE *ff) { -printf("EED Factory::WriteDotFilePackagesList 01\n"); bbtkDebugMessageInc("Kernel",9,"Factory::WriteDotFilePackagesList()" <"); } -printf("EED Factory::ShowGraphTypes 02\n"); } @@ -921,6 +878,16 @@ printf("EED Factory::ShowGraphTypes 02\n"); ++j) { + // Skip adaptors + if ( type==Adaptors ) + { + if (j->second->GetKind() == BlackBoxDescriptor::STANDARD ) + continue; + } + else + if (j->second->GetKind() != BlackBoxDescriptor::STANDARD ) + continue; + std::vector keys; if (type==Packages) { @@ -929,7 +896,7 @@ printf("EED Factory::ShowGraphTypes 02\n"); keys.push_back(k); title = "Boxes by package"; } - else if (type==Initials) + else if ((type==Initials) || (type==Adaptors)) { std::string init(" "); init[0] = std::toupper(j->second->GetTypeName()[0]); @@ -946,6 +913,7 @@ printf("EED Factory::ShowGraphTypes 02\n"); keys.push_back(" NONE"); title = "Boxes by category"; } + std::vector::const_iterator k; for (k=keys.begin(); k!=keys.end(); ++k ) @@ -1010,7 +978,7 @@ printf("EED Factory::ShowGraphTypes 02\n"); IndexType::iterator ii; for (ii=index.begin();ii!=index.end();++ii) { - s << "first<<"\">"<first<<" "; + s << "first<<"\">"<first<<"  "; } for (ii=index.begin();ii!=index.end();++ii) @@ -1022,6 +990,11 @@ printf("EED Factory::ShowGraphTypes 02\n"); s << "first<<"\">\n"; s << "

first<<"/index.html\">" << ii->first<<"\n"; + + s << "  -  \n"; + + s << "\n"; + s << "first << "/main.html>(Doxygen documentation of the source)\n"; } else {