mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	common: decouple getting and setting user paths
paths -> g_paths
This commit is contained in:
		
							parent
							
								
									de1128c60d
								
							
						
					
					
						commit
						d3d53bae83
					
				
					 2 changed files with 36 additions and 45 deletions
				
			
		|  | @ -672,14 +672,19 @@ std::string GetSysDirectory() { | |||
|     return sysDir; | ||||
| } | ||||
| 
 | ||||
| // Returns a string with a Citra data dir or file in the user's home
 | ||||
| // directory. To be used in "multi-user" mode (that is, installed).
 | ||||
| const std::string& GetUserPath(UserPath path, const std::string& new_path) { | ||||
|     static std::unordered_map<UserPath, std::string> paths; | ||||
|     auto& user_path = paths[UserPath::UserDir]; | ||||
| namespace { | ||||
| std::unordered_map<UserPath, std::string> g_paths; | ||||
| } | ||||
| 
 | ||||
|     // Set up all paths and files on the first run
 | ||||
|     if (user_path.empty()) { | ||||
| void SetUserPath(const std::string& path) { | ||||
|     std::string& user_path = g_paths[UserPath::UserDir]; | ||||
| 
 | ||||
|     if (!path.empty() && CreateFullPath(path)) { | ||||
|         LOG_INFO(Common_Filesystem, "Using {} as the user directory", path); | ||||
|         user_path = path; | ||||
|         g_paths.emplace(UserPath::ConfigDir, user_path + CONFIG_DIR DIR_SEP); | ||||
|         g_paths.emplace(UserPath::CacheDir, user_path + CACHE_DIR DIR_SEP); | ||||
|     } else { | ||||
| #ifdef _WIN32 | ||||
|         user_path = GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP; | ||||
|         if (!FileUtil::IsDirectory(user_path)) { | ||||
|  | @ -688,56 +693,40 @@ const std::string& GetUserPath(UserPath path, const std::string& new_path) { | |||
|             LOG_INFO(Common_Filesystem, "Using the local user directory"); | ||||
|         } | ||||
| 
 | ||||
|         paths.emplace(UserPath::ConfigDir, user_path + CONFIG_DIR DIR_SEP); | ||||
|         paths.emplace(UserPath::CacheDir, user_path + CACHE_DIR DIR_SEP); | ||||
|         g_paths.emplace(UserPath::ConfigDir, user_path + CONFIG_DIR DIR_SEP); | ||||
|         g_paths.emplace(UserPath::CacheDir, user_path + CACHE_DIR DIR_SEP); | ||||
| #else | ||||
|         if (FileUtil::Exists(ROOT_DIR DIR_SEP USERDATA_DIR)) { | ||||
|             user_path = ROOT_DIR DIR_SEP USERDATA_DIR DIR_SEP; | ||||
|             paths.emplace(UserPath::ConfigDir, user_path + CONFIG_DIR DIR_SEP); | ||||
|             paths.emplace(UserPath::CacheDir, user_path + CACHE_DIR DIR_SEP); | ||||
|             g_paths.emplace(UserPath::ConfigDir, user_path + CONFIG_DIR DIR_SEP); | ||||
|             g_paths.emplace(UserPath::CacheDir, user_path + CACHE_DIR DIR_SEP); | ||||
|         } else { | ||||
|             std::string data_dir = GetUserDirectory("XDG_DATA_HOME"); | ||||
|             std::string config_dir = GetUserDirectory("XDG_CONFIG_HOME"); | ||||
|             std::string cache_dir = GetUserDirectory("XDG_CACHE_HOME"); | ||||
| 
 | ||||
|             user_path = data_dir + DIR_SEP EMU_DATA_DIR DIR_SEP; | ||||
|             paths.emplace(UserPath::ConfigDir, config_dir + DIR_SEP EMU_DATA_DIR DIR_SEP); | ||||
|             paths.emplace(UserPath::CacheDir, cache_dir + DIR_SEP EMU_DATA_DIR DIR_SEP); | ||||
|             g_paths.emplace(UserPath::ConfigDir, config_dir + DIR_SEP EMU_DATA_DIR DIR_SEP); | ||||
|             g_paths.emplace(UserPath::CacheDir, cache_dir + DIR_SEP EMU_DATA_DIR DIR_SEP); | ||||
|         } | ||||
| #endif | ||||
|         paths.emplace(UserPath::SDMCDir, user_path + SDMC_DIR DIR_SEP); | ||||
|         paths.emplace(UserPath::NANDDir, user_path + NAND_DIR DIR_SEP); | ||||
|         paths.emplace(UserPath::SysDataDir, user_path + SYSDATA_DIR DIR_SEP); | ||||
|         // TODO: Put the logs in a better location for each OS
 | ||||
|         paths.emplace(UserPath::LogDir, user_path + LOG_DIR DIR_SEP); | ||||
|         paths.emplace(UserPath::CheatsDir, user_path + CHEATS_DIR DIR_SEP); | ||||
|         paths.emplace(UserPath::DLLDir, user_path + DLL_DIR DIR_SEP); | ||||
|     } | ||||
|     g_paths.emplace(UserPath::SDMCDir, user_path + SDMC_DIR DIR_SEP); | ||||
|     g_paths.emplace(UserPath::NANDDir, user_path + NAND_DIR DIR_SEP); | ||||
|     g_paths.emplace(UserPath::SysDataDir, user_path + SYSDATA_DIR DIR_SEP); | ||||
|     // TODO: Put the logs in a better location for each OS
 | ||||
|     g_paths.emplace(UserPath::LogDir, user_path + LOG_DIR DIR_SEP); | ||||
|     g_paths.emplace(UserPath::CheatsDir, user_path + CHEATS_DIR DIR_SEP); | ||||
|     g_paths.emplace(UserPath::DLLDir, user_path + DLL_DIR DIR_SEP); | ||||
| } | ||||
| 
 | ||||
|     if (!new_path.empty()) { | ||||
|         if (!FileUtil::IsDirectory(new_path)) { | ||||
|             LOG_ERROR(Common_Filesystem, "Invalid path specified {}", new_path); | ||||
|             return paths[path]; | ||||
|         } else { | ||||
|             paths[path] = new_path; | ||||
|         } | ||||
| 
 | ||||
|         switch (path) { | ||||
|         case UserPath::RootDir: | ||||
|             user_path = paths[UserPath::RootDir] + DIR_SEP; | ||||
|             break; | ||||
| 
 | ||||
|         case UserPath::UserDir: | ||||
|             user_path = paths[UserPath::RootDir] + DIR_SEP; | ||||
|             paths[UserPath::ConfigDir] = user_path + CONFIG_DIR DIR_SEP; | ||||
|             paths[UserPath::CacheDir] = user_path + CACHE_DIR DIR_SEP; | ||||
|             paths[UserPath::SDMCDir] = user_path + SDMC_DIR DIR_SEP; | ||||
|             paths[UserPath::NANDDir] = user_path + NAND_DIR DIR_SEP; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return paths[path]; | ||||
| // Returns a string with a Citra data dir or file in the user's home
 | ||||
| // directory. To be used in "multi-user" mode (that is, installed).
 | ||||
| const std::string& GetUserPath(UserPath path) { | ||||
|     // Set up all paths and files on the first run
 | ||||
|     if (g_paths.empty()) | ||||
|         SetUserPath(); | ||||
|     return g_paths[path]; | ||||
| } | ||||
| 
 | ||||
| size_t WriteStringToFile(bool text_file, const std::string& str, const char* filename) { | ||||
|  |  | |||
|  | @ -123,9 +123,11 @@ void CopyDir(const std::string& source_path, const std::string& dest_path); | |||
| // Set the current directory to given directory
 | ||||
| bool SetCurrentDir(const std::string& directory); | ||||
| 
 | ||||
| void SetUserPath(const std::string& path = ""); | ||||
| 
 | ||||
| // Returns a pointer to a string with a Citra data dir in the user's home
 | ||||
| // directory. To be used in "multi-user" mode (that is, installed).
 | ||||
| const std::string& GetUserPath(UserPath path, const std::string& new_path = ""); | ||||
| const std::string& GetUserPath(UserPath path); | ||||
| 
 | ||||
| // Returns the path to where the sys file are
 | ||||
| std::string GetSysDirectory(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue