diff options
author | gdkchan <gab.dark.100@gmail.com> | 2022-09-27 21:24:52 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-27 21:24:52 -0300 |
commit | 1fd5cf2b4a6f592cc8df945e540ea523a799bb97 (patch) | |
tree | 6962acb9dc2461cbe0eebc45a7e5ce84d5c10693 | |
parent | 814f75142e8e4e81741a859db8189ca60535f3e6 (diff) |
Fix ListOpenContextStoredUsers and stub LoadOpenContext (#3718)1.1.280
* Fix ListOpenContextStoredUsers and stub LoadOpenContext
* Remove nonsensical comment
4 files changed, 32 insertions, 15 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/AccountManager.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/AccountManager.cs index 9d9cb6ff..41d5028f 100644 --- a/Ryujinx.HLE/HOS/Services/Account/Acc/AccountManager.cs +++ b/Ryujinx.HLE/HOS/Services/Account/Acc/AccountManager.cs @@ -22,7 +22,8 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc // outside of the AccountManager. private readonly HorizonClient _horizonClient; - private ConcurrentDictionary<string, UserProfile> _profiles; + private readonly ConcurrentDictionary<string, UserProfile> _profiles; + private UserProfile[] _storedOpenedUsers; public UserProfile LastOpenedUser { get; private set; } @@ -31,6 +32,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc _horizonClient = horizonClient; _profiles = new ConcurrentDictionary<string, UserProfile>(); + _storedOpenedUsers = Array.Empty<UserProfile>(); _accountSaveDataManager = new AccountSaveDataManager(_profiles); @@ -44,9 +46,9 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc } else { - UserId commandLineUserProfileOverride = default; + UserId commandLineUserProfileOverride = default; if (!string.IsNullOrEmpty(initialProfileName)) - { + { commandLineUserProfileOverride = _profiles.Values.FirstOrDefault(x => x.Name == initialProfileName)?.UserId ?? default; if (commandLineUserProfileOverride.IsNull) Logger.Warning?.Print(LogClass.Application, $"The command line specified profile named '{initialProfileName}' was not found"); @@ -221,6 +223,16 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc return _profiles.Values.Where(x => x.AccountState == AccountState.Open); } + internal IEnumerable<UserProfile> GetStoredOpenedUsers() + { + return _storedOpenedUsers; + } + + internal void StoreOpenedUsers() + { + _storedOpenedUsers = _profiles.Values.Where(x => x.AccountState == AccountState.Open).ToArray(); + } + internal UserProfile GetFirst() { return _profiles.First().Value; diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs index d74f5ecf..011accd2 100644 --- a/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs +++ b/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs @@ -162,7 +162,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService public ResultCode StoreOpenContext(ServiceCtx context) { - Logger.Stub?.PrintStub(LogClass.ServiceAcc); + context.Device.System.AccountManager.StoreOpenedUsers(); return ResultCode.Success; } diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/ApplicationServiceServer.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/ApplicationServiceServer.cs index aa687360..7b474f0e 100644 --- a/Ryujinx.HLE/HOS/Services/Account/Acc/ApplicationServiceServer.cs +++ b/Ryujinx.HLE/HOS/Services/Account/Acc/ApplicationServiceServer.cs @@ -201,6 +201,11 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc return ResultCode.Success; } + public ResultCode ListOpenContextStoredUsers(ServiceCtx context) + { + return WriteUserList(context, context.Device.System.AccountManager.GetStoredOpenedUsers()); + } + public ResultCode ListQualifiedUsers(ServiceCtx context) { // TODO: Determine how users are "qualified". We assume all users are "qualified" for now. diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/IAccountServiceForApplication.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/IAccountServiceForApplication.cs index 4de0b34b..92082322 100644 --- a/Ryujinx.HLE/HOS/Services/Account/Acc/IAccountServiceForApplication.cs +++ b/Ryujinx.HLE/HOS/Services/Account/Acc/IAccountServiceForApplication.cs @@ -1,5 +1,4 @@ using Ryujinx.Common.Logging; -using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Services.Account.Acc.AccountService; using Ryujinx.HLE.HOS.Services.Arp; @@ -139,22 +138,23 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc return _applicationServiceServer.ClearSaveDataThumbnail(context); } - [CommandHipc(131)] // 6.0.0+ - // ListOpenContextStoredUsers() -> array<nn::account::Uid, 0xa> - public ResultCode ListOpenContextStoredUsers(ServiceCtx context) + [CommandHipc(130)] // 5.0.0+ + // LoadOpenContext(nn::account::Uid) + public ResultCode LoadOpenContext(ServiceCtx context) { - ulong outputPosition = context.Request.RecvListBuff[0].Position; - ulong outputSize = context.Request.RecvListBuff[0].Size; - - MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize); - - // TODO: This seems to write stored userids of the OpenContext in the buffer. We needs to determine them. - Logger.Stub?.PrintStub(LogClass.ServiceAcc); return ResultCode.Success; } + [CommandHipc(60)] // 5.0.0-5.1.0 + [CommandHipc(131)] // 6.0.0+ + // ListOpenContextStoredUsers() -> array<nn::account::Uid, 0xa> + public ResultCode ListOpenContextStoredUsers(ServiceCtx context) + { + return _applicationServiceServer.ListOpenContextStoredUsers(context); + } + [CommandHipc(141)] // 6.0.0+ // ListQualifiedUsers() -> array<nn::account::Uid, 0xa> public ResultCode ListQualifiedUsers(ServiceCtx context) |