Add TimeService

This commit is contained in:
Alex Barney 2020-11-04 14:33:10 -07:00
parent 9826178fb6
commit c29fed67c1
5 changed files with 97 additions and 8 deletions

View file

@ -8,6 +8,7 @@ namespace LibHac.FsSrv
public BaseFileSystemServiceImpl BaseFileSystemService { get; set; } public BaseFileSystemServiceImpl BaseFileSystemService { get; set; }
public NcaFileSystemServiceImpl NcaFileSystemService { get; set; } public NcaFileSystemServiceImpl NcaFileSystemService { get; set; }
public SaveDataFileSystemServiceImpl SaveDataFileSystemService { get; set; } public SaveDataFileSystemServiceImpl SaveDataFileSystemService { get; set; }
public TimeServiceImpl TimeService { get; set; }
public ProgramRegistryServiceImpl ProgramRegistryService { get; set; } public ProgramRegistryServiceImpl ProgramRegistryService { get; set; }
public AccessLogServiceImpl AccessLogService { get; set; } public AccessLogServiceImpl AccessLogService { get; set; }
} }

View file

@ -25,11 +25,6 @@ namespace LibHac.FsSrv
CurrentProcess = ulong.MaxValue; CurrentProcess = ulong.MaxValue;
} }
private ProgramIndexRegistryService GetProgramIndexRegistryService()
{
return new ProgramIndexRegistryService(FsProxyCore.Config.ProgramRegistryService, CurrentProcess);
}
public Result OpenFileSystemWithId(out ReferenceCountedDisposable<IFileSystemSf> fileSystem, in FspPath path, public Result OpenFileSystemWithId(out ReferenceCountedDisposable<IFileSystemSf> fileSystem, in FspPath path,
ulong id, FileSystemProxyType fsType) ulong id, FileSystemProxyType fsType)
{ {
@ -746,9 +741,9 @@ namespace LibHac.FsSrv
return saveFsService.QuerySaveDataTotalSize(out totalSize, dataSize, journalSize); return saveFsService.QuerySaveDataTotalSize(out totalSize, dataSize, journalSize);
} }
public Result SetCurrentPosixTimeWithTimeDifference(long time, int difference) public Result SetCurrentPosixTimeWithTimeDifference(long currentTime, int timeDifference)
{ {
throw new NotImplementedException(); return GetTimeService().SetCurrentPosixTimeWithTimeDifference(currentTime, timeDifference);
} }
public Result GetRightsId(out RightsId rightsId, ProgramId programId, StorageId storageId) public Result GetRightsId(out RightsId rightsId, ProgramId programId, StorageId storageId)
@ -1005,6 +1000,16 @@ namespace LibHac.FsSrv
return Result.Success; return Result.Success;
} }
private TimeService GetTimeService()
{
return new TimeService(FsProxyCore.Config.TimeService, CurrentProcess);
}
private ProgramIndexRegistryService GetProgramIndexRegistryService()
{
return new ProgramIndexRegistryService(FsProxyCore.Config.ProgramRegistryService, CurrentProcess);
}
private AccessLogService GetAccessLogService() private AccessLogService GetAccessLogService()
{ {
return new AccessLogService(FsProxyCore.Config.AccessLogService, CurrentProcess); return new AccessLogService(FsProxyCore.Config.AccessLogService, CurrentProcess);

View file

@ -96,6 +96,11 @@ namespace LibHac.FsSrv
var programRegistryService = new ProgramRegistryServiceImpl(this); var programRegistryService = new ProgramRegistryServiceImpl(this);
var programRegistry = new ProgramRegistryImpl(programRegistryService); var programRegistry = new ProgramRegistryImpl(programRegistryService);
var timeServiceConfig = new TimeServiceImpl.Configuration();
timeServiceConfig.HorizonClient = Hos;
timeServiceConfig.ProgramRegistry = programRegistry;
var timeService = new TimeServiceImpl(in timeServiceConfig);
var baseFsServiceConfig = new BaseFileSystemServiceImpl.Configuration(); var baseFsServiceConfig = new BaseFileSystemServiceImpl.Configuration();
baseFsServiceConfig.BisFileSystemCreator = config.FsCreators.BuiltInStorageFileSystemCreator; baseFsServiceConfig.BisFileSystemCreator = config.FsCreators.BuiltInStorageFileSystemCreator;
baseFsServiceConfig.GameCardFileSystemCreator = config.FsCreators.GameCardFileSystemCreator; baseFsServiceConfig.GameCardFileSystemCreator = config.FsCreators.GameCardFileSystemCreator;
@ -148,6 +153,7 @@ namespace LibHac.FsSrv
BaseFileSystemService = baseFsService, BaseFileSystemService = baseFsService,
NcaFileSystemService = ncaFsService, NcaFileSystemService = ncaFsService,
SaveDataFileSystemService = saveFsService, SaveDataFileSystemService = saveFsService,
TimeService = timeService,
ProgramRegistryService = programRegistryService, ProgramRegistryService = programRegistryService,
AccessLogService = accessLogService AccessLogService = accessLogService
}; };

