Implement MergedStream.Position properly

This commit is contained in:
Matthias Mailänder
2016-01-13 12:48:27 +01:00
parent dc62dcd56d
commit d578ea4094

View File

@@ -18,6 +18,7 @@ namespace OpenRA.Primitives
public Stream Stream2 { get; set; } public Stream Stream2 { get; set; }
long VirtualLength { get; set; } long VirtualLength { get; set; }
long position;
public MergedStream(Stream stream1, Stream stream2) public MergedStream(Stream stream1, Stream stream2)
{ {
@@ -35,8 +36,6 @@ namespace OpenRA.Primitives
public override long Seek(long offset, SeekOrigin origin) public override long Seek(long offset, SeekOrigin origin)
{ {
var position = Position;
switch (origin) switch (origin)
{ {
case SeekOrigin.Begin: case SeekOrigin.Begin:
@@ -52,9 +51,9 @@ namespace OpenRA.Primitives
} }
if (position >= Stream1.Length) if (position >= Stream1.Length)
Position = Stream1.Length + Stream2.Seek(offset - Stream1.Length, SeekOrigin.Begin); position = Stream1.Length + Stream2.Seek(offset - Stream1.Length, SeekOrigin.Begin);
else else
Position = Stream1.Seek(offset, SeekOrigin.Begin); position = Stream1.Seek(offset, SeekOrigin.Begin);
return position; return position;
} }
@@ -68,7 +67,7 @@ namespace OpenRA.Primitives
{ {
int bytesRead; int bytesRead;
if (Position >= Stream1.Length) if (position >= Stream1.Length)
bytesRead = Stream2.Read(buffer, offset, count); bytesRead = Stream2.Read(buffer, offset, count);
else if (count > Stream1.Length) else if (count > Stream1.Length)
{ {
@@ -78,14 +77,14 @@ namespace OpenRA.Primitives
else else
bytesRead = Stream1.Read(buffer, offset, count); bytesRead = Stream1.Read(buffer, offset, count);
Position += bytesRead; position += bytesRead;
return bytesRead; return bytesRead;
} }
public override void Write(byte[] buffer, int offset, int count) public override void Write(byte[] buffer, int offset, int count)
{ {
if (Position >= Stream1.Length) if (position >= Stream1.Length)
Stream2.Write(buffer, offset - (int)Stream1.Length, count); Stream2.Write(buffer, offset - (int)Stream1.Length, count);
else else
Stream1.Write(buffer, offset, count); Stream1.Write(buffer, offset, count);
@@ -111,6 +110,10 @@ namespace OpenRA.Primitives
get { return VirtualLength; } get { return VirtualLength; }
} }
public override long Position { get; set; } public override long Position
{
get { return position; }
set { Seek(value, SeekOrigin.Begin); }
}
} }
} }