Exemplo n.º 1
0
        public override TREFile Load(Stream stream)
        {
            var start = stream.Position;
            var tag   = stream.ReadString(8);

            if (!tag.StartsWith(HeaderTagPrefix))
            {
                throw new IOException("TRE File does not contain valid TRE data");
            }
            if (!HeaderTagValidVersions.Any(htv => tag.EndsWith(htv)))
            {
                throw new IOException("TRE File does not contain valid TRE data");
            }

            var header = new TREFile.TreHeader
            {
                ResourceCount      = stream.ReadInt32(),
                InfoOffset         = stream.ReadInt32(),
                InfoCompression    = stream.ReadInt32(),
                InfoCompressedSize = stream.ReadInt32(),
                NameCompression    = stream.ReadInt32(),
                NameCompressedSize = stream.ReadInt32(),
                NameSize           = stream.ReadInt32(),
            };

            stream.Seek(start + header.InfoOffset, SeekOrigin.Begin);
            byte[] infoData;
            if (header.InfoCompression == 0)
            {
                infoData = stream.ReadBytes(header.InfoSize);
            }
            else
            {
                var infoBuffer = stream.ReadBytes(header.InfoCompressedSize);
                var inflater   = new Inflater(false);
                inflater.SetInput(infoBuffer);
                infoData = new Byte[header.InfoSize];
                inflater.Inflate(infoData);
            }

            byte[] nameData;
            if (header.NameCompression == 0)
            {
                nameData = stream.ReadBytes(header.NameSize);
            }
            else
            {
                var nameBuffer = stream.ReadBytes(header.NameCompressedSize);
                var inflater   = new Inflater(false);
                inflater.SetInput(nameBuffer);
                nameData = new Byte[header.NameSize];
                inflater.Inflate(nameData);
            }

            var names = new List <String>();

            using (var nameStream = new MemoryStream(nameData))
                while (nameStream.Position < nameStream.Length)
                {
                    names.Add(nameStream.ReadString());
                }

            var infoList = new List <TREFile.TreInfo>();

            using (var infoStream = new MemoryStream(infoData))
                using (var infoReader = new BinaryReader(infoStream))
                    foreach (var name in names)
                    {
                        var info = new TREFile.TreInfo
                        {
                            Name               = name,
                            Checksum           = infoReader.ReadInt32(),
                            DataSize           = infoReader.ReadInt32(),
                            DataOffset         = infoReader.ReadInt32(),
                            DataCompression    = infoReader.ReadInt32(),
                            DataCompressedSize = infoReader.ReadInt32(),
                            NameOffset         = infoReader.ReadInt32()
                        };
                        infoList.Add(info);
                    }

            return(new TREFile
            {
                Header = header,
                InfoFiles = infoList
            });
        }