2018-10-17 10:15:50 -07:00
using Ryujinx.Common.Logging ;
2020-08-18 12:24:54 -07:00
using Ryujinx.Cpu ;
using Ryujinx.HLE.HOS.Kernel.Threading ;
using Ryujinx.HLE.HOS.Services.Account.Acc.AsyncContext ;
2019-09-18 17:45:11 -07:00
using Ryujinx.HLE.HOS.Services.Arp ;
2020-08-18 12:24:54 -07:00
using System ;
using System.Text ;
using System.Threading ;
using System.Threading.Tasks ;
2018-02-09 16:14:55 -08:00
2019-09-18 17:45:11 -07:00
namespace Ryujinx.HLE.HOS.Services.Account.Acc
2018-02-09 16:14:55 -08:00
{
2018-03-19 11:58:46 -07:00
class IManagerForApplication : IpcService
2018-02-09 16:14:55 -08:00
{
2020-08-18 12:24:54 -07:00
// TODO: Determine where and how NetworkServiceAccountId is set.
private const long NetworkServiceAccountId = 0xcafe ;
2020-02-01 19:24:17 -08:00
private UserId _userId ;
2019-06-15 15:35:38 -07:00
private ApplicationLaunchProperty _applicationLaunchProperty ;
2018-10-13 16:16:02 -07:00
2020-02-01 19:24:17 -08:00
public IManagerForApplication ( UserId userId , ApplicationLaunchProperty applicationLaunchProperty )
2018-02-09 16:14:55 -08:00
{
2019-06-15 15:35:38 -07:00
_userId = userId ;
_applicationLaunchProperty = applicationLaunchProperty ;
2018-02-09 16:14:55 -08:00
}
2019-07-11 18:13:43 -07:00
[Command(0)]
2018-10-13 16:16:02 -07:00
// CheckAvailability()
2019-07-14 12:04:38 -07:00
public ResultCode CheckAvailability ( ServiceCtx context )
2018-04-16 17:24:42 -07:00
{
2020-08-18 12:24:54 -07:00
// NOTE: This opens the file at "su/baas/USERID_IN_UUID_STRING.dat" where USERID_IN_UUID_STRING is formatted as "%08x-%04x-%04x-%02x%02x-%08x%04x".
// Then it searches the Availability of Online Services related to the UserId in this file and returns it.
2020-08-03 16:32:53 -07:00
Logger . Stub ? . PrintStub ( LogClass . ServiceAcc ) ;
2018-04-16 17:24:42 -07:00
2020-08-18 12:24:54 -07:00
// NOTE: Even if we try to return different error codes here, the guest still needs other calls.
2019-07-14 12:04:38 -07:00
return ResultCode . Success ;
2018-02-09 16:14:55 -08:00
}
2019-07-11 18:13:43 -07:00
[Command(1)]
2018-10-13 16:16:02 -07:00
// GetAccountId() -> nn::account::NetworkServiceAccountId
2019-07-14 12:04:38 -07:00
public ResultCode GetAccountId ( ServiceCtx context )
2018-02-09 16:14:55 -08:00
{
2020-08-18 12:24:54 -07:00
// NOTE: This opens the file at "su/baas/USERID_IN_UUID_STRING.dat" (where USERID_IN_UUID_STRING is formatted
// as "%08x-%04x-%04x-%02x%02x-%08x%04x") in the account:/ savedata.
// Then it searches the NetworkServiceAccountId related to the UserId in this file and returns it.
2020-08-03 16:32:53 -07:00
Logger . Stub ? . PrintStub ( LogClass . ServiceAcc , new { NetworkServiceAccountId } ) ;
2020-03-02 06:07:27 -08:00
context . ResponseData . Write ( NetworkServiceAccountId ) ;
return ResultCode . Success ;
}
2020-08-18 12:24:54 -07:00
[Command(2)]
// EnsureIdTokenCacheAsync() -> object<nn::account::detail::IAsyncContext>
public ResultCode EnsureIdTokenCacheAsync ( ServiceCtx context )
{
KEvent asyncEvent = new KEvent ( context . Device . System . KernelContext ) ;
AsyncExecution asyncExecution = new AsyncExecution ( asyncEvent ) ;
asyncExecution . Initialize ( 1000 , EnsureIdTokenCacheAsyncImpl ) ;
MakeObject ( context , new IAsyncContext ( asyncExecution ) ) ;
// return ResultCode.NullObject if the IAsyncContext pointer is null. Doesn't occur in our case.
return ResultCode . Success ;
}
private async Task EnsureIdTokenCacheAsyncImpl ( CancellationToken token )
{
// NOTE: This open the file at "su/baas/USERID_IN_UUID_STRING.dat" (where USERID_IN_UUID_STRING is formatted as "%08x-%04x-%04x-%02x%02x-%08x%04x")
// in the "account:/" savedata.
// Then its read data, use dauth API with this data to get the Token Id and probably store the dauth response
// in "su/cache/USERID_IN_UUID_STRING.dat" (where USERID_IN_UUID_STRING is formatted as "%08x-%04x-%04x-%02x%02x-%08x%04x") in the "account:/" savedata.
// Since we don't support online services, we can stub it.
Logger . Stub ? . PrintStub ( LogClass . ServiceAcc ) ;
// TODO: Use a real function instead, with the CancellationToken.
await Task . CompletedTask ;
}
[Command(3)]
// LoadIdTokenCache() -> (u32 id_token_cache_size, buffer<bytes, 6>)
public ResultCode LoadIdTokenCache ( ServiceCtx context )
{
long bufferPosition = context . Request . ReceiveBuff [ 0 ] . Position ;
long bufferSize = context . Request . ReceiveBuff [ 0 ] . Size ;
// NOTE: This opens the file at "su/cache/USERID_IN_UUID_STRING.dat" (where USERID_IN_UUID_STRING is formatted as "%08x-%04x-%04x-%02x%02x-%08x%04x")
// in the "account:/" savedata and writes some data in the buffer.
// Since we don't support online services, we can stub it.
Logger . Stub ? . PrintStub ( LogClass . ServiceAcc ) ;
/ *
if ( internal_object ! = null )
{
if ( bufferSize > 0xC00 )
{
return ResultCode . InvalidIdTokenCacheBufferSize ;
}
}
* /
int idTokenCacheSize = 0 ;
MemoryHelper . FillWithZeros ( context . Memory , bufferPosition , ( int ) bufferSize ) ;
context . ResponseData . Write ( idTokenCacheSize ) ;
return ResultCode . Success ;
}
2020-03-02 06:07:27 -08:00
[Command(130)]
// GetNintendoAccountUserResourceCacheForApplication() -> (nn::account::NintendoAccountId, buffer<nn::account::nas::NasUserBaseForApplication, 0x1a>, buffer<bytes, 6>)
public ResultCode GetNintendoAccountUserResourceCacheForApplication ( ServiceCtx context )
{
2020-08-03 16:32:53 -07:00
Logger . Stub ? . PrintStub ( LogClass . ServiceAcc , new { NetworkServiceAccountId } ) ;
2018-10-13 16:16:02 -07:00
2020-03-02 06:07:27 -08:00
context . ResponseData . Write ( NetworkServiceAccountId ) ;
2018-04-16 17:24:42 -07:00
2020-03-02 06:07:27 -08:00
// TODO: determine and fill the two output IPC buffers.
2018-02-09 16:14:55 -08:00
2019-07-14 12:04:38 -07:00
return ResultCode . Success ;
2018-02-09 16:14:55 -08:00
}
2020-09-20 20:45:30 -07:00
[Command(160)] // 5.0.0+
// StoreOpenContext()
public ResultCode StoreOpenContext ( ServiceCtx context )
{
Logger . Stub ? . PrintStub ( LogClass . ServiceAcc ) ;
return ResultCode . Success ;
}
2018-02-09 16:14:55 -08:00
}
}