ArchiveEmulationStreamProxy.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System.IO;
  2. using System;
  3. namespace SevenZip
  4. {
  5. /// <summary>
  6. /// The Stream extension class to emulate the archive part of a stream.
  7. /// </summary>
  8. internal class ArchiveEmulationStreamProxy : Stream, IDisposable
  9. {
  10. /// <summary>
  11. /// Gets the file offset.
  12. /// </summary>
  13. public int Offset { get; private set; }
  14. /// <summary>
  15. /// The source wrapped stream.
  16. /// </summary>
  17. public Stream Source { get; private set; }
  18. /// <summary>
  19. /// Initializes a new instance of the ArchiveEmulationStream class.
  20. /// </summary>
  21. /// <param name="stream">The stream to wrap.</param>
  22. /// <param name="offset">The stream offset.</param>
  23. public ArchiveEmulationStreamProxy(Stream stream, int offset)
  24. {
  25. Source = stream;
  26. Offset = offset;
  27. Source.Position = offset;
  28. }
  29. public override bool CanRead
  30. {
  31. get { return Source.CanRead; }
  32. }
  33. public override bool CanSeek
  34. {
  35. get { return Source.CanSeek; }
  36. }
  37. public override bool CanWrite
  38. {
  39. get { return Source.CanWrite; }
  40. }
  41. public override void Flush()
  42. {
  43. Source.Flush();
  44. }
  45. public override long Length
  46. {
  47. get { return Source.Length - Offset; }
  48. }
  49. public override long Position
  50. {
  51. get
  52. {
  53. return Source.Position - Offset;
  54. }
  55. set
  56. {
  57. Source.Position = value;
  58. }
  59. }
  60. public override int Read(byte[] buffer, int offset, int count)
  61. {
  62. return Source.Read(buffer, offset, count);
  63. }
  64. public override long Seek(long offset, SeekOrigin origin)
  65. {
  66. return Source.Seek(origin == SeekOrigin.Begin ? offset + Offset : offset,
  67. origin) - Offset;
  68. }
  69. public override void SetLength(long value)
  70. {
  71. Source.SetLength(value);
  72. }
  73. public override void Write(byte[] buffer, int offset, int count)
  74. {
  75. Source.Write(buffer, offset, count);
  76. }
  77. public new void Dispose()
  78. {
  79. Source.Dispose();
  80. }
  81. public override void Close()
  82. {
  83. Source.Close();
  84. }
  85. }
  86. }