public void WriteV13(FileStream mainStream)
{
long totalSize = package.Files.Sum(p => (long)p.Size());
long currentSize = 0;
List<PackagedFileInfo> writtenFiles = new List<PackagedFileInfo>();
foreach (var file in this.package.Files)
{
writeProgress(file, currentSize, totalSize);
writtenFiles.Add(WriteFile(file));
currentSize += file.Size();
}
using (var writer = new BinaryWriter(mainStream, new UTF8Encoding(), true))
{
var header = new LSPKHeader13();
header.Version = Version;
header.FileListOffset = (UInt32)mainStream.Position;
writer.Write((UInt32)writtenFiles.Count);
var fileList = new MemoryStream();
var fileListWriter = new BinaryWriter(fileList);
foreach (var file in writtenFiles)
{
var entry = file.MakeEntryV13();
BinUtils.WriteStruct<FileEntry13>(fileListWriter, ref entry);
}
var fileListBuf = fileList.ToArray();
fileListWriter.Dispose();
var compressedFileList = LZ4Codec.EncodeHC(fileListBuf, 0, fileListBuf.Length);
writer.Write(compressedFileList);
header.FileListSize = (UInt32)mainStream.Position - header.FileListOffset;
header.NumParts = (UInt16)streams.Count;
header.SomePartVar = 0; // ???
header.ArchiveGuid = Guid.NewGuid();
BinUtils.WriteStruct<LSPKHeader13>(writer, ref header);
writer.Write((UInt32)(8 + Marshal.SizeOf(typeof(LSPKHeader13))));
writer.Write(Package.Signature);
}
}