Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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());
        }