using System; using System.IO; namespace SharpCifs.Util.Sharpen { public class OutputStream : IDisposable { protected Stream Wrapped; public static implicit operator OutputStream(Stream s) { return Wrap(s); } public static implicit operator Stream(OutputStream s) { return s.GetWrappedStream(); } public virtual void Close() { if (Wrapped != null) { //Stream.`Close` method deleted //Wrapped.Close (); Wrapped.Dispose(); } } public void Dispose() { Close(); } public virtual void Flush() { if (Wrapped != null) { Wrapped.Flush(); } } internal Stream GetWrappedStream() { // Always create a wrapper stream (not directly Wrapped) since the subclass // may be overriding methods that need to be called when used through the Stream class return new WrappedSystemStream(this); } static internal OutputStream Wrap(Stream s) { OutputStream stream = new OutputStream(); stream.Wrapped = s; return stream; } public virtual void Write(int b) { if (Wrapped is WrappedSystemStream) ((WrappedSystemStream)Wrapped).OutputStream.Write(b); else { if (Wrapped == null) throw new NotImplementedException(); Wrapped.WriteByte((byte)b); } } public virtual void Write(byte[] b) { Write(b, 0, b.Length); } public virtual void Write(byte[] b, int offset, int len) { if (Wrapped is WrappedSystemStream) ((WrappedSystemStream)Wrapped).OutputStream.Write(b, offset, len); else { if (Wrapped != null) { Wrapped.Write(b, offset, len); } else { for (int i = 0; i < len; i++) { Write(b[i + offset]); } } } } } }