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;
}