|
@@ -449,11 +449,7 @@ ResultCode FormatConfig() {
|
|
|
return RESULT_SUCCESS;
|
|
return RESULT_SUCCESS;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void Init() {
|
|
|
|
|
- AddService(new CFG_I_Interface);
|
|
|
|
|
- AddService(new CFG_S_Interface);
|
|
|
|
|
- AddService(new CFG_U_Interface);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ResultCode LoadConfigNANDSaveFile() {
|
|
|
// 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
|