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