Esempio n. 1
0
        public Chunked(Stream input, bool keepOpen = false, ChunkManager manager = null)
        {
            if (manager == null)
            {
                manager = Manager;
            }
            else
            {
                Manager = manager;
            }
            Chunks       = new List <IChunk>();
            entrees      = new List <ChunkedEntry>();
            entryOffsets = new List <long>();
            if (input == null)
            {
                return;
            }

            start = input.Position;

            using (BinaryReader reader = new BinaryReader(input, System.Text.Encoding.Default, keepOpen)) {
                Header = reader.Read <ChunkedHeader>();
                if (Header.magic != ChunkMagic)
                {
                    return;
                }

                long next = input.Position;
                while (next < Header.size)
                {
                    ChunkedEntry entry  = reader.Read <ChunkedEntry>();
                    long         offset = input.Position;
                    next = offset + entry.size;
                    IChunk chunk = manager.NewChunk(entry.StringIdentifier, Header.StringIdentifier);
                    if (chunk != null)
                    {
                        MemoryStream dataStream = new MemoryStream(entry.size);
                        CopyBytes(input, dataStream, entry.size);
                        dataStream.Position = 0;
                        chunk.Parse(dataStream);
                        try {
                            dataStream.Dispose();
                        } catch { }
                    }
                    Chunks.Add(chunk);
                    entrees.Add(entry);
                    entryOffsets.Add(offset);
                    input.Position = next;
                }
            }
        }
Esempio n. 2
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. 3
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();
        }