Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <mitkStandardFileLocations.h>
00019
00020 #include <mitkConfig.h>
00021 #include <itkObject.h>
00022 #include <itkMacro.h>
00023 #include <itksys/SystemTools.hxx>
00024
00025 #include <algorithm>
00026
00027 mitk::StandardFileLocations::StandardFileLocations()
00028 {
00029 }
00030
00031 mitk::StandardFileLocations::~StandardFileLocations()
00032 {
00033 }
00034
00035 mitk::StandardFileLocations* mitk::StandardFileLocations::GetInstance()
00036 {
00037 static StandardFileLocations::Pointer m_Instance = 0;
00038
00039 if(m_Instance.IsNull())
00040 m_Instance = StandardFileLocations::New();
00041 return m_Instance;
00042 }
00043
00044
00045 void mitk::StandardFileLocations::AddDirectoryForSearch(const char * dir, bool insertInFrontOfSearchList)
00046 {
00047 std::string directory = dir;
00048
00049
00050 FileSearchVectorType::iterator iter;
00051 if(m_SearchDirectories.size() > 0)
00052 {
00053 iter = std::find(m_SearchDirectories.begin(), m_SearchDirectories.end(),std::string(dir));
00054 if ( iter != m_SearchDirectories.end() )
00055 return;
00056 }
00057
00058 if(insertInFrontOfSearchList)
00059 {
00060 FileSearchVectorType::iterator it = m_SearchDirectories.begin();
00061 m_SearchDirectories.insert(it,std::string(dir));
00062 }
00063 else
00064 m_SearchDirectories.push_back(std::string(dir));
00065 }
00066
00067 void mitk::StandardFileLocations::RemoveDirectoryForSearch(const char * dir)
00068 {
00069 FileSearchVectorType::iterator it;
00070
00071 if(m_SearchDirectories.size() > 0)
00072 {
00073 it = std::find(m_SearchDirectories.begin(), m_SearchDirectories.end(),std::string(dir));
00074 if(it != m_SearchDirectories.end())
00075 {
00076 m_SearchDirectories.erase(it);
00077 return;
00078 }
00079 }
00080 }
00081
00082 std::string mitk::StandardFileLocations::SearchDirectoriesForFile(const char * filename)
00083 {
00084 FileSearchVectorType::iterator it;
00085
00086 for(it = m_SearchDirectories.begin(); it != m_SearchDirectories.end(); it++)
00087 {
00088 std::string currDir = (*it);
00089
00090
00091 if(currDir.find_last_of("\\")+1 != currDir.size() || currDir.find_last_of("/")+1 != currDir.size())
00092 currDir += "/";
00093
00094
00095 currDir += filename;
00096
00097
00098 if(currDir.find_last_of("\\")+1 == currDir.size() || currDir.find_last_of("/")+1 == currDir.size())
00099 currDir.erase(currDir.size()-1,currDir.size());
00100
00101
00102 currDir = itksys::SystemTools::ConvertToOutputPath(currDir.c_str());
00103
00104
00105
00106 if(currDir.find_last_of("\"")+1 == currDir.size())
00107 currDir.erase(currDir.size()-1,currDir.size());
00108 if(currDir.find_last_of("\"") == 0)
00109 currDir.erase(0,1);
00110
00111
00112 if(itksys::SystemTools::FileExists(currDir.c_str()))
00113 return currDir;
00114 }
00115 return std::string("");
00116 }
00117
00118 std::string mitk::StandardFileLocations::FindFile(const char* filename, const char* pathInSourceDir)
00119 {
00120 std::string directoryPath;
00121
00122
00123 const char* mitkConf = itksys::SystemTools::GetEnv("MITKCONF");
00124 if (mitkConf!=NULL)
00125 AddDirectoryForSearch(mitkConf, false);
00126
00127
00128 #if defined(_WIN32) && !defined(__CYGWIN__)
00129 const char* homeDrive = itksys::SystemTools::GetEnv("HOMEDRIVE");
00130 const char* homePath = itksys::SystemTools::GetEnv("HOMEPATH");
00131
00132 if((homeDrive!=NULL) || (homePath!=NULL))
00133 {
00134 directoryPath = homeDrive;
00135 directoryPath += homePath;
00136 directoryPath += "/.mitk/";
00137 AddDirectoryForSearch(directoryPath.c_str(), false);
00138 }
00139
00140 #else
00141 const char* homeDirectory = itksys::SystemTools::GetEnv("HOME");
00142 if(homeDirectory != NULL)
00143 {
00144 directoryPath = homeDirectory;
00145 directoryPath += "/.mitk/";
00146 AddDirectoryForSearch(directoryPath.c_str(), false);
00147 }
00148
00149 #endif // defined(_WIN32) && !defined(__CYGWIN__)
00150
00151
00152 directoryPath = "";
00153 AddDirectoryForSearch(directoryPath.c_str());
00154
00155 directoryPath = itksys::SystemTools::GetCurrentWorkingDirectory();
00156 AddDirectoryForSearch(directoryPath.c_str(), false);
00157
00158 std::string directoryBinPath = directoryPath + "/bin";
00159 AddDirectoryForSearch(directoryBinPath.c_str(), false);
00160
00161 directoryPath = MITK_ROOT;
00162 if (pathInSourceDir)
00163 {
00164 directoryPath += pathInSourceDir;
00165 }
00166 directoryPath += '/';
00167 AddDirectoryForSearch(directoryPath.c_str(), false);
00168
00169 return SearchDirectoriesForFile(filename);
00170 }
00171
00172 std::string mitk::StandardFileLocations::GetOptionDirectory()
00173 {
00174 const char* mitkoptions = itksys::SystemTools::GetEnv("MITKOPTIONS");
00175 std::string optionsDirectory;
00176
00177 if (mitkoptions!=NULL)
00178 {
00179
00180 optionsDirectory = mitkoptions;
00181 optionsDirectory += "/";
00182 }
00183 else
00184 {
00185
00186 std::string homeDirectory;
00187 #if defined(_WIN32) && !defined(__CYGWIN__)
00188 const char* homeDrive = itksys::SystemTools::GetEnv("HOMEDRIVE");
00189 const char* homePath = itksys::SystemTools::GetEnv("HOMEPATH");
00190 if((homeDrive==NULL) || (homePath==NULL))
00191 {
00192 itkGenericOutputMacro( << "Environment variables HOMEDRIVE and/or HOMEPATH not set" <<
00193 ". Using current working directory as home directory: " << itksys::SystemTools::GetCurrentWorkingDirectory());
00194 homeDirectory = itksys::SystemTools::GetCurrentWorkingDirectory();
00195 }
00196 else
00197 {
00198 homeDirectory = homeDrive;
00199 homeDirectory +=homePath;
00200 }
00201 if(itksys::SystemTools::FileExists(homeDirectory.c_str())==false)
00202 {
00203 itkGenericOutputMacro( << "Could not find home directory at " << homeDirectory <<
00204 ". Using current working directory as home directory: " << itksys::SystemTools::GetCurrentWorkingDirectory());
00205 homeDirectory = itksys::SystemTools::GetCurrentWorkingDirectory();
00206 }
00207 #else
00208 const char* home = itksys::SystemTools::GetEnv("HOME");
00209 if(home==NULL)
00210 {
00211 itkGenericOutputMacro( << "Environment variable HOME not set" <<
00212 ". Using current working directory as home directory: " << itksys::SystemTools::GetCurrentWorkingDirectory());
00213 homeDirectory = itksys::SystemTools::GetCurrentWorkingDirectory();
00214 }
00215 else
00216 homeDirectory = home;
00217 if(itksys::SystemTools::FileExists(homeDirectory.c_str())==false)
00218 {
00219 itkGenericOutputMacro( << "Could not find home directory at " << homeDirectory <<
00220 ". Using current working directory as home directory: " << itksys::SystemTools::GetCurrentWorkingDirectory());
00221 homeDirectory = itksys::SystemTools::GetCurrentWorkingDirectory();
00222 }
00223 #endif // defined(_WIN32) && !defined(__CYGWIN__)
00224
00225 optionsDirectory = homeDirectory;
00226 optionsDirectory += "/.mitk";
00227 }
00228
00229 optionsDirectory = itksys::SystemTools::ConvertToOutputPath(optionsDirectory.c_str());
00230 if(itksys::SystemTools::CountChar(optionsDirectory.c_str(),'"') > 0)
00231 {
00232 char * unquoted = itksys::SystemTools::RemoveChars(optionsDirectory.c_str(),"\"");
00233 optionsDirectory = unquoted;
00234 delete [] unquoted;
00235 }
00236
00237 if(itksys::SystemTools::MakeDirectory(optionsDirectory.c_str())==false)
00238 {
00239 itkGenericExceptionMacro( << "Could not create .mitk directory at " << optionsDirectory );
00240 }
00241 return optionsDirectory;
00242 }