public static void ParseChildren(IEnumerable <NodeEntry> children, BinaryReader reader, List <INodeParser> parsers) { foreach (var node in children) { reader.BaseStream.Position = node.Offset; var parser = parsers.Where(p => p.ParsableNodeName == node.Name).FirstOrDefault(); if (parser != null) { node.Value = parser.Read(node, reader, parsers); } else { var fallback = new DefaultParser(); node.Value = fallback.Read(node, reader, parsers); } } }
public byte[] Write(NodeEntry node, List <INodeParser> parsers) { byte[] result; var data = (DefaultRepresentation)node.Value; using (var stream = new MemoryStream()) { using (var writer = new BinaryWriter(stream, Encoding.ASCII)) { writer.Write(node.Id); writer.Write(data.Blob); if (node.Children.Count > 0) { foreach (var child in node.Children) { var parser = parsers.Where(p => p.ParsableNodeName == child.Name).FirstOrDefault(); if (parser != null) { writer.Write(parser.Write(child, parsers)); } else { var fallback = new DefaultParser(); writer.Write(fallback.Write(child, parsers)); } } } } result = stream.ToArray(); } //we are recalculating the size while writing if (node.TrueSize == 0)//dont have their ID written { result = new byte[4]; } return(result); }