/** * Implements a singleton that maintains program resources. * The single instance is (re)instantiated on demand like: * Resources *res = Resources::Instance(); * * 24-05-07,Nigel Brown(EMBL): created. * 3-7-07, Mark Larkin, modified this class for clustalw */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "ClustalWResources.h" #include #include "clustalw.h" #include using namespace std; namespace clustalw { //environment variables static const char *CLUW_INSTALL_DIR = "CLUW_INSTALL_DIR"; //return the sole instance ClustalWResources *ClustalWResources::Instance() { static ClustalWResources instance; return &instance; } ClustalWResources::ClustalWResources() { //defaultPath defaultPath = "."; //executablePath executablePath = "."; //installPath installPath = "."; char *env; if ((env = getenv(CLUW_INSTALL_DIR)) != 0) { installPath = string(env); } homePath = ""; } void ClustalWResources::setPathToExecutable(string path) { executablePath = dirname(path); } string ClustalWResources::dirname(string path) { string tempString; int size = path.size(); tempString = path; for (int i = size - 1; i > 0; i--) { if (tempString[i] == DIRDELIM) // Mark, no standard function in c++ { tempString.erase(i); break; } } return tempString; } void ClustalWResources::dump() { printf("%s => %s [%s]\n%s => %s\n%s => %s\n", "installPath", installPath.c_str(), CLUW_INSTALL_DIR, "executablePath", executablePath.c_str(), "homePath", homePath.c_str() ); } string ClustalWResources::findFile(const char *file, const ClustalWResourcePathType where) const { return findFile(string(file), where); } string ClustalWResources::findFile(const string file, const ClustalWResourcePathType where) const { const string *path; ifstream ifs; switch (where) { case InstallPath: path = &installPath; break; case ExecutablePath: path = &executablePath; break; case HomePath: path = &homePath; break; default: path = &defaultPath; break; } char delim[1]; delim[0] = DIRDELIM; delim[1] = 0; string fileName = *path + string(delim) + file; ifs.open(fileName.c_str(), ifstream::in); if (ifs.fail()) { return string(); } if (ifs.is_open() && ifs.good()) { ifs.close(); return fileName; } return string(); //not found/readable } // Search for a (string) file in a succession of likely locations and // return the full path as (string). // string ClustalWResources::searchPathsForFile(const string fileName) const { string file; while (1) { file = findFile(fileName, InstallPath); if (file != "") break; file = findFile(fileName, ExecutablePath); if (file != "") break; file = findFile(fileName, HomePath); if (file != "") break; file = findFile(fileName); if (file != "") break; file = fileName; // give up break; } return file; } }