/// <summary> /// Loads data into a <see cref="Vault" /> instance. /// </summary> /// <param name="vault">The vault to be read and loaded.</param> /// <param name="loadingWrapper">The provider of the vault stream readers.</param> public void LoadVault(Vault vault, VaultLoadingWrapper loadingWrapper) { Debug.Assert(vault.Database == null, "vault.Database == null"); Debug.Assert(vault.BinStream != null, "vault.BinStream != null"); Debug.Assert(vault.VltStream != null, "vault.VltStream != null"); vault.Database = this; BinaryReader binStreamReader = loadingWrapper.BinReader; BinaryReader vltStreamReader = loadingWrapper.VltReader; ChunkReader binChunkReader = new ChunkReader(binStreamReader); ChunkReader vltChunkReader = new ChunkReader(vltStreamReader); //Debug.WriteLine("Processing BIN chunks"); processBinChunks(vault, binChunkReader); //Debug.WriteLine("Processing VLT chunks"); processVltChunks(vault, vltChunkReader); //Debug.WriteLine("Processing pointers"); fixPointers(vault, VltPointerType.Bin, vault.BinStream); fixPointers(vault, VltPointerType.Vlt, vault.VltStream); //Debug.WriteLine("Reading exports"); ReadExports(vault, vltStreamReader, binStreamReader); Vaults.Add(vault); }
public IList <Vault> Load(BinaryReader br, Database database, PackLoadingOptions loadingOptions) { ByteOrder byteOrder = loadingOptions?.ByteOrder ?? ByteOrder.Little; // check for VPAK header AttribVaultPackImage vaultPackImage = new AttribVaultPackImage(); vaultPackImage.Read(null, br); br.BaseStream.Position = vaultPackImage.Header.StringBlockOffset; List <Vault> vaults = new List <Vault>(); foreach (AttribVaultPackEntry attribVaultPackEntry in vaultPackImage.Entries) { br.BaseStream.Position = vaultPackImage.Header.StringBlockOffset + attribVaultPackEntry.VaultNameOffset; Vault vault = new Vault(NullTerminatedString.Read(br)); br.BaseStream.Seek(attribVaultPackEntry.BinOffset, SeekOrigin.Begin); byte[] binData = new byte[attribVaultPackEntry.BinSize]; if (br.Read(binData, 0, binData.Length) != binData.Length) { throw new Exception($"Failed to read {binData.Length} bytes of BIN data"); } br.BaseStream.Seek(attribVaultPackEntry.VltOffset, SeekOrigin.Begin); byte[] vltData = new byte[attribVaultPackEntry.VltSize]; if (br.Read(vltData, 0, vltData.Length) != vltData.Length) { throw new Exception($"Failed to read {vltData.Length} bytes of VLT data"); } vault.BinStream = new MemoryStream(binData); vault.VltStream = new MemoryStream(vltData); using (VaultLoadingWrapper loadingWrapper = new VaultLoadingWrapper(vault, byteOrder)) { database.LoadVault(vault, loadingWrapper); } vaults.Add(vault); } return(vaults); }
public void Load(BinaryReader br, Database database, PackLoadingOptions loadingOptions = null) { string name = new string(br.ReadChars(0x2C)).Trim('\0'); int binOffset = br.ReadInt32(); int binSize = br.ReadInt32(); int vltOffset = br.ReadInt32(); int vltSize = br.ReadInt32(); int fileSize = br.ReadInt32(); if (fileSize != br.BaseStream.Length) { throw new InvalidDataException("Corrupted file"); } Vault vault = new Vault(name); DatabaseLoadedFile file = new DatabaseLoadedFile(); ByteOrder byteOrder = loadingOptions?.ByteOrder ?? ByteOrder.Little; br.BaseStream.Seek(binOffset, SeekOrigin.Begin); byte[] binBuffer = new byte[binSize]; if (br.Read(binBuffer, 0, binBuffer.Length) != binBuffer.Length) { throw new Exception($"Failed to read {binBuffer.Length} bytes of BIN data"); } br.BaseStream.Seek(vltOffset, SeekOrigin.Begin); byte[] vltBuffer = new byte[vltSize]; if (br.Read(vltBuffer, 0, vltBuffer.Length) != vltBuffer.Length) { throw new Exception($"Failed to read {vltBuffer.Length} bytes of VLT data"); } vault.BinStream = new MemoryStream(binBuffer); vault.VltStream = new MemoryStream(vltBuffer); using (VaultLoadingWrapper loadingWrapper = new VaultLoadingWrapper(vault, byteOrder)) database.LoadVault(file, vault, loadingWrapper); database.LoadFile(file); }
public IList <Vault> Load(BinaryReader br, Database database, PackLoadingOptions loadingOptions = null) { if (br.ReadUInt32() != 0x73795341) { throw new InvalidDataException("Cannot process this stream: Invalid header magic"); } uint numFiles = br.ReadUInt32(); if (numFiles != 2) { throw new InvalidDataException("Cannot process this stream: Invalid file count"); } uint nameTableLength = br.ReadUInt32(); br.ReadUInt32(); uint vltSize = br.ReadUInt32(); br.ReadUInt32(); uint vltOffset = br.ReadUInt32(); br.ReadUInt32(); uint binSize = br.ReadUInt32(); br.ReadUInt32(); uint binOffset = br.ReadUInt32(); br.ReadUInt32(); var fileNames = new List <string>(); for (int i = 0; i < numFiles; i++) { fileNames.Add(NullTerminatedString.Read(br)); } long endOffset = br.BaseStream.Position; byte[] vltData = new byte[vltSize]; br.BaseStream.Position = endOffset + vltOffset; if (br.Read(vltData, 0, vltData.Length) != vltData.Length) { throw new Exception("could not read VLT data"); } byte[] binData = new byte[binSize]; br.BaseStream.Position = endOffset + binOffset; if (br.Read(binData, 0, binData.Length) != binData.Length) { throw new Exception("could not read BIN data"); } Vault vault = new Vault(fileNames[0].Substring(0, fileNames[0].IndexOf('.'))) { BinStream = new MemoryStream(binData), VltStream = new MemoryStream(vltData) }; using (VaultLoadingWrapper loadingWrapper = new VaultLoadingWrapper(vault, loadingOptions?.ByteOrder ?? ByteOrder.Little)) { database.LoadVault(vault, loadingWrapper); } return(new ReadOnlyCollection <Vault>(new List <Vault>(new[] { vault }))); }