Index: utilities/CodeReview/test.cs =================================================================== --- utilities/CodeReview/test.cs (revision 142004) +++ utilities/CodeReview/test.cs (revision 142005) @@ -5,38 +5,44 @@ { public class StreamWrapper: Stream { - private readonly Stream stream; + public Stream Stream { get; private set; } - private readonly Action onDispose; + private readonly Action onDispose; - public StreamWrapper(Stream stream, Action onDispose) + public object Context { get; private set; } + + public StreamWrapper(Stream stream, object context, Action onDispose) { - this.stream = stream; this.onDispose = onDispose; + Context = context; Stream = stream; this.onDispose = onDispose; } protected override void Dispose(bool disposing) { - base.Dispose(disposing); if (disposing && onDispose != null) onDispose(this); + 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 CanRead { get { return Stream.CanRead; } } - public override bool CanSeek { get { return stream.CanSeek; } } + public override bool CanSeek { get { return Stream.CanSeek; } } - public override bool CanWrite { get { return stream.CanWrite; } } + public override bool CanWrite { get { return Stream.CanWrite; } } - public override void Flush() { stream.Flush(); } + public override void Flush() { Stream.Flush(); } - public override long Length { get { return stream.Length; } } + public override long Length { get { return Stream.Length; } } - public override long Position { get { return stream.Position; } set { stream.Position = value; } } + 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 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 long Seek(long offset, SeekOrigin origin) { return Stream.Seek(offset, origin); } - public override void SetLength(long value) { stream.SetLength(value); } + 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 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; } } } }