public void WriteV7(FileStream mainStream)
{
if (Compression == CompressionMethod.LZ4)
{
throw new ArgumentException("LZ4 compression is only supported by V10 and later package versions");
}
using (var writer = new BinaryWriter(mainStream, new UTF8Encoding(), true))
{
var header = new LSPKHeader7();
header.Version = Version;
header.NumFiles = (UInt32)package.Files.Count;
header.FileListSize = (UInt32)(Marshal.SizeOf(typeof(FileEntry7)) * package.Files.Count);
header.DataOffset = (UInt32)Marshal.SizeOf(typeof(LSPKHeader7)) + header.FileListSize;
var paddingLength = PaddingLength();
if (header.DataOffset % paddingLength > 0)
{
header.DataOffset += (UInt32)(paddingLength - (header.DataOffset % paddingLength));
}
// Write a placeholder instead of the actual headers; we'll write them after we
// compressed and flushed all files to disk
var placeholder = new byte[header.DataOffset];
writer.Write(placeholder);
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();
}
mainStream.Seek(0, SeekOrigin.Begin);
header.LittleEndian = 0;
header.NumParts = (UInt16)streams.Count;
BinUtils.WriteStruct<LSPKHeader7>(writer, ref header);
foreach (var file in writtenFiles)
{
var entry = file.MakeEntryV7();
if (entry.ArchivePart == 0)
{
entry.OffsetInFile -= header.DataOffset;
}
BinUtils.WriteStruct<FileEntry7>(writer, ref entry);
}
}
}