using System; using System.IO; namespace Storage { public class StreamWrapper: Stream { public Stream Stream { get; private set; } private readonly Action onDispose; public object Context { get; private set; } public StreamWrapper(Stream stream, object context, Action onDispose) { Context = context; Stream = stream; this.onDispose = onDispose; } protected override void Dispose(bool disposing) { base.Dispose(disposing); Exception error = null; if (disposing && onDispose != null) try { onDispose(this, Context); } catch (Exception e) { error = e; } Stream.Dispose(); if (error != null) throw error; } public override bool CanRead { get { return Stream.CanRead; } } public override bool CanSeek { get { return Stream.CanSeek; } } public override bool CanWrite { get { return Stream.CanWrite; } } public override void Flush() { Stream.Flush(); } public override long Length { get { return Stream.Length; } } public override long Position { get { return Stream.Position; } set { Stream.Position = value; } } public override int Read(byte[] buffer, int offset, int count) { return Stream.Read(buffer, offset, count); } public override long Seek(long offset, SeekOrigin origin) { return Stream.Seek(offset, origin); } public override void SetLength(long value) { Stream.SetLength(value); } public override void Write(byte[] buffer, int offset, int count) { Stream.Write(buffer, offset, count); } public byte[] Buffer { get { return Stream is MemoryStream ? (Stream as MemoryStream).ToArray() : null; } } } }