X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=kernel%2Fsrc%2FbbtkFactory.cxx;h=82bf038f842dfe7ae2c1ed2eec16dd1cc9d94982;hb=c2a4b1893412e50a3d9abff221938a2d16c4a7cb;hp=5095c0e81b452368b4aca8f68f53464aa4cf40cc;hpb=cbdd914a561bf6241a5b56d66873e090db933f8b;p=bbtk.git diff --git a/kernel/src/bbtkFactory.cxx b/kernel/src/bbtkFactory.cxx index 5095c0e..82bf038 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/14 13:44:25 $ -Version: $Revision: 1.21 $ +Date: $Date: 2008/04/09 11:16:57 $ +Version: $Revision: 1.32 $ 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 +200,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 +249,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 +262,6 @@ namespace bbtk bbtkDebugMessageInc("Kernel",7,"Factory::LoadPackage(\""< package_paths; std::string libname; // full path library name @@ -447,71 +432,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 +616,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 +641,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); @@ -682,13 +681,13 @@ namespace bbtk //=================================================================== /// Creates an instance of a black box of type with name - BlackBox* Factory::NewAdaptor(TypeInfo typein, - TypeInfo typeout, - const std::string& name) const + BlackBox* Factory::NewAdaptor(const DataInfo& typein, + const DataInfo& typeout, + const std::string& name) const { - bbtkDebugMessageInc("Kernel",8,"Factory::NewAdaptor(<" - <,<" - <,\"" + bbtkDebugMessageInc("Kernel",8,"Factory::NewAdaptor(" + < to <" - < adaptor available"); + bbtkError("no "< with name + BlackBox* Factory::NewWidgetAdaptor(const DataInfo& typein, + const DataInfo& typeout, + const std::string& name) const + { + bbtkDebugMessageInc("Kernel",8,"Factory::NewWidgetAdaptor(<" + <,<" + <,\"" + <second.mPackage->NewWidgetAdaptor(typein, + typeout, + name); + if (b) break; + } + if (!b) + { + bbtkError("no "< widget adaptor available"); + } + + bbtkDebugDecTab("Kernel",7); + return b; + } + //=================================================================== + + //=================================================================== + /// Creates an instance of a black box of type with name + bool Factory::FindAdaptor(const DataInfo& typein, + const DataInfo& typeout, + std::string& adaptor) const + { + bbtkDebugMessageInc("Kernel",8,"Factory::FindAdaptor(<" + <,<" + <)"<second.mPackage->FindAdaptor(typein, + typeout, + adaptor); + if (b) break; + } + /* + if (!b) + { + bbtkError("no "< widget adaptor available"); } + */ + + bbtkDebugDecTab("Kernel",7); + return b; + } + //=================================================================== + + //=================================================================== + /// Creates an instance of a black box of type with name + bool Factory::FindWidgetAdaptor(const DataInfo& typein, + const DataInfo& typeout, + std::string& adaptor) const + { + bbtkDebugMessageInc("Kernel",8,"Factory::FindWidgetAdaptor(<" + <,<" + <)"<second.mPackage->FindWidgetAdaptor(typein, + typeout, + adaptor); + if (b) break; + } + bbtkDebugDecTab("Kernel",7); + return b; + } + //=================================================================== + + //=================================================================== + /// Creates an instance of a black box of type with name + bool Factory::FindWidgetAdaptor2(const DataInfo& typein, + const DataInfo& typeout, + std::string& widget, + std::string& adaptor) const + { + bbtkDebugMessageInc("Kernel",8,"Factory::FindWidgetAdaptor(<" + <,<" + <)"<second.mPackage->FindWidgetAdaptor(typein, + typeout, + widget); + if (b) break; + } + if (!b) + { + // Look for a widget adaptor with good nature out + bbtkMessage("Kernel",5, + "*** Looking for a two pieces widget adaptor for : " + << typein << "->"<second.mPackage->GetAdaptorMap().begin(); + j!=i->second.mPackage->GetAdaptorMap().end(); + ++j) + { + if ( ( j->first.mKind == + BlackBoxDescriptor::DEFAULT_WIDGET_ADAPTOR) && + //(j->first.mTypeIn == typein) && + (j->first.mTypeOut.GetNature() == typeout.GetNature() ) + ) + { + widget = j->second->GetTypeName(); + bbtkMessage("Kernel",5, + "===> Found first part : "<first.mTypeIn<<"->" + <first.mTypeOut<first.mTypeOut.GetType(), ""); + DataInfo to( typeout.GetType(), ""); + b = FindAdaptor( ti, to, adaptor ); + if (b) + { + bbtkMessage("Kernel",5, + "===> Found second part : "< No second part found"<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); } //=================================================================== @@ -820,9 +930,25 @@ namespace bbtk } //=================================================================== + //=================================================================== + void Factory::CheckPackages() const + { + bbtkMessage("Debug",1,"****** Checking Factory "<<(void*)this + <second.mPackage->CheckBoxes(); + } + bbtkMessage("Debug",1,"****** Checking Factory "<<(void*)this + <<" ... OK"<second->GetKind() == BlackBoxDescriptor::STANDARD ) + continue; + } + else + if (j->second->GetKind() != BlackBoxDescriptor::STANDARD ) + continue; + std::vector keys; if (type==Packages) { @@ -923,7 +1060,7 @@ namespace bbtk 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]); @@ -940,6 +1077,7 @@ namespace bbtk keys.push_back(" NONE"); title = "Boxes by category"; } + std::vector::const_iterator k; for (k=keys.begin(); k!=keys.end(); ++k ) @@ -1004,7 +1142,7 @@ namespace bbtk 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) @@ -1016,6 +1154,11 @@ namespace bbtk 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 {