mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Service::CFG/FS: add and refactor out utilities for front-end
This commit is contained in:
		
							parent
							
								
									457b6413e6
								
							
						
					
					
						commit
						ab2eef396a
					
				
					 4 changed files with 146 additions and 15 deletions
				
			
		|  | @ -449,11 +449,7 @@ ResultCode FormatConfig() { | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Init() { | ResultCode LoadConfigNANDSaveFile() { | ||||||
|     AddService(new CFG_I_Interface); |  | ||||||
|     AddService(new CFG_S_Interface); |  | ||||||
|     AddService(new CFG_U_Interface); |  | ||||||
| 
 |  | ||||||
|     // Open the SystemSaveData archive 0x00010017
 |     // Open the SystemSaveData archive 0x00010017
 | ||||||
|     FileSys::Path archive_path(cfg_system_savedata_id); |     FileSys::Path archive_path(cfg_system_savedata_id); | ||||||
|     auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::SystemSaveData, archive_path); |     auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::SystemSaveData, archive_path); | ||||||
|  | @ -481,14 +477,75 @@ void Init() { | ||||||
|     if (config_result.Succeeded()) { |     if (config_result.Succeeded()) { | ||||||
|         auto config = config_result.MoveFrom(); |         auto config = config_result.MoveFrom(); | ||||||
|         config->backend->Read(0, CONFIG_SAVEFILE_SIZE, cfg_config_file_buffer.data()); |         config->backend->Read(0, CONFIG_SAVEFILE_SIZE, cfg_config_file_buffer.data()); | ||||||
|         return; |         return RESULT_SUCCESS; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     FormatConfig(); |     return FormatConfig(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Init() { | ||||||
|  |     AddService(new CFG_I_Interface); | ||||||
|  |     AddService(new CFG_S_Interface); | ||||||
|  |     AddService(new CFG_U_Interface); | ||||||
|  | 
 | ||||||
|  |     LoadConfigNANDSaveFile(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Shutdown() { | void Shutdown() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void SetUsername(const std::u16string& name) { | ||||||
|  |     ASSERT(name.size() <= 10); | ||||||
|  |     UsernameBlock block{}; | ||||||
|  |     name.copy(block.username, name.size()); | ||||||
|  |     SetConfigInfoBlock(UsernameBlockID, sizeof(block), 4, &block); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | std::u16string GetUsername() { | ||||||
|  |     UsernameBlock block; | ||||||
|  |     GetConfigInfoBlock(UsernameBlockID, sizeof(block), 8, &block); | ||||||
|  | 
 | ||||||
|  |     // the username string in the block isn't null-terminated,
 | ||||||
|  |     // so we need to find the end manually.
 | ||||||
|  |     std::u16string username(block.username, ARRAY_SIZE(block.username)); | ||||||
|  |     const size_t pos = username.find(u'\0'); | ||||||
|  |     if (pos != std::u16string::npos) | ||||||
|  |         username.erase(pos); | ||||||
|  |     return username; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SetBirthday(u8 month, u8 day) { | ||||||
|  |     BirthdayBlock block = { month, day }; | ||||||
|  |     SetConfigInfoBlock(BirthdayBlockID, sizeof(block), 4, &block); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | std::tuple<u8, u8> GetBirthday() { | ||||||
|  |     BirthdayBlock block; | ||||||
|  |     GetConfigInfoBlock(BirthdayBlockID, sizeof(block), 8, &block); | ||||||
|  |     return std::make_tuple(block.month, block.day); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SetSystemLanguage(SystemLanguage language) { | ||||||
|  |     u8 block = language; | ||||||
|  |     SetConfigInfoBlock(LanguageBlockID, sizeof(block), 4, &block); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | SystemLanguage GetSystemLanguage() { | ||||||
|  |     u8 block; | ||||||
|  |     GetConfigInfoBlock(LanguageBlockID, sizeof(block), 8, &block); | ||||||
|  |     return static_cast<SystemLanguage>(block); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SetSoundOutputMode(SoundOutputMode mode) { | ||||||
|  |     u8 block = mode; | ||||||
|  |     SetConfigInfoBlock(SoundOutputModeBlockID, sizeof(block), 4, &block); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | SoundOutputMode GetSoundOutputMode() { | ||||||
|  |     u8 block; | ||||||
|  |     GetConfigInfoBlock(SoundOutputModeBlockID, sizeof(block), 8, &block); | ||||||
|  |     return static_cast<SoundOutputMode>(block); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace CFG
 | } // namespace CFG
 | ||||||
| } // namespace Service
 | } // namespace Service
 | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <array> | #include <array> | ||||||
|  | #include <string> | ||||||
| 
 | 
 | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
| 
 | 
 | ||||||
|  | @ -271,11 +272,70 @@ ResultCode UpdateConfigNANDSavegame(); | ||||||
|  */ |  */ | ||||||
| ResultCode FormatConfig(); | ResultCode FormatConfig(); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Open the config savegame file and load it to the memory buffer | ||||||
|  |  * @returns ResultCode indicating the result of the operation, 0 on success | ||||||
|  |  */ | ||||||
|  | ResultCode LoadConfigNANDSaveFile(); | ||||||
|  | 
 | ||||||
| /// Initialize the config service
 | /// Initialize the config service
 | ||||||
| void Init(); | void Init(); | ||||||
| 
 | 
 | ||||||
| /// Shutdown the config service
 | /// Shutdown the config service
 | ||||||
| void Shutdown(); | void Shutdown(); | ||||||
| 
 | 
 | ||||||
|  | // Utilities for frontend to set config data.
 | ||||||
|  | // Note: before calling these functions, LoadConfigNANDSaveFile should be called,
 | ||||||
|  | // and UpdateConfigNANDSavegame should be called after making changes to config data.
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Sets the username in config savegame. | ||||||
|  |  * @param name the username to set. The maximum size is 10 in char16_t. | ||||||
|  |  */ | ||||||
|  | void SetUsername(const std::u16string& name); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Gets the username from config savegame. | ||||||
|  |  * @returns the username | ||||||
|  |  */ | ||||||
|  | std::u16string GetUsername(); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Sets the profile birthday in config savegame. | ||||||
|  |  * @param month the month of birthday. | ||||||
|  |  * @param day the day of the birthday. | ||||||
|  |  */ | ||||||
|  | void SetBirthday(u8 month, u8 day); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Gets the profile birthday from the config savegame. | ||||||
|  |  * @returns a tuple of (month, day) of birthday | ||||||
|  |  */ | ||||||
|  | std::tuple<u8, u8> GetBirthday(); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Sets the system language in config savegame. | ||||||
|  |  * @param language the system language to set. | ||||||
|  |  */ | ||||||
|  | void SetSystemLanguage(SystemLanguage language); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Gets the system language from config savegame. | ||||||
|  |  * @returns the system language | ||||||
|  |  */ | ||||||
|  | SystemLanguage GetSystemLanguage(); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Sets the sound output mode in config savegame. | ||||||
|  |  * @param mode the sound output mode to set | ||||||
|  |  */ | ||||||
|  | void SetSoundOutputMode(SoundOutputMode mode); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Gets the sound output mode from config savegame. | ||||||
|  |  * @returns the sound output mode | ||||||
|  |  */ | ||||||
|  | SoundOutputMode GetSoundOutputMode(); | ||||||
|  | 
 | ||||||
| } // namespace CFG
 | } // namespace CFG
 | ||||||
| } // namespace Service
 | } // namespace Service
 | ||||||
|  |  | ||||||
|  | @ -255,7 +255,7 @@ using FileSys::ArchiveFactory; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Map of registered archives, identified by id code. Once an archive is registered here, it is |  * Map of registered archives, identified by id code. Once an archive is registered here, it is | ||||||
|  * never removed until the FS service is shut down. |  * never removed until UnregisterArchiveTypes is called. | ||||||
|  */ |  */ | ||||||
| static boost::container::flat_map<ArchiveIdCode, std::unique_ptr<ArchiveFactory>> id_code_map; | static boost::container::flat_map<ArchiveIdCode, std::unique_ptr<ArchiveFactory>> id_code_map; | ||||||
| 
 | 
 | ||||||
|  | @ -516,12 +516,7 @@ ResultCode CreateSystemSaveData(u32 high, u32 low) { | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Initialize archives
 | void RegisterArchiveTypes() { | ||||||
| void ArchiveInit() { |  | ||||||
|     next_handle = 1; |  | ||||||
| 
 |  | ||||||
|     AddService(new FS::Interface); |  | ||||||
| 
 |  | ||||||
|     // TODO(Subv): Add the other archive types (see here for the known types:
 |     // TODO(Subv): Add the other archive types (see here for the known types:
 | ||||||
|     // http://3dbrew.org/wiki/FS:OpenArchive#Archive_idcodes).
 |     // http://3dbrew.org/wiki/FS:OpenArchive#Archive_idcodes).
 | ||||||
| 
 | 
 | ||||||
|  | @ -558,10 +553,23 @@ void ArchiveInit() { | ||||||
|     RegisterArchiveType(std::move(systemsavedata_factory), ArchiveIdCode::SystemSaveData); |     RegisterArchiveType(std::move(systemsavedata_factory), ArchiveIdCode::SystemSaveData); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void UnregisterArchiveTypes() { | ||||||
|  |     id_code_map.clear(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Initialize archives
 | ||||||
|  | void ArchiveInit() { | ||||||
|  |     next_handle = 1; | ||||||
|  | 
 | ||||||
|  |     AddService(new FS::Interface); | ||||||
|  | 
 | ||||||
|  |     RegisterArchiveTypes(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /// Shutdown archives
 | /// Shutdown archives
 | ||||||
| void ArchiveShutdown() { | void ArchiveShutdown() { | ||||||
|     handle_map.clear(); |     handle_map.clear(); | ||||||
|     id_code_map.clear(); |     UnregisterArchiveTypes(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| } // namespace FS
 | } // namespace FS
 | ||||||
|  |  | ||||||
|  | @ -235,5 +235,11 @@ void ArchiveInit(); | ||||||
| /// Shutdown archives
 | /// Shutdown archives
 | ||||||
| void ArchiveShutdown(); | void ArchiveShutdown(); | ||||||
| 
 | 
 | ||||||
|  | /// Register all archive types
 | ||||||
|  | void RegisterArchiveTypes(); | ||||||
|  | 
 | ||||||
|  | /// Unregister all archive types
 | ||||||
|  | void UnregisterArchiveTypes(); | ||||||
|  | 
 | ||||||
| } // namespace FS
 | } // namespace FS
 | ||||||
| } // namespace Service
 | } // namespace Service
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue