Implement MergedStream.Position properly
This commit is contained in:
@@ -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); }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user