private List <IChunk> ParseChunks(BinaryReader reader, List <IChunk> chunks, List <string> chunkTags) { var localChunks = new List <IChunk>(); teChunkDataEntry entry = reader.Read <teChunkDataEntry>(); var rootSize = entry.SerializedSize; var start = reader.BaseStream.Position; var startAbs = start; while (entry.SerializationTag == 0xC65C) { IChunk chunk = Manager.CreateChunkInstance(entry.StringIdentifier, Header.StringIdentifier); if (chunk != null) { using (SliceStream sliceStream = new SliceStream(reader.BaseStream, entry.ChunkSize)) { chunk.Parse(sliceStream); } } localChunks.Add(chunk); // i'm too lazy to rewrite a bunch of code. chunks.Add(chunk); chunkTags.Add(entry.StringIdentifier); reader.BaseStream.Position = start + entry.ChunkSize; if (entry.SerializedSize > entry.ChunkSize) // child chunk { var childChunk = ParseChunks(reader, chunks, chunkTags); if (chunk != null) { if (chunk.SubChunks == null) { chunk.SubChunks = new List <IChunk>(); } chunk.SubChunks.AddRange(childChunk); } } if (reader.BaseStream.Position - startAbs >= rootSize) { break; } entry = reader.Read <teChunkDataEntry>(); start = reader.BaseStream.Position; } reader.BaseStream.Position = start + entry.SerializedSize; return(localChunks); }
private unsafe void Read(BinaryReader reader) { long start = reader.BaseStream.Position; List <IChunk> chunks = new List <IChunk>(); List <string> chunkTags = new List <string>(); Header = reader.Read <teChunkDataHeader>(); if (Header.Magic != Magic) { return; } long next = reader.BaseStream.Position - start; // rel stream pos while (next < Header.Size) { teChunkDataEntry entry = reader.Read <teChunkDataEntry>(); next += entry.Size + sizeof(teChunkDataEntry); IChunk chunk = Manager.CreateChunkInstance(entry.StringIdentifier, Header.StringIdentifier); if (chunk != null) { MemoryStream dataStream = new MemoryStream(entry.Size); reader.BaseStream.CopyBytes(dataStream, entry.Size); dataStream.Position = 0; chunk.Parse(dataStream); dataStream.Dispose(); } chunkTags.Add(entry.StringIdentifier); chunks.Add(chunk); reader.BaseStream.Position = next + start; } Chunks = chunks.ToArray(); ChunkTags = chunkTags.ToArray(); }