Beispiel #1
0
        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);
        }