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=ab82b885600f5583cb2f412fb7c77492f2785bb1;hpb=01f46ce7ba8fe9067dff0688706986475aaec73e;p=bbtk.git diff --git a/kernel/src/bbtkFactory.cxx b/kernel/src/bbtkFactory.cxx index ab82b88..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/12 12:55:16 $ -Version: $Revision: 1.18 $ +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() ) - { - std::string v(pack.mPackage->GetBBTKVersion()); - UnLoadPackage(pkgname); - bbtkError(" package build with bbtk version " - << v - << " whereas application build with version " - << bbtk::GetVersion()); - } - - std::string separator = - ConfigurationFile::GetInstance().Get_file_separator (); - //BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) - std::string docreldoc = - separator + "bbdoc" + separator + pkgname + separator + "index.html"; - std::string reldoc = - ".." + separator + ".." + docreldoc; - std::string doc = path + separator + ".." + separator - + BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) - + docreldoc; - - pack.mPackage->SetDocURL(doc); - pack.mPackage->SetDocRelativeURL(reldoc); + if ( pack.mPackage->GetBBTKVersion() != bbtk::GetVersion() ) + { + std::string v(pack.mPackage->GetBBTKVersion()); + UnLoadPackage(pkgname); + bbtkError("Cannot load package ["<AddFactory(this); + mPackageMap[pkgname] = pack; + + std::string separator = + ConfigurationFile::GetInstance().Get_file_separator (); + //BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) + std::string docreldoc = + separator + "bbdoc" + separator + pkgname + separator + "index.html"; + std::string reldoc = + ".." + separator + ".." + docreldoc; + std::string doc = path + separator + ".." + separator + + BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) + + docreldoc; + + pack.mPackage->SetDocURL(doc); + pack.mPackage->SetDocRelativeURL(reldoc); + //=================================================================== - bbtkMessage("Output",2,pack.mPackage->GetName()<<" " - <GetVersion() - <<" (bbtk " - <GetBBTKVersion()<<") " - <GetAuthor() << " Category(s) :" - <GetCategory() - <GetDescription()<GetName()<<" " + <GetVersion() + <<" (bbtk " + <GetBBTKVersion()<<") " + <GetAuthor() << " Category(s) :" + <GetCategory() + <GetDescription()<GetPackage" and "DeletePackage". /// "GetPackage" is called to get the pointer on the bbtk::Package of the library /// ("DeletePackage" is not used, its presence is just checked before loading the package). - + /// now, filename is only the last name (no longer the full name!) /// it will be searched within *all* the paths given in bbtk_config.xml + - /// verbose = true (set by "config v") displays the loading process - - void Factory::LoadPackage( const std::string& name, - bool use_configuration_file, bool verbose) + + void Factory::LoadPackage( const std::string& name ) { // Note : in the following : // name : the user supplied name @@ -278,8 +262,6 @@ namespace bbtk bbtkDebugMessageInc("Kernel",7,"Factory::LoadPackage(\""< package_paths; std::string libname; // full path library name @@ -322,8 +304,8 @@ namespace bbtk return; } - // std::string path = Utilities::ExpandLibName(upath, verbose); - std::string path = Utilities::ExpandLibName(name, verbose); // keep last item, here. + // std::string path = Utilities::ExpandLibName(upath, false); + std::string path = Utilities::ExpandLibName(name,false); // keep last item, here. if (path != "") { @@ -337,12 +319,12 @@ namespace bbtk // The following is *NOT* a debug time message : // It's a user intended message. // Please don't remove it. - if (verbose) - std::cout <<" [" <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); + } + //=================================================================== + //=================================================================== @@ -582,7 +578,7 @@ namespace bbtk //=================================================================== //=================================================================== - /// Prints help on the black box of type + /// Prints help on the black box of type /// Returns the package to which it belongs void Factory::HelpBlackBox(const std::string& name, std::string& package, @@ -598,7 +594,7 @@ namespace bbtk if (i->second.mPackage->ContainsBlackBox(name)) { i->second.mPackage->HelpBlackBox(name,full); - package = i->second.mPackage->GetName(); + package = i->second.mPackage->GetName(); found = true; } } @@ -620,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); } //=================================================================== @@ -645,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); @@ -685,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); } //=================================================================== @@ -823,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) { @@ -926,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]); @@ -943,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 ) @@ -1007,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) @@ -1019,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 {