diff options
| author | Ac_K <Acoustik666@gmail.com> | 2020-05-15 03:14:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-15 03:14:38 +0200 |
| commit | b2e58559283e184bc85bbb473511a7c8349c0fe5 (patch) | |
| tree | 5e59ff5cfb67cdf3fd4c431ba3e50286a7f38ff1 /Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs | |
| parent | 430a48338b5a0531ed2e675d03f30f0409cf6588 (diff) | |
pctl: refactoring IParentalControlServiceFactory and IParentalControl… (#1219)
* pctl: refactoring IParentalControlServiceFactory and IParentalControlService call
Our previous implementation was totally guessed. Now it's implemented according to RE, even if it's stubbed because we will not support Parental Control for now.
* unknownFlag > permissionFlag
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs')
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs | 62 |
1 files changed, 52 insertions, 10 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs b/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs index 0e7c8432..6768f888 100644 --- a/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs +++ b/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs @@ -1,32 +1,69 @@ using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Services.Arp; +using System; namespace Ryujinx.HLE.HOS.Services.Pctl.ParentalControlServiceFactory { class IParentalControlService : IpcService { - private bool _initialized = false; + private int _permissionFlag; + private ulong _titleId; + private bool _freeCommunicationEnabled; + private int[] _ratingAge; - private bool _needInitialize; - - public IParentalControlService(bool needInitialize = true) + public IParentalControlService(ServiceCtx context, bool withInitialize, int permissionFlag) { - _needInitialize = needInitialize; + _permissionFlag = permissionFlag; + + if (withInitialize) + { + Initialize(context); + } } [Command(1)] // 4.0.0+ // Initialize() public ResultCode Initialize(ServiceCtx context) { - if (_needInitialize && !_initialized) + if ((_permissionFlag & 0x8001) == 0) { - _initialized = true; + return ResultCode.PermissionDenied; } - else + + ResultCode resultCode = ResultCode.InvalidPid; + + if (context.Process.Pid != 0) { - Logger.PrintWarning(LogClass.ServicePctl, "Service is already initialized!"); + if ((_permissionFlag & 0x40) == 0) + { + ulong titleId = ApplicationLaunchProperty.GetByPid(context).TitleId; + + if (titleId != 0) + { + _titleId = titleId; + + // TODO: Call nn::arp::GetApplicationControlProperty here when implemented, if it return ResultCode.Success we assign fields. + _ratingAge = Array.ConvertAll(context.Device.System.ControlData.Value.RatingAge.ToArray(), Convert.ToInt32); + _freeCommunicationEnabled = context.Device.System.ControlData.Value.ParentalControl == LibHac.Ns.ParentalControlFlagValue.FreeCommunication; + } + } + + if (_titleId != 0) + { + // TODO: Service store some private fields in another static object. + + if ((_permissionFlag & 0x8040) == 0) + { + // TODO: Service store TitleId and FreeCommunicationEnabled in another static object. + // When it's done it signal an event in this static object. + Logger.PrintStub(LogClass.ServicePctl); + } + } + + resultCode = ResultCode.Success; } - return ResultCode.Success; + return resultCode; } [Command(1001)] @@ -35,6 +72,11 @@ namespace Ryujinx.HLE.HOS.Services.Pctl.ParentalControlServiceFactory { Logger.PrintStub(LogClass.ServicePctl); + if (!_freeCommunicationEnabled) + { + return ResultCode.FreeCommunicationDisabled; + } + return ResultCode.Success; } } |
