HomebrewRomFsStream.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System;
  2. using System.IO;
  3. namespace Ryujinx.HLE.HOS
  4. {
  5. class HomebrewRomFsStream : Stream
  6. {
  7. private Stream _baseStream;
  8. private long _positionOffset;
  9. public HomebrewRomFsStream(Stream baseStream, long positionOffset)
  10. {
  11. _baseStream = baseStream;
  12. _positionOffset = positionOffset;
  13. _baseStream.Position = _positionOffset;
  14. }
  15. public override bool CanRead => _baseStream.CanRead;
  16. public override bool CanSeek => _baseStream.CanSeek;
  17. public override bool CanWrite => false;
  18. public override long Length => _baseStream.Length - _positionOffset;
  19. public override long Position
  20. {
  21. get
  22. {
  23. return _baseStream.Position - _positionOffset;
  24. }
  25. set
  26. {
  27. _baseStream.Position = value + _positionOffset;
  28. }
  29. }
  30. public override void Flush()
  31. {
  32. _baseStream.Flush();
  33. }
  34. public override int Read(byte[] buffer, int offset, int count)
  35. {
  36. return _baseStream.Read(buffer, offset, count);
  37. }
  38. public override long Seek(long offset, SeekOrigin origin)
  39. {
  40. if (origin == SeekOrigin.Begin)
  41. {
  42. offset += _positionOffset;
  43. }
  44. return _baseStream.Seek(offset, origin);
  45. }
  46. public override void SetLength(long value)
  47. {
  48. throw new NotImplementedException();
  49. }
  50. public override void Write(byte[] buffer, int offset, int count)
  51. {
  52. throw new NotImplementedException();
  53. }
  54. protected override void Dispose(bool disposing)
  55. {
  56. if (disposing)
  57. {
  58. _baseStream.Dispose();
  59. }
  60. }
  61. }
  62. }