diff --git a/src/core/hle/service/set/set_sys.cpp b/src/core/hle/service/set/set_sys.cpp index 297e78379..165b97dad 100644 --- a/src/core/hle/service/set/set_sys.cpp +++ b/src/core/hle/service/set/set_sys.cpp @@ -75,6 +75,16 @@ void GetFirmwareVersionImpl(HLERequestContext& ctx, GetFirmwareVersionType type) } } // Anonymous namespace +void SET_SYS::SetLanguageCode(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + language_code_setting = rp.PopEnum(); + + LOG_INFO(Service_SET, "called, language_code={}", language_code_setting); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + void SET_SYS::GetFirmwareVersion(HLERequestContext& ctx) { LOG_DEBUG(Service_SET, "called"); GetFirmwareVersionImpl(ctx, GetFirmwareVersionType::Version1); @@ -103,6 +113,33 @@ void SET_SYS::SetAccountSettings(HLERequestContext& ctx) { rb.Push(ResultSuccess); } +void SET_SYS::GetEulaVersions(HLERequestContext& ctx) { + LOG_INFO(Service_SET, "called"); + + ctx.WriteBuffer(eula_versions); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(static_cast(eula_versions.size())); +} + +void SET_SYS::SetEulaVersions(HLERequestContext& ctx) { + const auto elements = ctx.GetReadBufferNumElements(); + const auto buffer_data = ctx.ReadBuffer(); + + LOG_INFO(Service_SET, "called, elements={}", elements); + + eula_versions.resize(elements); + for (std::size_t index = 0; index < elements; index++) { + const std::size_t start_index = index * sizeof(EulaVersion); + memcpy(eula_versions.data() + start_index, buffer_data.data() + start_index, + sizeof(EulaVersion)); + } + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + void SET_SYS::GetColorSetId(HLERequestContext& ctx) { LOG_DEBUG(Service_SET, "called"); @@ -149,7 +186,7 @@ void SET_SYS::GetAccountNotificationSettings(HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); - rb.Push(account_notifications.size()); + rb.Push(static_cast(account_notifications.size())); } void SET_SYS::SetAccountNotificationSettings(HLERequestContext& ctx) { @@ -275,6 +312,16 @@ void SET_SYS::GetQuestFlag(HLERequestContext& ctx) { rb.PushEnum(QuestFlag::Retail); } +void SET_SYS::SetRegionCode(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + region_code = rp.PopEnum(); + + LOG_INFO(Service_SET, "called, region_code={}", region_code); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + void SET_SYS::GetPrimaryAlbumStorage(HLERequestContext& ctx) { LOG_WARNING(Service_SET, "(STUBBED) called"); @@ -286,7 +333,7 @@ void SET_SYS::GetPrimaryAlbumStorage(HLERequestContext& ctx) { void SET_SYS::GetSleepSettings(HLERequestContext& ctx) { LOG_INFO(Service_SET, "called"); - IPC::ResponseBuilder rb{ctx, 7}; + IPC::ResponseBuilder rb{ctx, 5}; rb.Push(ResultSuccess); rb.PushRaw(sleep_settings); } @@ -434,10 +481,18 @@ void SET_SYS::GetChineseTraditionalInputMethod(HLERequestContext& ctx) { rb.PushEnum(ChineseTraditionalInputMethod::Unknown0); } +void SET_SYS::GetFieldTestingFlag(HLERequestContext& ctx) { + LOG_WARNING(Service_SET, "(STUBBED) called"); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(false); +} + SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} { // clang-format off static const FunctionInfo functions[] = { - {0, nullptr, "SetLanguageCode"}, + {0, &SET_SYS::SetLanguageCode, "SetLanguageCode"}, {1, nullptr, "SetNetworkSettings"}, {2, nullptr, "GetNetworkSettings"}, {3, &SET_SYS::GetFirmwareVersion, "GetFirmwareVersion"}, @@ -457,8 +512,8 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} { {18, &SET_SYS::SetAccountSettings, "SetAccountSettings"}, {19, nullptr, "GetAudioVolume"}, {20, nullptr, "SetAudioVolume"}, - {21, nullptr, "GetEulaVersions"}, - {22, nullptr, "SetEulaVersions"}, + {21, &SET_SYS::GetEulaVersions, "GetEulaVersions"}, + {22, &SET_SYS::SetEulaVersions, "SetEulaVersions"}, {23, &SET_SYS::GetColorSetId, "GetColorSetId"}, {24, &SET_SYS::SetColorSetId, "SetColorSetId"}, {25, nullptr, "GetConsoleInformationUploadFlag"}, @@ -491,7 +546,7 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} { {54, nullptr, "SetDeviceTimeZoneLocationName"}, {55, nullptr, "GetWirelessCertificationFileSize"}, {56, nullptr, "GetWirelessCertificationFile"}, - {57, nullptr, "SetRegionCode"}, + {57, &SET_SYS::SetRegionCode, "SetRegionCode"}, {58, nullptr, "GetNetworkSystemClockContext"}, {59, nullptr, "SetNetworkSystemClockContext"}, {60, nullptr, "IsUserSystemClockAutomaticCorrectionEnabled"}, @@ -635,7 +690,7 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} { {198, nullptr, "SetButtonConfigRegisteredSettingsEmbedded"}, {199, nullptr, "GetButtonConfigRegisteredSettings"}, {200, nullptr, "SetButtonConfigRegisteredSettings"}, - {201, nullptr, "GetFieldTestingFlag"}, + {201, &SET_SYS::GetFieldTestingFlag, "GetFieldTestingFlag"}, {202, nullptr, "SetFieldTestingFlag"}, {203, nullptr, "GetPanelCrcMode"}, {204, nullptr, "SetPanelCrcMode"}, diff --git a/src/core/hle/service/set/set_sys.h b/src/core/hle/service/set/set_sys.h index 16624d3fd..c7dba2a9e 100644 --- a/src/core/hle/service/set/set_sys.h +++ b/src/core/hle/service/set/set_sys.h @@ -118,6 +118,22 @@ private: Never, }; + /// This is nn::settings::system::RegionCode + enum class RegionCode : u32 { + Japan, + Usa, + Europe, + Australia, + HongKongTaiwanKorea, + China, + }; + + /// This is nn::settings::system::EulaVersionClockType + enum class EulaVersionClockType : u32 { + NetworkSystemClock, + SteadyClock, + }; + /// This is nn::settings::system::SleepFlag struct SleepFlag { union { @@ -242,10 +258,24 @@ private: }; static_assert(sizeof(InitialLaunchSettings) == 0x20, "InitialLaunchSettings is incorrect size"); + /// This is nn::settings::system::InitialLaunchSettings + struct EulaVersion { + u32 version; + RegionCode region_code; + EulaVersionClockType clock_type; + INSERT_PADDING_BYTES(0x4); + s64 posix_time; + Time::Clock::SteadyClockTimePoint timestamp; + }; + static_assert(sizeof(EulaVersion) == 0x30, "EulaVersion is incorrect size"); + + void SetLanguageCode(HLERequestContext& ctx); void GetFirmwareVersion(HLERequestContext& ctx); void GetFirmwareVersion2(HLERequestContext& ctx); void GetAccountSettings(HLERequestContext& ctx); void SetAccountSettings(HLERequestContext& ctx); + void GetEulaVersions(HLERequestContext& ctx); + void SetEulaVersions(HLERequestContext& ctx); void GetColorSetId(HLERequestContext& ctx); void SetColorSetId(HLERequestContext& ctx); void GetNotificationSettings(HLERequestContext& ctx); @@ -257,6 +287,7 @@ private: void GetTvSettings(HLERequestContext& ctx); void SetTvSettings(HLERequestContext& ctx); void GetQuestFlag(HLERequestContext& ctx); + void SetRegionCode(HLERequestContext& ctx); void GetPrimaryAlbumStorage(HLERequestContext& ctx); void GetSleepSettings(HLERequestContext& ctx); void SetSleepSettings(HLERequestContext& ctx); @@ -273,6 +304,7 @@ private: void SetAppletLaunchFlags(HLERequestContext& ctx); void GetKeyboardLayout(HLERequestContext& ctx); void GetChineseTraditionalInputMethod(HLERequestContext& ctx); + void GetFieldTestingFlag(HLERequestContext& ctx); AccountSettings account_settings{ .flags = {}, @@ -312,6 +344,12 @@ private: }; u32 applet_launch_flag{}; + + std::vector eula_versions{}; + + RegionCode region_code; + + LanguageCode language_code_setting; }; } // namespace Service::Set