2018-10-17 13:15:50 -04:00
using Ryujinx.Common.Logging ;
2020-05-03 18:54:50 -04:00
using Ryujinx.Cpu ;
2021-01-02 17:34:28 -05:00
using Ryujinx.HLE.HOS.Services.Account.Acc.AccountService ;
2019-09-18 20:45:11 -04:00
using Ryujinx.HLE.HOS.Services.Arp ;
2018-02-24 23:34:16 -05:00
2019-09-18 20:45:11 -04:00
namespace Ryujinx.HLE.HOS.Services.Account.Acc
2018-02-24 23:34:16 -05:00
{
2021-01-02 17:34:28 -05:00
[Service("acc:u0", AccountServiceFlag.Application)] // Max Sessions: 4
2019-09-18 20:45:11 -04:00
class IAccountServiceForApplication : IpcService
2018-02-24 23:34:16 -05:00
{
2021-01-02 17:34:28 -05:00
private ApplicationServiceServer _applicationServiceServer ;
2019-06-15 18:35:38 -04:00
2021-01-02 17:34:28 -05:00
public IAccountServiceForApplication ( ServiceCtx context , AccountServiceFlag serviceFlag )
{
_applicationServiceServer = new ApplicationServiceServer ( serviceFlag ) ;
}
2018-02-24 23:34:16 -05:00
2021-04-13 18:01:24 -04:00
[CommandHipc(0)]
2018-10-13 19:16:02 -04:00
// GetUserCount() -> i32
2019-07-14 15:04:38 -04:00
public ResultCode GetUserCount ( ServiceCtx context )
2018-04-17 12:41:14 -04:00
{
2021-01-02 17:34:28 -05:00
return _applicationServiceServer . GetUserCountImpl ( context ) ;
2018-04-17 12:41:14 -04:00
}
2018-06-10 20:46:42 -04:00
2021-04-13 18:01:24 -04:00
[CommandHipc(1)]
2018-10-13 19:16:02 -04:00
// GetUserExistence(nn::account::Uid) -> bool
2019-07-14 15:04:38 -04:00
public ResultCode GetUserExistence ( ServiceCtx context )
2018-06-10 00:36:07 -04:00
{
2021-01-02 17:34:28 -05:00
return _applicationServiceServer . GetUserExistenceImpl ( context ) ;
2018-06-10 00:36:07 -04:00
}
2018-04-17 12:41:14 -04:00
2021-04-13 18:01:24 -04:00
[CommandHipc(2)]
2018-10-13 19:16:02 -04:00
// ListAllUsers() -> array<nn::account::Uid, 0xa>
2019-07-14 15:04:38 -04:00
public ResultCode ListAllUsers ( ServiceCtx context )
2018-06-10 00:36:07 -04:00
{
2021-01-02 17:34:28 -05:00
return _applicationServiceServer . ListAllUsers ( context ) ;
2018-06-10 00:36:07 -04:00
}
2018-06-10 20:46:42 -04:00
2021-04-13 18:01:24 -04:00
[CommandHipc(3)]
2018-10-13 19:16:02 -04:00
// ListOpenUsers() -> array<nn::account::Uid, 0xa>
2019-07-14 15:04:38 -04:00
public ResultCode ListOpenUsers ( ServiceCtx context )
2018-02-24 23:34:16 -05:00
{
2021-01-02 17:34:28 -05:00
return _applicationServiceServer . ListOpenUsers ( context ) ;
2018-02-24 23:34:16 -05:00
}
2021-04-13 18:01:24 -04:00
[CommandHipc(4)]
2018-10-13 19:16:02 -04:00
// GetLastOpenedUser() -> nn::account::Uid
2019-07-14 15:04:38 -04:00
public ResultCode GetLastOpenedUser ( ServiceCtx context )
2018-06-02 18:46:09 -04:00
{
2021-01-02 17:34:28 -05:00
return _applicationServiceServer . GetLastOpenedUser ( context ) ;
2018-06-02 18:46:09 -04:00
}
2021-04-13 18:01:24 -04:00
[CommandHipc(5)]
2018-10-13 19:16:02 -04:00
// GetProfile(nn::account::Uid) -> object<nn::account::profile::IProfile>
2019-07-14 15:04:38 -04:00
public ResultCode GetProfile ( ServiceCtx context )
2018-02-24 23:34:16 -05:00
{
2021-01-02 17:34:28 -05:00
ResultCode resultCode = _applicationServiceServer . GetProfile ( context , out IProfile iProfile ) ;
2018-08-14 18:02:42 -04:00
2021-01-02 17:34:28 -05:00
if ( resultCode = = ResultCode . Success )
2018-08-14 18:02:42 -04:00
{
2021-01-02 17:34:28 -05:00
MakeObject ( context , iProfile ) ;
2018-08-14 18:02:42 -04:00
}
2021-01-02 17:34:28 -05:00
return resultCode ;
2018-02-24 23:34:16 -05:00
}
2021-04-13 18:01:24 -04:00
[CommandHipc(50)]
2021-01-02 17:34:28 -05:00
// IsUserRegistrationRequestPermitted(pid) -> bool
2019-07-14 15:04:38 -04:00
public ResultCode IsUserRegistrationRequestPermitted ( ServiceCtx context )
2018-10-13 19:16:02 -04:00
{
2021-01-02 17:34:28 -05:00
// NOTE: pid is unused.
return _applicationServiceServer . IsUserRegistrationRequestPermitted ( context ) ;
2018-10-13 19:16:02 -04:00
}
2021-04-13 18:01:24 -04:00
[CommandHipc(51)]
2018-10-13 19:16:02 -04:00
// TrySelectUserWithoutInteraction(bool) -> nn::account::Uid
2019-07-14 15:04:38 -04:00
public ResultCode TrySelectUserWithoutInteraction ( ServiceCtx context )
2018-10-13 19:16:02 -04:00
{
2021-01-02 17:34:28 -05:00
return _applicationServiceServer . TrySelectUserWithoutInteraction ( context ) ;
2018-10-13 19:16:02 -04:00
}
2021-04-13 18:01:24 -04:00
[CommandHipc(100)]
[CommandHipc(140)] // 6.0.0+
2021-11-24 16:11:50 -05:00
[CommandHipc(160)] // 13.0.0+
2021-01-02 17:34:28 -05:00
// InitializeApplicationInfo(u64 pid_placeholder, pid)
2019-07-14 15:04:38 -04:00
public ResultCode InitializeApplicationInfo ( ServiceCtx context )
2018-02-24 23:34:16 -05:00
{
2021-01-02 17:34:28 -05:00
// NOTE: In call 100, account service use the pid_placeholder instead of the real pid, which is wrong, call 140 fix that.
2019-06-15 18:35:38 -04:00
2021-01-02 17:34:28 -05:00
/ *
2018-10-13 19:16:02 -04:00
2019-06-15 18:35:38 -04:00
// TODO: Account actually calls nn::arp::detail::IReader::GetApplicationLaunchProperty() with the current PID and store the result (ApplicationLaunchProperty) internally.
// For now we can hardcode values, and fix it after GetApplicationLaunchProperty is implemented.
2021-01-02 17:34:28 -05:00
if ( nn : : arp : : detail : : IReader : : GetApplicationLaunchProperty ( ) = = 0xCC9D ) // ResultCode.InvalidProcessId
2019-06-15 18:35:38 -04:00
{
2019-07-14 15:04:38 -04:00
return ResultCode . InvalidArgument ;
2019-06-15 18:35:38 -04:00
}
2021-01-02 17:34:28 -05:00
2019-06-15 18:35:38 -04:00
* /
2021-01-02 17:34:28 -05:00
// TODO: Determine where ApplicationLaunchProperty is used.
ApplicationLaunchProperty applicationLaunchProperty = ApplicationLaunchProperty . GetByPid ( context ) ;
Logger . Stub ? . PrintStub ( LogClass . ServiceAcc , new { applicationLaunchProperty . TitleId } ) ;
2018-04-16 20:24:42 -04:00
2019-07-14 15:04:38 -04:00
return ResultCode . Success ;
2018-02-24 23:34:16 -05:00
}
2021-04-13 18:01:24 -04:00
[CommandHipc(101)]
2019-06-15 18:35:38 -04:00
// GetBaasAccountManagerForApplication(nn::account::Uid) -> object<nn::account::baas::IManagerForApplication>
2019-07-14 15:04:38 -04:00
public ResultCode GetBaasAccountManagerForApplication ( ServiceCtx context )
2018-02-24 23:34:16 -05:00
{
2021-01-02 17:34:28 -05:00
ResultCode resultCode = _applicationServiceServer . CheckUserId ( context , out UserId userId ) ;
2019-06-15 18:35:38 -04:00
2021-01-02 17:34:28 -05:00
if ( resultCode ! = ResultCode . Success )
2019-06-15 18:35:38 -04:00
{
2021-01-02 17:34:28 -05:00
return resultCode ;
2019-06-15 18:35:38 -04:00
}
2021-01-02 17:34:28 -05:00
MakeObject ( context , new IManagerForApplication ( userId ) ) ;
2019-06-15 18:35:38 -04:00
// Doesn't occur in our case.
2019-07-14 15:04:38 -04:00
// return ResultCode.NullObject;
2019-06-15 18:35:38 -04:00
2019-07-14 15:04:38 -04:00
return ResultCode . Success ;
2019-06-15 18:35:38 -04:00
}
2021-04-13 18:01:24 -04:00
[CommandHipc(110)]
2019-06-15 18:35:38 -04:00
// StoreSaveDataThumbnail(nn::account::Uid, buffer<bytes, 5>)
2019-07-14 15:04:38 -04:00
public ResultCode StoreSaveDataThumbnail ( ServiceCtx context )
2019-06-15 18:35:38 -04:00
{
2021-01-02 17:34:28 -05:00
return _applicationServiceServer . StoreSaveDataThumbnail ( context ) ;
2019-06-15 18:35:38 -04:00
}
2021-04-13 18:01:24 -04:00
[CommandHipc(111)]
2019-06-15 18:35:38 -04:00
// ClearSaveDataThumbnail(nn::account::Uid)
2019-07-14 15:04:38 -04:00
public ResultCode ClearSaveDataThumbnail ( ServiceCtx context )
2019-06-15 18:35:38 -04:00
{
2021-01-02 17:34:28 -05:00
return _applicationServiceServer . ClearSaveDataThumbnail ( context ) ;
2019-06-15 18:35:38 -04:00
}
2021-04-13 18:01:24 -04:00
[CommandHipc(131)] // 6.0.0+
2020-09-20 00:32:58 -04:00
// ListOpenContextStoredUsers() -> array<nn::account::Uid, 0xa>
public ResultCode ListOpenContextStoredUsers ( ServiceCtx context )
{
2021-04-24 06:16:01 -04:00
ulong outputPosition = context . Request . RecvListBuff [ 0 ] . Position ;
ulong outputSize = context . Request . RecvListBuff [ 0 ] . Size ;
2020-09-20 00:32:58 -04:00
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 ;
}
2021-04-13 18:01:24 -04:00
[CommandHipc(141)] // 6.0.0+
2020-09-20 00:32:58 -04:00
// ListQualifiedUsers() -> array<nn::account::Uid, 0xa>
public ResultCode ListQualifiedUsers ( ServiceCtx context )
{
2021-01-02 17:34:28 -05:00
return _applicationServiceServer . ListQualifiedUsers ( context ) ;
2020-09-20 00:32:58 -04:00
}
2021-04-13 18:01:24 -04:00
[CommandHipc(150)] // 6.0.0+
2019-06-15 18:35:38 -04:00
// IsUserAccountSwitchLocked() -> bool
2019-07-14 15:04:38 -04:00
public ResultCode IsUserAccountSwitchLocked ( ServiceCtx context )
2019-06-15 18:35:38 -04:00
{
2021-01-02 17:34:28 -05:00
// TODO: Account actually calls nn::arp::detail::IReader::GetApplicationControlProperty() with the current Pid and store the result (NACP file) internally.
// But since we use LibHac and we load one Application at a time, it's not necessary.
2019-06-15 18:35:38 -04:00
2022-02-26 18:52:25 -05:00
context . ResponseData . Write ( ( byte ) context . Device . Application . ControlData . Value . UserAccountSwitchLock ) ;
2018-10-13 19:16:02 -04:00
2020-08-03 19:32:53 -04:00
Logger . Stub ? . PrintStub ( LogClass . ServiceAcc ) ;
2018-02-24 23:34:16 -05:00
2019-07-14 15:04:38 -04:00
return ResultCode . Success ;
2018-02-24 23:34:16 -05:00
}
}
2021-01-02 17:34:28 -05:00
}