Allow MixFile to support all stream types again, not just FileStream.
This commit is contained in:
@@ -191,9 +191,22 @@ namespace OpenRA.FileSystem
|
|||||||
public Stream GetContent(PackageEntry entry)
|
public Stream GetContent(PackageEntry entry)
|
||||||
{
|
{
|
||||||
Stream parentStream;
|
Stream parentStream;
|
||||||
var offset = dataStart + entry.Offset + SegmentStream.GetOverallNestedOffset(s, out parentStream);
|
var baseOffset = dataStart + entry.Offset;
|
||||||
var path = ((FileStream)parentStream).Name;
|
var nestedOffset = baseOffset + SegmentStream.GetOverallNestedOffset(s, out parentStream);
|
||||||
return new SegmentStream(File.OpenRead(path), offset, entry.Length);
|
|
||||||
|
// Special case FileStream - instead of creating an in-memory copy,
|
||||||
|
// just reference the portion of the on-disk file that we need to save memory.
|
||||||
|
// We use GetType instead of 'is' here since we can't handle any derived classes of FileStream.
|
||||||
|
if (parentStream.GetType() == typeof(FileStream))
|
||||||
|
{
|
||||||
|
var path = ((FileStream)parentStream).Name;
|
||||||
|
return new SegmentStream(File.OpenRead(path), nestedOffset, entry.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For all other streams, create a copy in memory.
|
||||||
|
// This uses more memory but is the only way in general to ensure the returned streams won't clash.
|
||||||
|
s.Seek(baseOffset, SeekOrigin.Begin);
|
||||||
|
return new MemoryStream(s.ReadBytes((int)entry.Length));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Stream GetStream(string filename)
|
public Stream GetStream(string filename)
|
||||||
|
|||||||
Reference in New Issue
Block a user