예제 #1
0
            public void Write(TypeDefinition rootTypeDefinition, string name, MemoryStream data, XmlWriter writer)
            {
                this._Counter = 0;
                this._WorkQueue.Clear();
                this._WorkQueue.Enqueue(new WorkItem(this._Counter++, name, rootTypeDefinition, 0));
                while (this._WorkQueue.Count > 0)
                {
                    var workItem = this._WorkQueue.Dequeue();

                    switch (workItem.TypeDefinition.Type)
                    {
                    case TypeDefinitionType.Structure:
                    {
                        data.Position = workItem.Offset;
                        WriteStructure(writer, workItem.TypeDefinition, workItem.Id, workItem.Name, data);
                        break;
                    }

                    case TypeDefinitionType.Array:
                    {
                        data.Position = workItem.Offset;
                        WriteArray(writer, workItem.TypeDefinition, workItem.Id, data);
                        break;
                    }

                    default:
                    {
                        throw new NotImplementedException();
                    }
                    }
                }
            }
예제 #2
0
            private void WriteStructure(XmlWriter writer,
                                        TypeDefinition typeDefinition,
                                        long id,
                                        string name,
                                        MemoryStream data)
            {
                var basePosition = data.Position;

                writer.WriteStartElement("struct");
                writer.WriteAttributeString("type", typeDefinition.Name);

                if (name != null)
                {
                    writer.WriteAttributeString("name", name);
                }

                if (id >= 0)
                {
                    writer.WriteAttributeString("id", "#" + id);
                }

                foreach (var memberDefinition in typeDefinition.Members)
                {
                    data.Position = basePosition + memberDefinition.Offset;
                    this.WriteMember(writer, data, memberDefinition);
                }

                writer.WriteEndElement();
            }
예제 #3
0
 public WorkItem(long id, string name, TypeDefinition typeDefinition, long offset)
 {
     this.Id             = id;
     this.Name           = name;
     this.TypeDefinition = typeDefinition;
     this.Offset         = offset;
 }
예제 #4
0
            private void WriteArray(XmlWriter writer, TypeDefinition typeDefinition, long id, MemoryStream data)
            {
                var endian = this._Adf.Endian;
                var offset = data.ReadValueS64(endian);
                var count  = data.ReadValueS64(endian);

                data.Position = offset;
                this.WriteArrayItems(writer,
                                     typeDefinition.ElementTypeHash,
                                     id,
                                     data,
                                     count);
            }
예제 #5
0
        private static void ImportTypeDefinition(XPathNavigator typeNode, AdfFile adf)
        {
            TypeDefinition typeDef = new TypeDefinition()
            {
                Size            = uint.Parse(typeNode.GetAttribute("size", "")),
                Alignment       = uint.Parse(typeNode.GetAttribute("alignment", ""), CultureInfo.InvariantCulture),
                Name            = typeNode.GetAttribute("name", ""),
                NameHash        = uint.Parse(typeNode.GetAttribute("name-hash", ""), CultureInfo.InvariantCulture),
                Flags           = uint.Parse(typeNode.GetAttribute("flags", ""), CultureInfo.InvariantCulture),
                ElementLength   = uint.Parse(typeNode.GetAttribute("length", ""), CultureInfo.InvariantCulture),
                ElementTypeHash = uint.Parse(typeNode.GetAttribute("eltypehash", ""), CultureInfo.InvariantCulture),
            };

            Enum.TryParse(typeNode.GetAttribute("type", ""), out typeDef.Type);

            if (typeDef.Type == TypeDefinitionType.Structure)
            {
                // it has members
                var membersList = typeNode.Select("member");
                // so we will parse them
                typeDef.Members = new AdfFile.MemberDefinition[membersList.Count];

                int i = 0;
                foreach (XPathNavigator memberNode in membersList)
                {
                    typeDef.Members[i].Name         = memberNode.GetAttribute("name", "");
                    typeDef.Members[i].TypeHash     = uint.Parse(memberNode.GetAttribute("type-hash", ""), CultureInfo.InvariantCulture);
                    typeDef.Members[i].Size         = uint.Parse(memberNode.GetAttribute("size", ""), CultureInfo.InvariantCulture);
                    typeDef.Members[i].Offset       = uint.Parse(memberNode.GetAttribute("offset", ""), CultureInfo.InvariantCulture);
                    typeDef.Members[i].DefaultType  = uint.Parse(memberNode.GetAttribute("deftype", ""), CultureInfo.InvariantCulture);
                    typeDef.Members[i].DefaultValue = ulong.Parse(memberNode.GetAttribute("defval", ""), CultureInfo.InvariantCulture);
                    ++i;
                }
            }

            // Add it
            adf.TypeDefinitions.Add(typeDef);
        }