LSLib.Granny.GR2.GR2Reader.ReadHeader C# (CSharp) Method

ReadHeader() private method

private ReadHeader ( ) : Header
return Header
        private Header ReadHeader()
        {
            var header = new Header();
            header.version = InputReader.ReadUInt32();
            header.fileSize = InputReader.ReadUInt32();
            header.crc = InputReader.ReadUInt32();
            header.sectionsOffset = InputReader.ReadUInt32();
            header.numSections = InputReader.ReadUInt32();
            header.rootType = ReadSectionReferenceUnchecked();
            header.rootNode = ReadSectionReferenceUnchecked();
            header.tag = InputReader.ReadUInt32();
            header.extraTags = new UInt32[Header.ExtraTagCount];
            for (int i = 0; i < Header.ExtraTagCount; i++)
                header.extraTags[i] = InputReader.ReadUInt32();
            header.stringTableCrc = InputReader.ReadUInt32();
            header.reserved1 = InputReader.ReadUInt32();
            header.reserved2 = InputReader.ReadUInt32();
            header.reserved3 = InputReader.ReadUInt32();

            if (header.version != Header.Version)
                throw new ParsingException(String.Format("Unsupported GR2 version; expected {0}, got {1}", Header.Version, header.version));

            // if (header.tag != Header.Tag)
            //    throw new ParsingException(String.Format("Incorrect header tag; expected {0:X8}, got {1:X8}", Header.Tag, header.tag));

            Debug.Assert(header.fileSize <= InputStream.Length);
            Debug.Assert(header.CalculateCRC(InputStream) == header.crc);
            Debug.Assert(header.sectionsOffset == Header.HeaderSize);
            Debug.Assert(header.rootType.Section < header.numSections);
            // TODO: check rootTypeOffset after serialization
            Debug.Assert(header.stringTableCrc == 0);
            Debug.Assert(header.reserved1 == 0);
            Debug.Assert(header.reserved2 == 0);
            Debug.Assert(header.reserved3 == 0);

#if DEBUG_GR2_SERIALIZATION
            System.Console.WriteLine(" ===== GR2 Header ===== ");
            System.Console.WriteLine(String.Format("Version {0}, Size {1}, CRC {2:X8}", header.version, header.fileSize, header.crc));
            System.Console.WriteLine(String.Format("Offset of sections: {0}, num sections: {1}", header.sectionsOffset, header.numSections));
            System.Console.WriteLine(String.Format("Root type section {0}, Root type offset {1:X8}", header.rootType.Section, header.rootType.Offset));
            System.Console.WriteLine(String.Format("Root node section {0} {1:X8}", header.rootNode.Section, header.rootNode.Offset));
            System.Console.WriteLine(String.Format("Tag: {0:X8}, Strings CRC: {1:X8}", header.tag, header.stringTableCrc));
            System.Console.WriteLine(String.Format("Extra tags: {0:X8} {1:X8} {2:X8} {3:X8}", header.extraTags[0], header.extraTags[1], header.extraTags[2], header.extraTags[3]));
            System.Console.WriteLine(String.Format("Reserved: {0:X8} {1:X8} {2:X8}", new object[] { header.reserved1, header.reserved2, header.reserved3 }));
#endif

            return header;
        }