ISettingsServer.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using Ryujinx.Common.Logging;
  2. using Ryujinx.HLE.HOS.SystemState;
  3. using System;
  4. namespace Ryujinx.HLE.HOS.Services.Settings
  5. {
  6. [Service("set")]
  7. class ISettingsServer : IpcService
  8. {
  9. public ISettingsServer(ServiceCtx context) { }
  10. [Command(0)]
  11. // GetLanguageCode() -> nn::settings::LanguageCode
  12. public ResultCode GetLanguageCode(ServiceCtx context)
  13. {
  14. context.ResponseData.Write(context.Device.System.State.DesiredLanguageCode);
  15. return ResultCode.Success;
  16. }
  17. [Command(1)]
  18. // GetAvailableLanguageCodes() -> (u32, buffer<nn::settings::LanguageCode, 0xa>)
  19. public ResultCode GetAvailableLanguageCodes(ServiceCtx context)
  20. {
  21. return GetAvailableLanguagesCodesImpl(
  22. context,
  23. context.Request.RecvListBuff[0].Position,
  24. context.Request.RecvListBuff[0].Size,
  25. 0xF);
  26. }
  27. [Command(2)] // 4.0.0+
  28. // MakeLanguageCode(nn::settings::Language language_index) -> nn::settings::LanguageCode
  29. public ResultCode MakeLanguageCode(ServiceCtx context)
  30. {
  31. int languageIndex = context.RequestData.ReadInt32();
  32. if ((uint)languageIndex >= (uint)SystemStateMgr.LanguageCodes.Length)
  33. {
  34. return ResultCode.LanguageOutOfRange;
  35. }
  36. context.ResponseData.Write(SystemStateMgr.GetLanguageCode(languageIndex));
  37. return ResultCode.Success;
  38. }
  39. [Command(3)]
  40. // GetAvailableLanguageCodeCount() -> u32
  41. public ResultCode GetAvailableLanguageCodeCount(ServiceCtx context)
  42. {
  43. context.ResponseData.Write(Math.Min(SystemStateMgr.LanguageCodes.Length, 0xF));
  44. return ResultCode.Success;
  45. }
  46. [Command(4)]
  47. // GetRegionCode() -> u32 nn::settings::RegionCode
  48. public ResultCode GetRegionCode(ServiceCtx context)
  49. {
  50. // NOTE: Service mount 0x8000000000000050 savedata and read the region code here.
  51. SystemRegion regionCode = (SystemRegion)context.Device.System.State.DesiredRegionCode;
  52. if (regionCode < SystemRegion.Min || regionCode > SystemRegion.Max)
  53. {
  54. regionCode = SystemRegion.USA;
  55. }
  56. context.ResponseData.Write((uint)regionCode);
  57. return ResultCode.Success;
  58. }
  59. [Command(5)]
  60. // GetAvailableLanguageCodes2() -> (u32, buffer<nn::settings::LanguageCode, 6>)
  61. public ResultCode GetAvailableLanguageCodes2(ServiceCtx context)
  62. {
  63. return GetAvailableLanguagesCodesImpl(
  64. context,
  65. context.Request.ReceiveBuff[0].Position,
  66. context.Request.ReceiveBuff[0].Size,
  67. SystemStateMgr.LanguageCodes.Length);
  68. }
  69. [Command(6)]
  70. // GetAvailableLanguageCodeCount2() -> u32
  71. public ResultCode GetAvailableLanguageCodeCount2(ServiceCtx context)
  72. {
  73. context.ResponseData.Write(SystemStateMgr.LanguageCodes.Length);
  74. return ResultCode.Success;
  75. }
  76. [Command(8)] // 5.0.0+
  77. // GetQuestFlag() -> bool
  78. public ResultCode GetQuestFlag(ServiceCtx context)
  79. {
  80. context.ResponseData.Write(false);
  81. Logger.PrintStub(LogClass.ServiceSet);
  82. return ResultCode.Success;
  83. }
  84. public ResultCode GetAvailableLanguagesCodesImpl(ServiceCtx context, long position, long size, int maxSize)
  85. {
  86. int count = (int)(size / 8);
  87. if (count > maxSize)
  88. {
  89. count = maxSize;
  90. }
  91. for (int index = 0; index < count; index++)
  92. {
  93. context.Memory.WriteInt64(position, SystemStateMgr.GetLanguageCode(index));
  94. position += 8;
  95. }
  96. context.ResponseData.Write(count);
  97. return ResultCode.Success;
  98. }
  99. }
  100. }