public PssgNode(XElement elem, PssgFile file, PssgNode node) { this.File = file; this.ParentNode = node; this.NodeInfo = PssgSchema.AddNode(elem.Name.LocalName);// PssgSchema.GetNode(elem.Name.LocalName); this.Attributes = new PssgAttributeCollection(); PssgAttribute attr; foreach (XAttribute xAttr in elem.Attributes()) { attr = new PssgAttribute(xAttr, file, this); this.Attributes.Add(attr); } // Add data, and sub nodes code here if (elem.FirstNode != null && elem.FirstNode is XText) { this.data = this.FromString(elem.Value); this.ChildNodes = new PssgNodeCollection(); } else { this.data = new byte[0]; this.ChildNodes = new PssgNodeCollection(elem.Elements().Count()); int nodeCount = 0; foreach (XElement subElem in elem.Elements()) { this.ChildNodes.Add(new PssgNode(subElem, file, this)); ++nodeCount; } } PssgSchema.SetNodeDataTypeIfNull(this.NodeInfo, this.ValueType); }
internal static Node AddNode(Node node) { if (!entries.ContainsKey(node.Name)) { entries.Add(node.Name, node); return(node); } else { PssgSchema.SetNodeDataTypeIfNull(entries[node.Name], node.DataType); foreach (Attribute attrEntry in node.Attributes) { bool add = true; for (int i = 0; i < entries[node.Name].Attributes.Count; i++) { if (entries[node.Name].Attributes[i].Name == attrEntry.Name) { add = false; PssgSchema.SetAttributeDataTypeIfNull(entries[node.Name].Attributes[i], attrEntry.DataType); break; } } if (add) { entries[node.Name].Attributes.Add(attrEntry); } } return(entries[node.Name]); } }
public PssgNode(PssgBinaryReader reader, PssgFile file, PssgNode node, bool useDataNodeCheck) { this.File = file; this.ParentNode = node; int id = reader.ReadInt32(); this.NodeInfo = PssgSchema.GetNode(id); this.size = reader.ReadInt32(); long end = reader.BaseStream.Position + size; this.attributeSize = reader.ReadInt32(); long attributeEnd = reader.BaseStream.Position + attributeSize; if (attributeEnd > reader.BaseStream.Length || end > reader.BaseStream.Length) { throw new Exception("This file is improperly saved and not supported by this version of the PSSG editor." + Environment.NewLine + Environment.NewLine + "Get an older version of the program if you wish to take out its contents, but, put it back together using this program and a non-modded version of the pssg file."); } // Each attr is at least 8 bytes (id + size), so take a conservative guess this.Attributes = new PssgAttributeCollection(); PssgAttribute attr; while (reader.BaseStream.Position < attributeEnd) { attr = new PssgAttribute(reader, file, this); this.Attributes.Add(attr); } bool isDataNode = false; switch (Name) { case "BOUNDINGBOX": case "DATA": case "DATABLOCKDATA": case "DATABLOCKBUFFERED": case "INDEXSOURCEDATA": case "INVERSEBINDMATRIX": case "MODIFIERNETWORKINSTANCEUNIQUEMODIFIERINPUT": case "NeAnimPacketData_B1": case "NeAnimPacketData_B4": case "RENDERINTERFACEBOUNDBUFFERED": case "SHADERINPUT": case "TEXTUREIMAGEBLOCKDATA": case "TRANSFORM": isDataNode = true; break; } if (isDataNode == false && useDataNodeCheck == true) { long currentPos = reader.BaseStream.Position; // Check if it has subnodes while (reader.BaseStream.Position < end) { int tempID = reader.ReadInt32(); if (tempID < 0)//tempID > file.nodeInfo.Length || { isDataNode = true; break; } else { int tempSize = reader.ReadInt32(); if ((reader.BaseStream.Position + tempSize > end) || (tempSize == 0 && tempID == 0) || tempSize < 0) { isDataNode = true; break; } else if (reader.BaseStream.Position + tempSize == end) { break; } else { reader.BaseStream.Position += tempSize; } } } reader.BaseStream.Position = currentPos; } if (isDataNode) { this.data = reader.ReadNodeValue(GetValueType(), (int)(end - reader.BaseStream.Position)); this.ChildNodes = new PssgNodeCollection(); //data = reader.ReadBytes((int)(end - reader.BaseStream.Position)); } else { this.data = new byte[0]; // Each node at least 12 bytes (id + size + arg size) this.ChildNodes = new PssgNodeCollection((int)(end - reader.BaseStream.Position) / 12); int nodeCount = 0; while (reader.BaseStream.Position < end) { this.ChildNodes.Add(new PssgNode(reader, file, this, useDataNodeCheck)); nodeCount++; } } PssgSchema.SetNodeDataTypeIfNull(this.NodeInfo, this.ValueType); }