mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2026-06-27 06:39:06 +00:00
Enables full trimming for Ryujinx, and in doing so removes many usages of reflection, namely: IUserService no longer uses reflection to find possible service types, and now has a generated switch based on name Ryujinx.HLE.HOS.Tamper no longer uses dynamic to do operations, now using INumber<T> and friends Cmif and Tipc commands in Ryujinx.HLE.HOS.Services no longer get resolved via reflection and are now done via generated virtual methods Fix things broken by trimming (profile panel, DiscordRPC)
95 lines
3.0 KiB
C#
95 lines
3.0 KiB
C#
using LibHac;
|
|
using LibHac.Common;
|
|
using LibHac.Fs;
|
|
using LibHac.Sf;
|
|
using Ryujinx.Common;
|
|
using Ryujinx.Memory;
|
|
|
|
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
|
{
|
|
partial class IFile : DisposableIpcService
|
|
{
|
|
private SharedRef<LibHac.FsSrv.Sf.IFile> _baseFile;
|
|
|
|
public IFile(ref SharedRef<LibHac.FsSrv.Sf.IFile> baseFile)
|
|
{
|
|
_baseFile = SharedRef<LibHac.FsSrv.Sf.IFile>.CreateMove(ref baseFile);
|
|
}
|
|
|
|
[CommandCmif(0)]
|
|
// Read(u32 readOption, u64 offset, u64 size) -> (u64 out_size, buffer<u8, 0x46, 0> out_buf)
|
|
public ResultCode Read(ServiceCtx context)
|
|
{
|
|
ulong bufferAddress = context.Request.ReceiveBuff[0].Position;
|
|
ulong bufferLen = context.Request.ReceiveBuff[0].Size;
|
|
|
|
ReadOption readOption = context.RequestData.ReadStruct<ReadOption>();
|
|
context.RequestData.BaseStream.Position += 4;
|
|
|
|
long offset = context.RequestData.ReadInt64();
|
|
long size = context.RequestData.ReadInt64();
|
|
|
|
using WritableRegion region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true);
|
|
Result result = _baseFile.Get.Read(out long bytesRead, offset, new OutBuffer(region.Memory.Span), size, readOption);
|
|
|
|
context.ResponseData.Write(bytesRead);
|
|
|
|
return (ResultCode)result.Value;
|
|
}
|
|
|
|
[CommandCmif(1)]
|
|
// Write(u32 writeOption, u64 offset, u64 size, buffer<u8, 0x45, 0>)
|
|
public ResultCode Write(ServiceCtx context)
|
|
{
|
|
ulong position = context.Request.SendBuff[0].Position;
|
|
|
|
WriteOption writeOption = context.RequestData.ReadStruct<WriteOption>();
|
|
context.RequestData.BaseStream.Position += 4;
|
|
|
|
long offset = context.RequestData.ReadInt64();
|
|
long size = context.RequestData.ReadInt64();
|
|
|
|
byte[] data = new byte[context.Request.SendBuff[0].Size];
|
|
|
|
context.Memory.Read(position, data);
|
|
|
|
return (ResultCode)_baseFile.Get.Write(offset, new InBuffer(data), size, writeOption).Value;
|
|
}
|
|
|
|
[CommandCmif(2)]
|
|
// Flush()
|
|
public ResultCode Flush(ServiceCtx context)
|
|
{
|
|
return (ResultCode)_baseFile.Get.Flush().Value;
|
|
}
|
|
|
|
[CommandCmif(3)]
|
|
// SetSize(u64 size)
|
|
public ResultCode SetSize(ServiceCtx context)
|
|
{
|
|
long size = context.RequestData.ReadInt64();
|
|
|
|
return (ResultCode)_baseFile.Get.SetSize(size).Value;
|
|
}
|
|
|
|
[CommandCmif(4)]
|
|
// GetSize() -> u64 fileSize
|
|
public ResultCode GetSize(ServiceCtx context)
|
|
{
|
|
Result result = _baseFile.Get.GetSize(out long size);
|
|
|
|
context.ResponseData.Write(size);
|
|
|
|
return (ResultCode)result.Value;
|
|
}
|
|
|
|
protected override void Dispose(bool isDisposing)
|
|
{
|
|
if (isDisposing)
|
|
{
|
|
_baseFile.Destroy();
|
|
}
|
|
}
|
|
}
|
|
}
|