ICommonStateGetter.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using Ryujinx.Common.Logging;
  2. using Ryujinx.HLE.HOS.Ipc;
  3. using Ryujinx.HLE.HOS.Kernel;
  4. using System;
  5. using System.Collections.Generic;
  6. using static Ryujinx.HLE.HOS.ErrorCode;
  7. namespace Ryujinx.HLE.HOS.Services.Am
  8. {
  9. class ICommonStateGetter : IpcService
  10. {
  11. private Dictionary<int, ServiceProcessRequest> m_Commands;
  12. public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => m_Commands;
  13. private KEvent DisplayResolutionChangeEvent;
  14. public ICommonStateGetter(Horizon System)
  15. {
  16. m_Commands = new Dictionary<int, ServiceProcessRequest>()
  17. {
  18. { 0, GetEventHandle },
  19. { 1, ReceiveMessage },
  20. { 5, GetOperationMode },
  21. { 6, GetPerformanceMode },
  22. { 8, GetBootMode },
  23. { 9, GetCurrentFocusState },
  24. { 60, GetDefaultDisplayResolution },
  25. { 61, GetDefaultDisplayResolutionChangeEvent }
  26. };
  27. DisplayResolutionChangeEvent = new KEvent(System);
  28. }
  29. public long GetEventHandle(ServiceCtx Context)
  30. {
  31. KEvent Event = Context.Process.AppletState.MessageEvent;
  32. if (Context.Process.HandleTable.GenerateHandle(Event.ReadableEvent, out int Handle) != KernelResult.Success)
  33. {
  34. throw new InvalidOperationException("Out of handles!");
  35. }
  36. Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle);
  37. return 0;
  38. }
  39. public long ReceiveMessage(ServiceCtx Context)
  40. {
  41. if (!Context.Process.AppletState.TryDequeueMessage(out MessageInfo Message))
  42. {
  43. return MakeError(ErrorModule.Am, AmErr.NoMessages);
  44. }
  45. Context.ResponseData.Write((int)Message);
  46. return 0;
  47. }
  48. public long GetOperationMode(ServiceCtx Context)
  49. {
  50. OperationMode Mode = Context.Device.System.State.DockedMode
  51. ? OperationMode.Docked
  52. : OperationMode.Handheld;
  53. Context.ResponseData.Write((byte)Mode);
  54. return 0;
  55. }
  56. public long GetPerformanceMode(ServiceCtx Context)
  57. {
  58. Apm.PerformanceMode Mode = Context.Device.System.State.DockedMode
  59. ? Apm.PerformanceMode.Docked
  60. : Apm.PerformanceMode.Handheld;
  61. Context.ResponseData.Write((int)Mode);
  62. return 0;
  63. }
  64. public long GetBootMode(ServiceCtx Context)
  65. {
  66. Context.ResponseData.Write((byte)0); //Unknown value.
  67. Logger.PrintStub(LogClass.ServiceAm, "Stubbed.");
  68. return 0;
  69. }
  70. public long GetCurrentFocusState(ServiceCtx Context)
  71. {
  72. Context.ResponseData.Write((byte)Context.Process.AppletState.FocusState);
  73. return 0;
  74. }
  75. public long GetDefaultDisplayResolution(ServiceCtx Context)
  76. {
  77. Context.ResponseData.Write(1280);
  78. Context.ResponseData.Write(720);
  79. return 0;
  80. }
  81. public long GetDefaultDisplayResolutionChangeEvent(ServiceCtx Context)
  82. {
  83. if (Context.Process.HandleTable.GenerateHandle(DisplayResolutionChangeEvent.ReadableEvent, out int Handle) != KernelResult.Success)
  84. {
  85. throw new InvalidOperationException("Out of handles!");
  86. }
  87. Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Handle);
  88. Logger.PrintStub(LogClass.ServiceAm, "Stubbed.");
  89. return 0;
  90. }
  91. }
  92. }