aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Ryujinx.HLE/HOS/Services/Settings/ISettingsServer.cs29
-rw-r--r--Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs40
-rw-r--r--Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs31
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 6f106789..703f6163 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<nn::settings::system::DeviceNickName, 0x16>
+ 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 54076b4b..66b768ee 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<nn::settings::system::DeviceNickName, 0x16>
+ 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<nn::settings::system::DeviceNickName, 0x15>)
+ 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 9c63853c..2a6f327b 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<TitleLanguage>(Enum.GetName(typeof(SystemLanguage), language));
- break;
- }
+ SystemLanguage.Taiwanese or
+ SystemLanguage.TraditionalChinese => TitleLanguage.Taiwanese,
+ SystemLanguage.Chinese or
+ SystemLanguage.SimplifiedChinese => TitleLanguage.Chinese,
+ _ => Enum.Parse<TitleLanguage>(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