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(); } } } }
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(); }
public WorkItem(long id, string name, TypeDefinition typeDefinition, long offset) { this.Id = id; this.Name = name; this.TypeDefinition = typeDefinition; this.Offset = offset; }
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); }
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); }