public void Deserialize(Stream input) { uint magic = input.ReadValueU32(); if (magic != 0x41444620 && magic.Swap() != 0x41444620) { throw new FormatException("not a ADF file"); } var endian = magic == 0x41444620 // ' FDA' ? Endian.Little : Endian.Big; this.Version = input.ReadValueU32(endian); if (this.Version != 1) { throw new FormatException("unhandled ADF file version"); } uint dataCount = input.ReadValueU32(endian); uint dataOffset = input.ReadValueU32(endian); uint definitionCount = input.ReadValueU32(endian); uint definitionOffset = input.ReadValueU32(endian); this.Definitions.Clear(); if (definitionCount > 0) { input.Seek(definitionOffset, SeekOrigin.Begin); for (uint i = 0; i < definitionCount; i++) { var definition = new DataFormat.Definition(); definition.Deserialize(input, endian); this.Definitions.Add(definition); } } this.Entries.Clear(); if (dataCount > 0) { input.Seek(dataOffset, SeekOrigin.Begin); for (uint i = 0; i < dataCount; i++) { var entry = new DataFormat.Entry(); entry.Deserialize(input, endian); this.Entries.Add(entry); } } this.Endian = endian; }
public object ParseDefinition(long baseOffset, DataFormat.Definition definition, Stream input) { if (definition.DefinitionType == DataFormat.DefinitionType.Structure) { var structure = new DataFormat.Structure(); foreach (var valueDefinition in definition.ValueDefinitions) { object value; if (IsNativeType(valueDefinition) == true) { value = this.ParseNativeValue(baseOffset, valueDefinition, input); } else { var subDefinition = this.FindDefinition(valueDefinition.TypeHash); if (subDefinition == null) { throw new InvalidOperationException("missing definition " + valueDefinition.TypeHash.ToString("X8")); } value = this.ParseDefinition( baseOffset + valueDefinition.Offset, subDefinition, input); } structure.Values.Add(valueDefinition.Name, value); } return(structure); } if (definition.DefinitionType == DataFormat.DefinitionType.Array) { input.Seek(baseOffset, SeekOrigin.Begin); uint offset = input.ReadValueU32(this.Endian); uint count = input.ReadValueU32(this.Endian); object value; if (IsNativeType(definition.ElementTypeHash) == true) { value = this.ParseNativeArray( offset, count, definition.ElementTypeHash, input); } else { var elementDefinition = this.FindDefinition(definition.ElementTypeHash); var elements = new List <object>(); for (uint i = 0; i < count; i++) { var element = this.ParseDefinition( offset + (i * elementDefinition.Size), elementDefinition, input); elements.Add(element); } value = elements; } return(value); } throw new InvalidOperationException("unhandled " + definition.DefinitionType.ToString()); }