- 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);
-
- 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);
- 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
-//==================================================
-
-//std::cout << "upath [" << upath << "]" << 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;
-
- // 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);
- path = currentDir;
- }
-
- 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);
-