StreamWithRangeValues.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using System.Diagnostics;
  2. using System.IO;
  3. namespace OpenVIII
  4. {
  5. /// <summary>
  6. /// Starts at offset position and has a offset and size value so you know how far you can go.
  7. /// </summary>
  8. public class StreamWithRangeValues : Stream
  9. {
  10. #region Fields
  11. private readonly Stream _s;
  12. #endregion Fields
  13. #region Constructors
  14. public StreamWithRangeValues(Stream s, long offset, long size, CompressionType compression = 0, int uncompressedSize = 0)
  15. {
  16. if (typeof(StreamWithRangeValues) == s.GetType())
  17. {
  18. var r = (StreamWithRangeValues)s;
  19. Debug.Assert(r.Compression == 0);
  20. offset += r.Offset;
  21. }
  22. _s = s;
  23. Size = size;
  24. Offset = offset;
  25. Position = offset;
  26. Compression = compression;
  27. UncompressedSize = checked((int)(uncompressedSize == 0 ? size : uncompressedSize));
  28. }
  29. #endregion Constructors
  30. #region Properties
  31. public override bool CanRead => _s.CanRead;
  32. public override bool CanSeek => _s.CanSeek;
  33. public override bool CanWrite => _s.CanWrite;
  34. public CompressionType Compression { get; }
  35. public override long Length => _s.Length;
  36. public long Max => Size + Offset;
  37. public long Offset { get; }
  38. public sealed override long Position { get => _s.Position; set => _s.Position = value; }
  39. public long Size { get; }
  40. public int UncompressedSize { get; }
  41. #endregion Properties
  42. #region Methods
  43. public override void Flush() => _s.Flush();
  44. public override int Read(byte[] buffer, int offset, int count) => _s.Read(buffer, offset, count);
  45. public override long Seek(long offset, SeekOrigin origin) => _s.Seek(offset, origin);
  46. public override void SetLength(long value) => _s.SetLength(value);
  47. public override void Write(byte[] buffer, int offset, int count) => _s.Write(buffer, offset, count);
  48. #endregion Methods
  49. }
  50. }