IParentalControlService.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Ryujinx.Common.Logging;
  2. using Ryujinx.HLE.HOS.Services.Arp;
  3. using System;
  4. namespace Ryujinx.HLE.HOS.Services.Pctl.ParentalControlServiceFactory
  5. {
  6. class IParentalControlService : IpcService
  7. {
  8. private int _permissionFlag;
  9. private ulong _titleId;
  10. private bool _freeCommunicationEnabled;
  11. private int[] _ratingAge;
  12. public IParentalControlService(ServiceCtx context, bool withInitialize, int permissionFlag)
  13. {
  14. _permissionFlag = permissionFlag;
  15. if (withInitialize)
  16. {
  17. Initialize(context);
  18. }
  19. }
  20. [Command(1)] // 4.0.0+
  21. // Initialize()
  22. public ResultCode Initialize(ServiceCtx context)
  23. {
  24. if ((_permissionFlag & 0x8001) == 0)
  25. {
  26. return ResultCode.PermissionDenied;
  27. }
  28. ResultCode resultCode = ResultCode.InvalidPid;
  29. if (context.Process.Pid != 0)
  30. {
  31. if ((_permissionFlag & 0x40) == 0)
  32. {
  33. ulong titleId = ApplicationLaunchProperty.GetByPid(context).TitleId;
  34. if (titleId != 0)
  35. {
  36. _titleId = titleId;
  37. // TODO: Call nn::arp::GetApplicationControlProperty here when implemented, if it return ResultCode.Success we assign fields.
  38. _ratingAge = Array.ConvertAll(context.Device.Application.ControlData.Value.RatingAge.ToArray(), Convert.ToInt32);
  39. _freeCommunicationEnabled = context.Device.Application.ControlData.Value.ParentalControl == LibHac.Ns.ParentalControlFlagValue.FreeCommunication;
  40. }
  41. }
  42. if (_titleId != 0)
  43. {
  44. // TODO: Service store some private fields in another static object.
  45. if ((_permissionFlag & 0x8040) == 0)
  46. {
  47. // TODO: Service store TitleId and FreeCommunicationEnabled in another static object.
  48. // When it's done it signal an event in this static object.
  49. Logger.Stub?.PrintStub(LogClass.ServicePctl);
  50. }
  51. }
  52. resultCode = ResultCode.Success;
  53. }
  54. return resultCode;
  55. }
  56. [Command(1001)]
  57. // CheckFreeCommunicationPermission()
  58. public ResultCode CheckFreeCommunicationPermission(ServiceCtx context)
  59. {
  60. Logger.Stub?.PrintStub(LogClass.ServicePctl);
  61. if (!_freeCommunicationEnabled)
  62. {
  63. return ResultCode.FreeCommunicationDisabled;
  64. }
  65. return ResultCode.Success;
  66. }
  67. }
  68. }