/** Creates a directory for an addon. * \param addons_name Name of the directory to create. * \param addons_type The type, which is used as a subdirectory. E.g.: * 'karts' (m_addons_dir/karts/name will be created). */ void FileManager::checkAndCreateDirForAddons(const std::string &dir) { // Tries to create directory recursively bool success = checkAndCreateDirectoryP(dir); if(!success) { Log::warn("FileManager", "There is a problem with the addons dir."); return; } } // checkAndCreateDirForAddons
/** Returns the theoretical location of the cached version of a texture * depending of the current config. (This function also works for directories: * in this case the returned directory will be the cache location for all * textures that you will find in the specified directory. The specified * directory must end with '/') * \note The returned location is where the cached data should be read or * written but the file itseft does not necessarity exist. However, the * directory structure is automatically created if it does not exist. */ std::string FileManager::getTextureCacheLocation(const std::string& filename) { std::string file = StringUtils::getBasename(filename); std::string parent_dir = StringUtils::getPath(filename); if (StringUtils::hasSuffix(parent_dir, "/")) parent_dir = parent_dir.substr(0, parent_dir.size() - 1); parent_dir = StringUtils::getBasename(parent_dir); std::string cache_subdir = (UserConfigParams::m_high_definition_textures & 0x01) == 0x01 ? "hd/" : "resized/"; std::string cached_file = getCachedTexturesDir() + cache_subdir + parent_dir + "/"; checkAndCreateDirectoryP(cached_file); cached_file += file; return cached_file; } // getTextureCacheLocation
/** Find a directory to use for remaining unix variants. Use the new standards * for config directory based on XDG_* environment variables, or a * subdirectory under $HOME, trying two different fallbacks. It will also * check if the directory 'dirname' can be created (to avoid problems that * e.g. $env_name is '/', which exists, but can not be written to. * \param env_name Name of the environment variable to test first. * \param dir_name Name of the directory to create * \param fallback1 Subdirectory under $HOME to use if the environment * variable is not defined or can not be created. * \param fallback2 Subdirectory under $HOME to use if the environment * variable and fallback1 are not defined or can not be created. */ std::string FileManager::checkAndCreateLinuxDir(const char *env_name, const char *dir_name, const char *fallback1, const char *fallback2) { bool dir_ok = false; std::string dir; if (getenv(env_name)!=NULL) { dir = getenv(env_name); dir_ok = checkAndCreateDirectory(dir); if(!dir_ok) Log::warn("FileManager", "Cannot create $%s.", env_name); if(dir[dir.size()-1]!='/') dir += "/"; // Do an additional test here, e.g. in case that XDG_DATA_HOME is '/' // and since dir_ok is set, it would not test any of the other options // like $HOME/.local/share dir_ok = checkAndCreateDirectory(dir+dir_name); if(!dir_ok) Log::warn("FileManager", "Cannot create $%s/%s.", dir.c_str(), dir_name); } if(!dir_ok && getenv("HOME")) { // Use ~/.local/share : dir = getenv("HOME"); if(dir.size()>0 && dir[dir.size()-1]!='/') dir += "/"; dir += fallback1; // This will create each individual subdirectory if // dir_name contains "/". dir_ok = checkAndCreateDirectoryP(dir); if(!dir_ok) Log::warn("FileManager", "Cannot create $HOME/%s.", fallback1); } if(!dir_ok && fallback2 && getenv("HOME")) { dir = getenv("HOME"); if(dir.size()>0 && dir[dir.size()-1]!='/') dir += "/"; dir += fallback2; dir_ok = checkAndCreateDirectory(dir); if(!dir_ok) Log::warn("FileManager", "Cannot create $HOME/%s.", fallback2); } if(!dir_ok) { Log::warn("FileManager", "Falling back to use '.'."); dir = "./"; } if(dir.size()>0 && dir[dir.size()-1]!='/') dir += "/"; dir += dir_name; dir_ok = checkAndCreateDirectory(dir); if(!dir_ok) { // If the directory can not be created Log::error("FileManager", "Cannot create directory '%s', " "falling back to use '.'.", dir.c_str()); dir="./"; } if(dir.size()>0 && dir[dir.size()-1]!='/') dir += "/"; return dir; } // checkAndCreateLinuxDir
/** Checks if the config directory exists, and it not, tries to create it. * It will set m_user_config_dir to the path to which user-specific config * files are stored. */ void FileManager::checkAndCreateConfigDir() { if(getenv("SUPERTUXKART_SAVEDIR") && checkAndCreateDirectory(getenv("SUPERTUXKART_SAVEDIR")) ) { m_user_config_dir = getenv("SUPERTUXKART_SAVEDIR"); } else { #if defined(WIN32) || defined(__CYGWIN__) // Try to use the APPDATA directory to store config files and highscore // lists. If not defined, used the current directory. if (getenv("APPDATA") != NULL) { m_user_config_dir = getenv("APPDATA"); if (!checkAndCreateDirectory(m_user_config_dir)) { Log::error("[FileManager]", "Can't create config dir '%s" ", falling back to '.'.", m_user_config_dir.c_str()); m_user_config_dir = "."; } } else m_user_config_dir = "."; m_user_config_dir += "/supertuxkart"; #elif defined(__APPLE__) if (getenv("HOME") != NULL) { m_user_config_dir = getenv("HOME"); } else { Log::error("[FileManager]", "No home directory, this should NOT happen!"); // Fall back to system-wide app data (rather than // user-specific data), but should not happen anyway. m_user_config_dir = ""; } m_user_config_dir += "/Library/Application Support/"; const std::string CONFIGDIR("SuperTuxKart"); m_user_config_dir += CONFIGDIR; #else // Remaining unix variants. Use the new standards for config directory // i.e. either XDG_CONFIG_HOME or $HOME/.config if (getenv("XDG_CONFIG_HOME") !=NULL) { m_user_config_dir = getenv("XDG_CONFIG_HOME"); checkAndCreateDirectory(m_user_config_dir); } else if (!getenv("HOME")) { Log::error("[FileManager]", "No home directory, this should NOT happen " "- trying '.' for config files!"); m_user_config_dir = "."; } else { m_user_config_dir = getenv("HOME"); checkAndCreateDirectory(m_user_config_dir); m_user_config_dir += "/.config"; if(!checkAndCreateDirectory(m_user_config_dir)) { // If $HOME/.config can not be created: Log::error("[FileManager]", "Cannot create directory '%s', falling back to use '%s'", m_user_config_dir.c_str(), getenv("HOME")); m_user_config_dir = getenv("HOME"); } } m_user_config_dir += "/supertuxkart"; #endif } // if(getenv("SUPERTUXKART_SAVEDIR") && checkAndCreateDirectory(...)) if(m_user_config_dir.size()>0 && *m_user_config_dir.rbegin()!='/') m_user_config_dir += "/"; m_user_config_dir +="0.8.2/"; if(!checkAndCreateDirectoryP(m_user_config_dir)) { Log::warn("FileManager", "Can not create config dir '%s', " "falling back to '.'.", m_user_config_dir.c_str()); m_user_config_dir = "./"; } return; } // checkAndCreateConfigDir