IFile.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using LibHac;
  2. using LibHac.Fs;
  3. namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
  4. {
  5. class IFile : DisposableIpcService
  6. {
  7. private LibHac.Fs.Fsa.IFile _baseFile;
  8. public IFile(LibHac.Fs.Fsa.IFile baseFile)
  9. {
  10. _baseFile = baseFile;
  11. }
  12. [CommandHipc(0)]
  13. // Read(u32 readOption, u64 offset, u64 size) -> (u64 out_size, buffer<u8, 0x46, 0> out_buf)
  14. public ResultCode Read(ServiceCtx context)
  15. {
  16. ulong position = context.Request.ReceiveBuff[0].Position;
  17. ReadOption readOption = new ReadOption(context.RequestData.ReadInt32());
  18. context.RequestData.BaseStream.Position += 4;
  19. long offset = context.RequestData.ReadInt64();
  20. long size = context.RequestData.ReadInt64();
  21. byte[] data = new byte[size];
  22. Result result = _baseFile.Read(out long bytesRead, offset, data, readOption);
  23. context.Memory.Write(position, data);
  24. context.ResponseData.Write(bytesRead);
  25. return (ResultCode)result.Value;
  26. }
  27. [CommandHipc(1)]
  28. // Write(u32 writeOption, u64 offset, u64 size, buffer<u8, 0x45, 0>)
  29. public ResultCode Write(ServiceCtx context)
  30. {
  31. ulong position = context.Request.SendBuff[0].Position;
  32. WriteOption writeOption = new WriteOption(context.RequestData.ReadInt32());
  33. context.RequestData.BaseStream.Position += 4;
  34. long offset = context.RequestData.ReadInt64();
  35. long size = context.RequestData.ReadInt64();
  36. byte[] data = new byte[size];
  37. context.Memory.Read(position, data);
  38. return (ResultCode)_baseFile.Write(offset, data, writeOption).Value;
  39. }
  40. [CommandHipc(2)]
  41. // Flush()
  42. public ResultCode Flush(ServiceCtx context)
  43. {
  44. return (ResultCode)_baseFile.Flush().Value;
  45. }
  46. [CommandHipc(3)]
  47. // SetSize(u64 size)
  48. public ResultCode SetSize(ServiceCtx context)
  49. {
  50. long size = context.RequestData.ReadInt64();
  51. return (ResultCode)_baseFile.SetSize(size).Value;
  52. }
  53. [CommandHipc(4)]
  54. // GetSize() -> u64 fileSize
  55. public ResultCode GetSize(ServiceCtx context)
  56. {
  57. Result result = _baseFile.GetSize(out long size);
  58. context.ResponseData.Write(size);
  59. return (ResultCode)result.Value;
  60. }
  61. protected override void Dispose(bool isDisposing)
  62. {
  63. if (isDisposing)
  64. {
  65. _baseFile?.Dispose();
  66. }
  67. }
  68. }
  69. }