View file

@ -86,7 +86,7 @@ namespace LibHac.FsSrv
Result UnregisterAllExternalKey(); Result UnregisterAllExternalKey();
Result GetRightsIdByPath(out RightsId rightsId, in FspPath path); Result GetRightsIdByPath(out RightsId rightsId, in FspPath path);
Result GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out byte keyGeneration, in FspPath path); Result GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out byte keyGeneration, in FspPath path);
Result SetCurrentPosixTimeWithTimeDifference(long time, int difference); Result SetCurrentPosixTimeWithTimeDifference(long currentTime, int timeDifference);
Result GetFreeSpaceSizeForSaveData(out long freeSpaceSize, SaveDataSpaceId spaceId); Result GetFreeSpaceSizeForSaveData(out long freeSpaceSize, SaveDataSpaceId spaceId);
Result VerifySaveDataFileSystemBySaveDataSpaceId(SaveDataSpaceId spaceId, ulong saveDataId, OutBuffer readBuffer); Result VerifySaveDataFileSystemBySaveDataSpaceId(SaveDataSpaceId spaceId, ulong saveDataId, OutBuffer readBuffer);
Result CorruptSaveDataFileSystemBySaveDataSpaceId(SaveDataSpaceId spaceId, ulong saveDataId); Result CorruptSaveDataFileSystemBySaveDataSpaceId(SaveDataSpaceId spaceId, ulong saveDataId);

View file

@ -0,0 +1,77 @@
using System;
using LibHac.Fs;
using LibHac.FsSrv.Impl;
namespace LibHac.FsSrv
{
public readonly struct TimeService
{
private readonly TimeServiceImpl _serviceImpl;
private readonly ulong _processId;
public TimeService(TimeServiceImpl serviceImpl, ulong processId)
{
_serviceImpl = serviceImpl;
_processId = processId;
}
public Result SetCurrentPosixTimeWithTimeDifference(long currentTime, int timeDifference)
{
Result rc = GetProgramInfo(out ProgramInfo programInfo);
if (rc.IsFailure()) return rc;
if (!programInfo.AccessControl.CanCall(OperationType.SetCurrentPosixTime))
return ResultFs.PermissionDenied.Log();
return _serviceImpl.SetCurrentPosixTimeWithTimeDifference(currentTime, timeDifference);
}
private Result GetProgramInfo(out ProgramInfo programInfo)
{
return _serviceImpl.GetProgramInfo(out programInfo, _processId);
}
}
public class TimeServiceImpl
{
private Configuration _config;
private long _baseTime;
private int _timeDifference;
private object _lockObject;
public TimeServiceImpl(in Configuration configuration)
{
_config = configuration;
_baseTime = 0;
_timeDifference = 0;
_lockObject = new object();
}
// The entire Configuration struct is a LibHac addition to avoid using global state
public struct Configuration
{
public HorizonClient HorizonClient;
public ProgramRegistryImpl ProgramRegistry;
}
public Result GetCurrentPosixTime(out long time)
{
throw new NotImplementedException();
}
public Result GetCurrentPosixTimeWithTimeDifference(out long currentTime, out int timeDifference)
{
throw new NotImplementedException();
}
public Result SetCurrentPosixTimeWithTimeDifference(long currentTime, int timeDifference)
{
throw new NotImplementedException();
}
internal Result GetProgramInfo(out ProgramInfo programInfo, ulong processId)
{
return _config.ProgramRegistry.GetProgramInfo(out programInfo, processId);
}
}
}