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