Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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();
        }