using System; using System.IO; namespace SharpCifs.Util.Sharpen { public class InputStream : IDisposable { private long _mark; protected Stream Wrapped; protected Stream BaseStream; public static implicit operator InputStream(Stream s) { return Wrap(s); } public static implicit operator Stream(InputStream s) { return s.GetWrappedStream(); } public virtual int Available() { if (Wrapped is WrappedSystemStream) return ((WrappedSystemStream)Wrapped).InputStream.Available(); return 0; } public virtual void Close() { if (Wrapped != null) { //Stream.`Close` method deleted //Wrapped.Close(); Wrapped.Dispose(); } } public void Dispose() { Close(); } 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); } public virtual void Mark(int readlimit) { if (Wrapped is WrappedSystemStream) ((WrappedSystemStream)Wrapped).InputStream.Mark(readlimit); else { if (BaseStream is WrappedSystemStream) ((WrappedSystemStream)BaseStream).OnMark(readlimit); if (Wrapped != null) _mark = Wrapped.Position; } } public virtual bool MarkSupported() { if (Wrapped is WrappedSystemStream) return ((WrappedSystemStream)Wrapped).InputStream.MarkSupported(); return ((Wrapped != null) && Wrapped.CanSeek); } public virtual int Read() { if (Wrapped == null) { throw new NotImplementedException(); } return Wrapped.ReadByte(); } public virtual int Read(byte[] buf) { return Read(buf, 0, buf.Length); } public virtual int Read(byte[] b, int off, int len) { if (Wrapped is WrappedSystemStream) return ((WrappedSystemStream)Wrapped).InputStream.Read(b, off, len); if (Wrapped != null) { int num = Wrapped.Read(b, off, len); return ((num <= 0) ? -1 : num); } int totalRead = 0; while (totalRead < len) { int nr = Read(); if (nr == -1) return -1; b[off + totalRead] = (byte)nr; totalRead++; } return totalRead; } public virtual void Reset() { if (Wrapped is WrappedSystemStream) ((WrappedSystemStream)Wrapped).InputStream.Reset(); else { if (Wrapped == null) throw new IOException(); Wrapped.Position = _mark; } } public virtual long Skip(long cnt) { if (Wrapped is WrappedSystemStream) return ((WrappedSystemStream)Wrapped).InputStream.Skip(cnt); long n = cnt; while (n > 0) { if (Read() == -1) return cnt - n; n--; } return cnt - n; } internal virtual bool CanSeek() { if (Wrapped != null) return Wrapped.CanSeek; return false; } internal virtual long Position { get { if (Wrapped != null) return Wrapped.Position; throw new NotSupportedException(); } set { if (Wrapped != null) Wrapped.Position = value; else throw new NotSupportedException(); } } public virtual long Length { get { if (Wrapped != null) { return Wrapped.Length; } throw new NotSupportedException(); } } static internal InputStream Wrap(Stream s) { InputStream stream = new InputStream(); stream.Wrapped = s; return stream; } } }