private Package ReadPackageV13(FileStream mainStream, BinaryReader reader)
{
var package = new Package();
var header = BinUtils.ReadStruct<LSPKHeader13>(reader);
if (header.Version != Package.CurrentVersion)
{
var msg = String.Format("Unsupported package version {0}; this extractor only supports {1}", header.Version, Package.CurrentVersion);
throw new InvalidDataException(msg);
}
OpenStreams(mainStream, header.NumParts);
mainStream.Seek(header.FileListOffset, SeekOrigin.Begin);
int numFiles = reader.ReadInt32();
int fileBufferSize = Marshal.SizeOf(typeof(FileEntry13)) * numFiles;
byte[] compressedFileList = reader.ReadBytes((int)header.FileListSize - 4);
var uncompressedList = new byte[fileBufferSize];
var uncompressedSize = LZ4Codec.Decode(compressedFileList, 0, compressedFileList.Length, uncompressedList, 0, fileBufferSize, true);
if (uncompressedSize != fileBufferSize)
{
var msg = String.Format("LZ4 compressor disagrees about the size of file headers; expected {0}, got {1}", fileBufferSize, uncompressedSize);
throw new InvalidDataException(msg);
}
var ms = new MemoryStream(uncompressedList);
var msr = new BinaryReader(ms);
for (int i = 0; i < numFiles; i++)
{
var entry = BinUtils.ReadStruct<FileEntry13>(msr);
package.Files.Add(PackagedFileInfo.CreateFromEntry(entry, streams[entry.ArchivePart]));
}
return package;
}