5 using SiliconStudio.Core.IO;
7 namespace SiliconStudio.Core.Serialization
15 public Stream InternalStream {
get;
internal protected set; }
19 private readonly
bool disposeInternalStream;
21 public long StartPosition
23 get {
return startPosition; }
26 public long EndPosition
28 get {
return endPosition; }
40 public VirtualFileStream(
Stream internalStream,
long startPosition = 0,
long endPosition = -1,
bool disposeInternalStream =
true,
bool seekToBeginning =
true)
42 this.disposeInternalStream = disposeInternalStream;
46 virtualFileStream = (VirtualFileStream)internalStream;
47 internalStream = virtualFileStream.InternalStream;
48 startPosition += virtualFileStream.startPosition;
49 if (endPosition == -1)
50 endPosition = virtualFileStream.endPosition;
52 endPosition += virtualFileStream.startPosition;
53 if (startPosition < virtualFileStream.startPosition || ((endPosition < startPosition || endPosition > virtualFileStream.endPosition) && virtualFileStream.endPosition != -1))
54 throw new ArgumentException(
"startPosition and endPosition doesn't fit inside current bounds");
56 if (!virtualFileStream.disposeInternalStream)
57 this.disposeInternalStream =
false;
60 InternalStream = internalStream;
61 this.startPosition = startPosition;
62 this.endPosition = endPosition;
65 InternalStream.Seek(startPosition, SeekOrigin.Begin);
68 protected override void Dispose(
bool disposing)
70 if (virtualFileStream != null)
71 virtualFileStream.Dispose();
72 virtualFileStream = null;
74 if (disposeInternalStream && InternalStream != null)
76 InternalStream.Dispose();
79 InternalStream = null;
80 base.Dispose(disposing);
84 public override bool CanRead
86 get {
return InternalStream.CanRead; }
90 public override bool CanSeek
92 get {
return InternalStream.CanSeek; }
96 public override bool CanWrite
98 get {
return InternalStream.CanWrite; }
104 InternalStream.Flush();
108 public override long Length
112 if (endPosition == -1)
113 return InternalStream.Length - startPosition;
114 return endPosition - startPosition;
119 public override long Position
121 get {
return InternalStream.Position - startPosition; }
122 set { InternalStream.Position = startPosition + value; }
126 public override int Read(byte[] buffer,
int offset,
int count)
128 if (endPosition != -1)
130 var maxCount = (int)(endPosition - InternalStream.Position);
131 if (count > maxCount)
135 var bytesProcessed = InternalStream.Read(buffer, offset,
count);
136 return bytesProcessed;
142 if (endPosition != -1 && InternalStream.Position >= endPosition)
147 return InternalStream.ReadByte();
151 public override long Seek(
long offset, SeekOrigin origin)
155 case SeekOrigin.Begin:
156 InternalStream.Seek(startPosition + offset, SeekOrigin.Begin);
158 case SeekOrigin.Current:
159 InternalStream.Seek(offset, SeekOrigin.Current);
163 if (endPosition == -1)
165 InternalStream.Seek(offset, SeekOrigin.End);
169 InternalStream.Seek(endPosition - startPosition + offset, SeekOrigin.Begin);
174 var newPosition = InternalStream.Position;
175 if (newPosition < startPosition || (endPosition != -1 && newPosition > endPosition))
177 InternalStream.Position = startPosition;
178 throw new InvalidOperationException(
"Seek position is out of bound.");
187 if (endPosition != -1)
189 throw new InvalidOperationException(
"Can't resize VirtualFileStream if endPosition is not -1.");
192 InternalStream.SetLength(value);
196 public override void Write(byte[] buffer,
int offset,
int count)
198 if (endPosition != -1 && count > endPosition - InternalStream.Position)
200 throw new NotSupportedException(
"Can't write beyond end of stream.");
203 InternalStream.Write(buffer, offset,
count);
209 if (endPosition != -1 && InternalStream.Position >= endPosition)
211 throw new NotSupportedException(
"Can't write beyond end of stream.");
214 InternalStream.WriteByte(value);
VirtualFileStream virtualFileStream
override int Read(byte[] buffer, int offset, int count)
override void SetLength(long value)
override void Write(byte[] buffer, int offset, int count)
override void WriteByte(byte value)
VirtualFileStream(Stream internalStream, long startPosition=0, long endPosition=-1, bool disposeInternalStream=true, bool seekToBeginning=true)
Initializes a new instance of the VirtualFileStream class.
override void Dispose(bool disposing)
override long Seek(long offset, SeekOrigin origin)
A Stream with additional methods for native read and write operations using IntPtr.
readonly long endPosition
readonly long startPosition
A multithreaded wrapper over a Stream, used by the VirtualFileSystem. It also allows restricted acces...