private VLTBase ReadChunk(BinaryReader br) { if (br.BaseStream.Position == br.BaseStream.Length) { return(null); } VLTChunk chunk = new VLTChunk(); chunk.Read(br); if (chunk.IsValid) { VLTBase vltbase = null; switch (chunk.ChunkId) { case VLTChunkId.Dependency: vltbase = new VLTDependency(); break; case VLTChunkId.Strings: vltbase = new VLTRaw(); break; case VLTChunkId.Data: vltbase = new VLTRaw(); break; case VLTChunkId.Expression: vltbase = new VLTExpression(); break; case VLTChunkId.Pointers: vltbase = new VLTPointers(); break; default: vltbase = new VLTRaw(); break; } vltbase.Chunk = chunk; vltbase.Read(br); chunk.SkipChunk(br.BaseStream); return(vltbase); } else { return(null); } }
public void Open(Stream vlt, Stream bin) { byte[] data = new byte[vlt.Length]; vlt.Read(data, 0, data.Length); _binVlt = new MemoryStream(data); _chunks = new ArrayList(); BinaryReader br = new BinaryReader(_binVlt); // Load up the chunks VLTBase chunk; do { chunk = ReadChunk(br); if (chunk != null) { _chunks.Add(chunk); } } while (chunk != null); // Load up expression data VLTExpression expChunk = GetChunk(VLTChunkId.Expression) as VLTExpression; for (int i = 0; i < expChunk.Count; i++) { VLTExpressionBlock block = expChunk[i]; block.ReadData(br); } // Load up raw bin data if (bin == null) { DirectoryInfo di = new DirectoryInfo(_baseDir); VLTDependency dep = GetChunk(VLTChunkId.Dependency) as VLTDependency; string binName = dep.GetName(VLTDependency.BinFile); FileInfo[] fi = di.GetFiles(binName); if (fi.Length == 0) { throw new Exception("Required file " + binName + " was not found."); } bin = new FileStream(fi[0].FullName, FileMode.Open, FileAccess.Read); data = new byte[bin.Length]; bin.Read(data, 0, data.Length); bin.Close(); } else { data = new byte[bin.Length]; bin.Read(data, 0, data.Length); } _binRaw = new MemoryStream(data); br = new BinaryReader(_binRaw); _binRaw.Seek(0, SeekOrigin.Begin); chunk = ReadChunk(br); chunk.Chunk.GotoStart(_binRaw); if (chunk.Chunk.ChunkId == VLTChunkId.StringsRaw) { int endPos = (int)_binRaw.Position + chunk.Chunk.DataLength; while (_binRaw.Position < endPos) { string str = NullTerminatedString.Read(br); if (str != "") { HashResolver.AddAuto(str); } } } VLTPointers ptrChunk = GetChunk(VLTChunkId.Pointers) as VLTPointers; ptrChunk.ResolveRawPointers(_binRaw); }