void DataDirLocater::AddShareDirs() { // always true under Windows and true for `multi-engine` setups under *nix if (IsInstallDirDataDir()) { const std::string dd_curWorkDir = GetBinaryLocation(); AddDirs(dd_curWorkDir); } #if defined(__APPLE__) // Mac OS X Application Bundle (*.app) - single file install // directory structure (Apple standard): // Spring.app/Contents/MacOS/springlobby // Spring.app/Contents/Resources/bin/spring // Spring.app/Contents/Resources/lib/unitsync.dylib // Spring.app/Contents/Resources/share/games/spring/base/ const std::string dd_curWorkDir = GetBinaryLocation(); // This corresponds to Spring.app/Contents/Resources/ const std::string bundleResourceDir = FileSystem::GetParent(dd_curWorkDir); // This has to correspond with the value in the build-script const std::string dd_curWorkDirData = bundleResourceDir + "/share/games/spring"; AddDirs(dd_curWorkDirData); // "Spring.app/Contents/Resources/share/games/spring" #endif #ifdef SPRING_DATADIR // CompilerInfo: using the defineflag SPRING_DATADIR & "SPRING_DATADIR" as string works fine, the preprocessor won't touch the 2nd AddDirs(SPRING_DATADIR); // from -DSPRING_DATADIR, example /usr/games/share/spring/ #endif }
void DataDirLocater::UpdateIsolationModeByEnvVar() { isolationMode = false; isolationModeDir = ""; const char* const envIsolation = getenv("SPRING_ISOLATED"); if (envIsolation != nullptr) { SetIsolationMode(true); SetIsolationModeDir(envIsolation); return; } const std::string dir = GetBinaryLocation(); if (FileSystem::FileExists(dir + "/isolated.txt")) { SetIsolationMode(true); SetIsolationModeDir(dir); } }
void DataDirLocater::AddPortableDir() { const std::string dd_curWorkDir = GetBinaryLocation(); // This is useful in case of multiple engine/unitsync versions installed // together in a sub-dir of the data-dir // The data-dir structure then might look similar to this: // maps/ // games/ // engines/engine-0.83.0.0.exe // engines/engine-0.83.1.0.exe // unitsyncs/unitsync-0.83.0.0.exe // unitsyncs/unitsync-0.83.1.0.exe const std::string curWorkDirParent = FileSystem::GetParent(dd_curWorkDir); if ((curWorkDirParent != "") && LooksLikeMultiVersionDataDir(curWorkDirParent)) { AddDirs(curWorkDirParent); // "../" } AddDirs(dd_curWorkDir); }
bool DataDirLocater::IsPortableMode() { // Test 1 // Check if spring binary & unitsync library are in the same folder if (!IsInstallDirDataDir()) return false; // Test 2 // Check if "springsettings.cfg" is in the same folder, too. const std::string dir = GetBinaryLocation(); if (!FileSystem::FileExists(dir + "/springsettings.cfg")) return false; // Test 3 // Check if the directory is writeable if (!FileSystem::DirIsWritable(dir + "/")) return false; // PortableMode (don't use HomeDirs as writedirs, instead save files next to binary) return true; }
/** * Returns the absolute version of a supplied relative path. * This is very simple, and can only handle "./", but not "../". */ static std::string CreateAbsolutePath(const std::string& relativePath) { if (relativePath.empty()) return relativePath; std::string absolutePath = UnQuote(relativePath); if (absolutePath.length() > 0 && (absolutePath[0] == '/')) { // is already absolute } else { if (absolutePath.find("./") == 0) { // remove initial "./" absolutePath = absolutePath.substr(2); } absolutePath = FileSystemAbstraction::EnsurePathSepAtEnd(GetBinaryLocation()) + absolutePath; } if (!FileSystem::FileExists(absolutePath)) return relativePath; return absolutePath; }