public void Save(BinaryWriter bw, IList <Vault> vaults, PackSavingOptions savingOptions = null) { if (vaults.Count != 1) { throw new InvalidDataException("Can only save exactly 1 vault"); } char[] nameChars = new char[0x2C]; _name.CopyTo(0, nameChars, 0, _name.Length); VaultWriter vaultWriter = new VaultWriter(vaults[0], new VaultSaveOptions()); vaultWriter.ExportManager.AddExport(new VaultSlotExport()); VaultStreamInfo vaultStreamInfo = vaultWriter.BuildVault(); bw.Write(nameChars); var binOffsetPos = bw.BaseStream.Position; bw.Write(0); bw.Write((uint)vaultStreamInfo.BinStream.Length); var vltOffsetPos = bw.BaseStream.Position; bw.Write(0); bw.Write((uint)vaultStreamInfo.VltStream.Length); var fileSizePos = bw.BaseStream.Position; bw.Write(0); bw.AlignWriter(0x40); var binOffset = bw.BaseStream.Position; vaultStreamInfo.BinStream.CopyTo(bw.BaseStream); bw.AlignWriter(0x40); var vltOffset = bw.BaseStream.Position; vaultStreamInfo.VltStream.CopyTo(bw.BaseStream); //bw.AlignWriter(0x80); bw.BaseStream.Position = binOffsetPos; bw.Write((uint)binOffset); bw.BaseStream.Position = vltOffsetPos; bw.Write((uint)vltOffset); bw.BaseStream.Position = fileSizePos; bw.Write((uint)bw.BaseStream.Length); bw.BaseStream.Position = bw.BaseStream.Length; }
public void Save(BinaryWriter bw, IList <Vault> vaults, PackSavingOptions savingOptions = null) { Dictionary <string, VaultStreamInfo> streamDictionary = new Dictionary <string, VaultStreamInfo>(); foreach (var vault in vaults) { VaultWriter vaultWriter = new VaultWriter(vault, new VaultSaveOptions()); streamDictionary[vault.Name] = vaultWriter.BuildVault(); } // empty header for now bw.Write(new byte[16]); Dictionary <string, int> nameOffsets = new Dictionary <string, int>(); int nameOffset = 0; foreach (var databaseVault in vaults) { nameOffsets[databaseVault.Name] = nameOffset; nameOffset += databaseVault.Name.Length + 1; } bw.Write(nameOffset); bw.Write(new byte[20 * vaults.Count]); bw.AlignWriter(0x40); var nameTablePos = bw.BaseStream.Position; foreach (var databaseVault in vaults) { NullTerminatedString.Write(bw, databaseVault.Name); } bw.AlignWriter(0x80); List <long> binOffsets = new List <long>(); List <long> vltOffsets = new List <long>(); foreach (var vault in vaults) { bw.AlignWriter(0x80); var streamInfo = streamDictionary[vault.Name]; binOffsets.Add(bw.BaseStream.Position); streamInfo.BinStream.CopyTo(bw.BaseStream); bw.AlignWriter(0x80); vltOffsets.Add(bw.BaseStream.Position); streamInfo.VltStream.CopyTo(bw.BaseStream); } bw.BaseStream.Position = 0; // write header AttribVaultPackImage vpi = new AttribVaultPackImage(); AttribVaultPackHeader header = new AttribVaultPackHeader { NumEntries = (uint)vaults.Count, StringBlockOffset = (uint)nameTablePos, StringBlockSize = (uint)nameOffset }; vpi.Header = header; vpi.Entries = new List <AttribVaultPackEntry>(); for (int i = 0; i < vaults.Count; i++) { Vault vault = vaults[i]; var streamInfo = streamDictionary[vault.Name]; AttribVaultPackEntry entry = new AttribVaultPackEntry { BinOffset = (uint)binOffsets[i], VltOffset = (uint)vltOffsets[i], BinSize = (uint)streamInfo.BinStream.Length, VltSize = (uint)streamInfo.VltStream.Length, VaultNameOffset = (uint)nameOffsets[vault.Name] }; vpi.Entries.Add(entry); } vpi.Write(null, bw); }