IFile.cs 2.7 KB

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