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
|
/**
* 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.
*/
#include "Resources.h"
#include <QString>
#include <QDir>
#include <QFile>
// stdlib only for getenv
#include <cstdlib>
#include <iostream>
using namespace std;
//environment variables
static const char *CLU_INSTALL_DIR = "CLU_INSTALL_DIR";
//return the sole instance
Resources *Resources::Instance() {
static Resources instance;
return &instance;
}
Resources::Resources()
{
//defaultPath
defaultPath = ".";
//executablePath
executablePath = ".";
//installPath
installPath = ".";
char *env;
if ((env = getenv(CLU_INSTALL_DIR)) != 0) {
installPath = QString(env);
}
//homePath
homePath = QDir::homePath();
}
void Resources::setPathToExecutable(QString path) {
executablePath = dirname(path);
}
QString Resources::dirname(QString path) {
QString tempString;
int size = path.size();
tempString = path;
//cout << "tempString is\n" << tempString.toStdString() << "\n";
for (int i = size - 1; i > 0; i--) {
if (tempString[i] == QDir::separator()) {
tempString.chop(size - i);
break;
}
}
//cout << "tempString is\n" << tempString.toStdString() << "\n";
return tempString;
}
void Resources::dump() {
printf("%s => %s [%s]\n%s => %s\n%s => %s\n",
"installPath", installPath.toStdString().c_str(), CLU_INSTALL_DIR,
"executablePath", executablePath.toStdString().c_str(),
"homePath", homePath.toStdString().c_str()
);
};
string Resources::findFile(const char *file, const ResourcePathType where) const {
return findFile(QString(file), where);
}
string Resources::findFile(const string &file, const ResourcePathType where) const {
return findFile(QString(file.c_str()), where);
}
string Resources::findFile(const QString &file, const ResourcePathType where) const {
const QString *path;
switch (where) {
case InstallPath:
path = &installPath;
break;
case ExecutablePath:
path = &executablePath;
break;
case HomePath:
path = &homePath;
break;
default:
path = &defaultPath;
break;
}
QString fileName = *path + QString(QDir::separator()) + file;
// AW: replaced file with qfile, as ICC otherwise complains about redeclaration
QFile qfile(fileName);
qfile.open(QFile::ReadOnly);
if (qfile.isOpen()) {
qfile.close();
return fileName.toStdString();
}
return string(); //not found/readable
}
/* Search for a (QString) file in a succession of likely locations and
* return the full path as (QString).
*/
QString Resources::searchPathsForFile(const QString &fileName) const {
string file = searchPathsForFile(fileName.toStdString());
return QString(file.c_str());
}
/* Search for a (string) file in a succession of likely locations and
* return the full path as (string).
*/
string Resources::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;
}
|