1 /**
2  * Implements a singleton that maintains program resources.
3  * The single instance is (re)instantiated on demand like:
4  *     Resources *res = Resources::Instance();
5  *
6  * 24-05-07,Nigel Brown(EMBL): created.
7  * 3-7-07, Mark Larkin, modified this class for clustalw
8  */
9 #ifdef HAVE_CONFIG_H
10     #include "config.h"
11 #endif
12 #include "ClustalWResources.h"
13 #include <iostream>
14 #include "clustalw.h"
15 #include <fstream>
16 using namespace std;
17 
18 namespace clustalw
19 {
20 
21 //environment variables
22 static const char *CLUW_INSTALL_DIR = "CLUW_INSTALL_DIR";
23 
24 //return the sole instance
Instance()25 ClustalWResources *ClustalWResources::Instance() {
26     static ClustalWResources instance;
27     return &instance;
28 }
29 
ClustalWResources()30 ClustalWResources::ClustalWResources()
31 {
32     //defaultPath
33     defaultPath = ".";
34 
35     //executablePath
36     executablePath = ".";
37 
38     //installPath
39     installPath = ".";
40     char *env;
41     if ((env = getenv(CLUW_INSTALL_DIR)) != 0)
42     {
43         installPath = string(env);
44     }
45 
46     homePath = "";
47 }
48 
setPathToExecutable(string path)49 void ClustalWResources::setPathToExecutable(string path)
50 {
51     executablePath = dirname(path);
52 }
53 
dirname(string path)54 string ClustalWResources::dirname(string path)
55 {
56     string tempString;
57     int size = path.size();
58     tempString = path;
59     for (int i = size - 1; i > 0; i--)
60     {
61         if (tempString[i] == DIRDELIM) // Mark, no standard function in c++
62         {
63             tempString.erase(i);
64             break;
65         }
66     }
67     return tempString;
68 }
69 
dump()70 void ClustalWResources::dump()
71 {
72     printf("%s => %s [%s]\n%s => %s\n%s => %s\n",
73            "installPath", installPath.c_str(), CLUW_INSTALL_DIR,
74            "executablePath", executablePath.c_str(),
75            "homePath", homePath.c_str()
76            );
77 }
78 
findFile(const char * file,const ClustalWResourcePathType where) const79 string ClustalWResources::findFile(const char *file, const ClustalWResourcePathType where) const
80 {
81     return findFile(string(file), where);
82 }
83 
findFile(const string file,const ClustalWResourcePathType where) const84 string ClustalWResources::findFile(const string file, const ClustalWResourcePathType where) const
85 {
86     const string *path;
87     ifstream ifs;
88 
89     switch (where)
90     {
91         case InstallPath:
92             path = &installPath;
93             break;
94         case ExecutablePath:
95             path = &executablePath;
96             break;
97         case HomePath:
98             path = &homePath;
99             break;
100         default:
101             path = &defaultPath;
102             break;
103     }
104     char delim[1];
105     delim[0] = DIRDELIM;
106     delim[1] = 0;
107 
108     string fileName = *path + string(delim) + file;
109 
110     ifs.open(fileName.c_str(), ifstream::in);
111     if (ifs.fail()) {
112         return string();
113     }
114 
115     if (ifs.is_open() && ifs.good())
116     {
117         ifs.close();
118         return fileName;
119     }
120     return string(); //not found/readable
121 }
122 
123 // Search for a (string) file in a succession of likely locations and
124 // return the full path as (string).
125 //
searchPathsForFile(const string fileName) const126 string ClustalWResources::searchPathsForFile(const string fileName) const
127 {
128     string file;
129     while (1) {
130         file = findFile(fileName, InstallPath);
131         if (file != "") break;
132 
133         file = findFile(fileName, ExecutablePath);
134         if (file != "") break;
135 
136         file = findFile(fileName, HomePath);
137         if (file != "") break;
138 
139         file = findFile(fileName);
140         if (file != "") break;
141 
142         file = fileName; // give up
143         break;
144     }
145     return file;
146 }
147 
148 }
149