From e053663f27132baec4a4d7c223894eb0322c6c03 Mon Sep 17 00:00:00 2001 From: Ac_K Date: Thu, 24 Jun 2021 01:18:36 +0200 Subject: [PATCH] settings: Implement GetDeviceNickName and SetDeviceNickName (#2383) * settings: Implement GetDeviceNickName and SetDeviceNickName This PR implement `set` and `sys:set` calls : `GetDeviceNickName` and `SetDeviceNickName` accordingly to RE. I've cleaned up both services a bit and `SystemStateMgr` class too. Closes #2110 * Addresses gdkchan_s feedback --- .../HOS/Services/Settings/ISettingsServer.cs | 29 ++++++++++++-- .../Settings/ISystemSettingsServer.cs | 40 ++++++++++++++++++- Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs | 31 ++++++-------- 3 files changed, 77 insertions(+), 23 deletions(-) diff --git a/Ryujinx.HLE/HOS/Services/Settings/ISettingsServer.cs b/Ryujinx.HLE/HOS/Services/Settings/ISettingsServer.cs index 6f10678998..703f61632c 100644 --- a/Ryujinx.HLE/HOS/Services/Settings/ISettingsServer.cs +++ b/Ryujinx.HLE/HOS/Services/Settings/ISettingsServer.cs @@ -1,6 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.SystemState; using System; +using System.Text; namespace Ryujinx.HLE.HOS.Services.Settings { @@ -117,11 +118,33 @@ namespace Ryujinx.HLE.HOS.Services.Settings return GetKeyCodeMapImpl(context, 2); } - public ResultCode GetKeyCodeMapImpl(ServiceCtx context, int version) + [CommandHipc(11)] // 10.1.0+ + // GetDeviceNickName() -> buffer + public ResultCode GetDeviceNickName(ServiceCtx context) + { + ulong deviceNickNameBufferPosition = context.Request.ReceiveBuff[0].Position; + ulong deviceNickNameBufferSize = context.Request.ReceiveBuff[0].Size; + + if (deviceNickNameBufferPosition == 0) + { + return ResultCode.NullDeviceNicknameBuffer; + } + + if (deviceNickNameBufferSize != 0x80) + { + Logger.Warning?.Print(LogClass.ServiceSet, "Wrong buffer size"); + } + + context.Memory.Write(deviceNickNameBufferPosition, Encoding.ASCII.GetBytes(context.Device.System.State.DeviceNickName + '\0')); + + return ResultCode.Success; + } + + private ResultCode GetKeyCodeMapImpl(ServiceCtx context, int version) { if (context.Request.ReceiveBuff[0].Size != 0x1000) { - Logger.Warning?.Print(LogClass.ServiceSet, "Bad size"); + Logger.Warning?.Print(LogClass.ServiceSet, "Wrong buffer size"); } byte[] keyCodeMap; @@ -200,7 +223,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings return ResultCode.Success; } - public ResultCode GetAvailableLanguagesCodesImpl(ServiceCtx context, ulong position, ulong size, int maxSize) + private ResultCode GetAvailableLanguagesCodesImpl(ServiceCtx context, ulong position, ulong size, int maxSize) { int count = (int)(size / 8); diff --git a/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs b/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs index 54076b4b35..66b768eee4 100644 --- a/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs +++ b/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs @@ -228,7 +228,45 @@ namespace Ryujinx.HLE.HOS.Services.Settings // NOTE: When set to true, is automatically synced with the internet. context.ResponseData.Write(true); - Logger.Stub?.PrintStub(LogClass.ServiceSet, "Stubbed"); + Logger.Stub?.PrintStub(LogClass.ServiceSet); + + return ResultCode.Success; + } + + [CommandHipc(77)] + // GetDeviceNickName() -> buffer + public ResultCode GetDeviceNickName(ServiceCtx context) + { + ulong deviceNickNameBufferPosition = context.Request.ReceiveBuff[0].Position; + ulong deviceNickNameBufferSize = context.Request.ReceiveBuff[0].Size; + + if (deviceNickNameBufferPosition == 0) + { + return ResultCode.NullDeviceNicknameBuffer; + } + + if (deviceNickNameBufferSize != 0x80) + { + Logger.Warning?.Print(LogClass.ServiceSet, "Wrong buffer size"); + } + + context.Memory.Write(deviceNickNameBufferPosition, Encoding.ASCII.GetBytes(context.Device.System.State.DeviceNickName + '\0')); + + return ResultCode.Success; + } + + [CommandHipc(78)] + // SetDeviceNickName(buffer) + public ResultCode SetDeviceNickName(ServiceCtx context) + { + ulong deviceNickNameBufferPosition = context.Request.SendBuff[0].Position; + ulong deviceNickNameBufferSize = context.Request.SendBuff[0].Size; + + byte[] deviceNickNameBuffer = new byte[deviceNickNameBufferSize]; + + context.Memory.Read(deviceNickNameBufferPosition, deviceNickNameBuffer); + + context.Device.System.State.DeviceNickName = Encoding.ASCII.GetString(deviceNickNameBuffer); return ResultCode.Success; } diff --git a/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs b/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs index 9c63853cba..2a6f327b16 100644 --- a/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs +++ b/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs @@ -35,39 +35,32 @@ namespace Ryujinx.HLE.HOS.SystemState public TitleLanguage DesiredTitleLanguage { get; private set; } - internal string ActiveAudioOutput { get; private set; } - public bool DockedMode { get; set; } public ColorSet ThemeColor { get; set; } - public bool InstallContents { get; set; } + public string DeviceNickName { get; set; } public SystemStateMgr() { - // TODO: Let user specify. + // TODO: Let user specify fields. DesiredKeyboardLayout = (long)KeyboardLayout.Default; + DeviceNickName = "Ryujinx's Switch"; } public void SetLanguage(SystemLanguage language) { DesiredSystemLanguage = language; - DesiredLanguageCode = GetLanguageCode((int)DesiredSystemLanguage); + DesiredLanguageCode = GetLanguageCode((int)DesiredSystemLanguage); - switch (language) + DesiredTitleLanguage = language switch { - case SystemLanguage.Taiwanese: - case SystemLanguage.TraditionalChinese: - DesiredTitleLanguage = TitleLanguage.Taiwanese; - break; - case SystemLanguage.Chinese: - case SystemLanguage.SimplifiedChinese: - DesiredTitleLanguage = TitleLanguage.Chinese; - break; - default: - DesiredTitleLanguage = Enum.Parse(Enum.GetName(typeof(SystemLanguage), language)); - break; - } + SystemLanguage.Taiwanese or + SystemLanguage.TraditionalChinese => TitleLanguage.Taiwanese, + SystemLanguage.Chinese or + SystemLanguage.SimplifiedChinese => TitleLanguage.Chinese, + _ => Enum.Parse(Enum.GetName(typeof(SystemLanguage), language)), + }; } public void SetRegion(RegionCode region) @@ -93,4 +86,4 @@ namespace Ryujinx.HLE.HOS.SystemState return code; } } -} +} \ No newline at end of file