1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-21 17:28:00 +02:00

Substream fixes

This commit is contained in:
Brian Fiete 2021-01-31 05:26:09 -08:00
parent 0576e74d58
commit 9c473dc269

View file

@ -8,16 +8,18 @@ namespace System.IO
Stream mChildStream ~ { if (mOwnsStream) delete _; }; Stream mChildStream ~ { if (mOwnsStream) delete _; };
int64 mOffset; int64 mOffset;
int64 mLength; int64 mLength;
int64 mPosition;
public override int64 Position public override int64 Position
{ {
get get
{ {
return mChildStream.Position + mOffset; return mPosition;
} }
set set
{ {
mPosition = value;
mChildStream.Position = value + mOffset; mChildStream.Position = value + mOffset;
} }
} }
@ -50,6 +52,7 @@ namespace System.IO
public this(Stream childStream, int64 offset, int64 length, bool ownsStream = false) public this(Stream childStream, int64 offset, int64 length, bool ownsStream = false)
{ {
mChildStream = childStream; mChildStream = childStream;
mChildStream.Position = offset;
mOffset = offset; mOffset = offset;
mLength = length; mLength = length;
mOwnsStream = ownsStream; mOwnsStream = ownsStream;
@ -57,12 +60,38 @@ namespace System.IO
public override Result<int> TryRead(Span<uint8> data) public override Result<int> TryRead(Span<uint8> 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<int> TryWrite(Span<uint8> data) public override Result<int> TryWrite(Span<uint8> 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() public override void Close()