+
+
+
+ if(name != ""){
+ bbtkDebugMessageInc("kernel",7,"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
+ std::string pkgname; // e.g. libbb<pkgname>.so
+
+ std::string upath;
+
+
+ pkgname = Utilities::ExtractPackageName(name,upath);
+
+ printf("EED Factory::LoadPackage A. %s\n", name.c_str());
+ printf("EED Factory::LoadPackage A. %s\n", upath.c_str());
+ printf("EED Factory::LoadPackage A. %s\n", pkgname.c_str());
+
+ 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;
+ iUnload = mPackageMap.find(pkgname);
+
+ PackageMapType::iterator it;
+std::cout << "EED Factory::LoadPackage PackageMap ";
+ for ( it=mPackageMap.begin() ; it != mPackageMap.end(); it++ )
+ std::cout << (*it).first << " ";
+ std::cout << std::endl;
+
+ if (iUnload != mPackageMap.end())
+ {
+ bbtkMessage("output",2,"["<< pkgname <<"] already loaded" << std::endl);
+ return;
+ }
+
+ // =================================================
+ // The following structure was checked to work
+ // with any type of relative/absolute path.
+ // Please don't modify it without checking
+ // *all* the cases. JP
+ //==================================================
+
+ printf("\nEED Factory::LoadPackage B. %s\n\n", name.c_str());
+ //std::cout << "upath [" << name << "]" << std::endl;
+
+ bool ok = false;
+ bool foundFile = false;
+
+ // If path provided by user will be the first scanned :
+ // push it into vector of paths
+ if (upath.length()>0) // ------------------------------------- check user supplied location
+ {
+ if (name[0] != '.' && name[0] != '/' && name[1]!= ':')
+ {
+ bbtkError("Use absolute or relative path name! ["<<name<<"] is an illegal name");
+ return;
+ }
+
+ // std::string path = Utilities::ExpandLibName(upath, false);
+
+ std::string path = Utilities::ExpandLibName(name,false); // keep last item, here.
+ if (path != "")
+ {
+ std::string p2;
+ Utilities::ExtractPackageName(path,p2);
+ //libname = Utilities::MakeLibnameFromPath(path, pkgname);
+ libname = Utilities::MakeLibnameFromPath(p2, pkgname); // remove last item
+ // Check if library exists
+ if ( !Utilities::FileExists(libname) )
+ {
+ // The following is *NOT* a debug time message :
+ // It's a user intended message.
+ // Please don't remove it.
+ bbtkMessage("output",3," [" <<libname
+ <<"] : doesn't exist" <<std::endl);
+ }
+ else
+ {
+ ok = DoLoadPackage( libname, pkgname, path);
+ }
+ }
+ else
+ {
+ bbtkError("Path ["<<upath<<"] doesn't exist");
+ return;
+ }
+ }
+ else // ----------------------------------------------------- iterate on the paths
+ {
+
+ std::string path = ".";
+ package_paths = ConfigurationFile::GetInstance().Get_package_paths();
+ std::vector<std::string>::iterator i;
+ for (i=package_paths.begin();i!=package_paths.end();++i)
+ {
+ foundFile = false;
+ path = *i;
+//std::cout<<"JCP bbtkFactory.cxx void Factory::LoadPackage = path "<<path<<std::endl;
+ // we *really* want '.' to be the current working directory
+ if (path == ".")
+ {
+ char buf[2048]; // for getcwd
+ char * currentDir = getcwd(buf, 2048);
+ std::string cwd(currentDir);
+//std::cout<<"JCP bbtkFactory.cxx void Factory::LoadPackage = currentDir "<<currentDir<<std::endl;
+ path = currentDir;
+ }
+//std::cout<<"JCP bbtkFactory.cxx void Factory::LoadPackage = path "<<path<<" pkgnam="<<pkgname<<std::endl;
+ libname = Utilities::MakeLibnameFromPath(path, pkgname);
+
+ bbtkMessage("debug",2,"-> Trying to load [" << libname << "]" <<std::endl);
+
+ // Check if library exists
+ if ( !Utilities::FileExists(libname) )
+ {
+ // The following is *NOT* a debug time message :
+ // It's a user intended message.
+ // Please don't remove it.
+ bbtkMessage("output",3,
+ " [" <<libname <<"] : doesn't exist" <<std::endl);
+ continue; // try next path
+ }
+ foundFile = true;
+
+ // Try to Load the library
+
+ ok = DoLoadPackage( libname, pkgname, path);
+ if (ok)
+ {
+ 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() )
+
+ }
+
+ if( !ok ) // nothing was loaded
+ {
+ if (!foundFile)
+ {
+ bbtkError("Could not find package ["<<pkgname<< "]");
+ }
+ else
+ {
+ #if defined(__GNUC__)
+ bbtkError("Could not load package ["<< pkgname
+ <<"] :" << std::endl
+ << " Opening "<<libname<<" failed"
+ << " Reason: "<< dlerror());
+ #elif defined(_WIN32)
+ bbtkError("Could not load package ["<<pkgname
+ <<"] :"<< std::endl << " Error loading " <<libname);
+
+ // look how to get the error message on win
+ //<<dlerror());
+ // it is the bordel !! (the bloody fucking bordel, you mean?)
+ // look : http://msdn2.microsoft.com/en-us/library/ms680582.aspx
+ #endif
+ }
+ }
+ bbtkMessage("output",2,"[" << libname << "] loaded" << std::endl);
+ }