170 lines
3.6 KiB
C#
170 lines
3.6 KiB
C#
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|