mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-26 08:42:45 +01: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…
Reference in a new issue