1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
/**
* 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 <iostream>
#include "clustalw.h"
#include <fstream>
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;
}
}
|