public void WriteV10(FileStream mainStream)
{
using (var writer = new BinaryWriter(mainStream, new UTF8Encoding(), true))
{
var header = new LSPKHeader10();
header.Version = Version;
header.NumFiles = (UInt32)package.Files.Count;
header.FileListSize = (UInt32)(Marshal.SizeOf(typeof(FileEntry13)) * package.Files.Count);
header.DataOffset = (UInt32)Marshal.SizeOf(typeof(LSPKHeader10)) + 4 + 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);
writer.Write(Package.Signature);
header.NumParts = (UInt16)streams.Count;
header.SomePartVar = 0; // ???
BinUtils.WriteStruct<LSPKHeader10>(writer, ref header);
foreach (var file in writtenFiles)
{
var entry = file.MakeEntryV13();
if (entry.ArchivePart == 0)
{
entry.OffsetInFile -= header.DataOffset;
}
// v10 packages don't support compression level in the flags field
entry.Flags &= 0x0f;
BinUtils.WriteStruct<FileEntry13>(writer, ref entry);
}
}
}