diff --git a/BeefLibs/corlib/src/IO/Substream.bf b/BeefLibs/corlib/src/IO/Substream.bf index dbc0dca7..a7a83288 100644 --- a/BeefLibs/corlib/src/IO/Substream.bf +++ b/BeefLibs/corlib/src/IO/Substream.bf @@ -8,16 +8,18 @@ namespace System.IO Stream mChildStream ~ { if (mOwnsStream) delete _; }; int64 mOffset; int64 mLength; + int64 mPosition; public override int64 Position { get { - return mChildStream.Position + mOffset; + return mPosition; } set { + mPosition = value; mChildStream.Position = value + mOffset; } } @@ -50,6 +52,7 @@ namespace System.IO public this(Stream childStream, int64 offset, int64 length, bool ownsStream = false) { mChildStream = childStream; + mChildStream.Position = offset; mOffset = offset; mLength = length; mOwnsStream = ownsStream; @@ -57,12 +60,38 @@ namespace System.IO public override Result TryRead(Span data) { - return mChildStream.TryRead(data); + var tryData = data; + if (mPosition + data.Length > mLength) + { + tryData.Length = mLength - mPosition; + } + + switch (mChildStream.TryRead(tryData)) + { + case .Ok(let len): + mPosition += len; + return .Ok(len); + case .Err(let err): + return .Err(err); + } } public override Result TryWrite(Span data) { - return mChildStream.TryWrite(data); + var tryData = data; + if (mPosition + data.Length > mLength) + { + tryData.Length = mLength - mPosition; + } + + switch (mChildStream.TryWrite(tryData)) + { + case .Ok(let len): + mPosition += len; + return .Ok(len); + case .Err(let err): + return .Err(err); + } } public override void Close()