internal Group(IReader headerReader, IReader dataReader) { this.Type = Signature.Read(0, headerReader); this.Size = headerReader.ReadUInt32(4); this.Label = headerReader.ReadUInt32(8); this.GroupType = headerReader.ReadInt32(12); this.Stamp = headerReader.ReadUInt16(16); this.Unknown1 = headerReader.ReadUInt16(18); this.Version = headerReader.ReadUInt16(20); this.Unknown2 = headerReader.ReadUInt16(22); this.Children = new List <IRecordOrGroup>(); var children = dataReader; while (true) { if (children.Length < 4) { break; } var type = Signature.Read(0, children); var size = children.ReadUInt32(4); IRecordOrGroup item = null; var actualSize = size; var childHeader = children.Slice(0, 24); var keep = false; if (type == GRUP) { /*var childData = children.Slice(24, (int) size - 24); * item = new Group(childHeader, childData); * keep = true;*/ } else { actualSize += 24; if (Registry.ParsedRecords.ContainsKey(type)) { var childData = children.Slice(24, (int)size); item = Registry.ParsedRecords.TryGetValue(type, out var constructor) ? constructor(childHeader, childData) : new Record(childHeader, childData); keep = true; } } if (keep) { this.Children.Add(item); } children = children.Slice((int)actualSize); } }
public ModFile(string filename) { this.Children = new List <IRecordOrGroup>(); using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 8192, FileOptions.SequentialScan)) { using (var br = new BinaryReader(fs)) { while (true) { if (fs.Position + 4 >= fs.Length) { break; } var header = br.NextChunk(24); var type = Signature.Read(0, header); var size = header.ReadUInt32(4); if (type == Group.GRUP) { size -= 24; } var data = br.NextChunk((int)size); IRecordOrGroup item = null; var keep = false; if (type == Group.GRUP) { /*item = new Group(header, data); * keep = true;*/ } else { if (Registry.ParsedRecords.ContainsKey(type)) { item = Registry.ParsedRecords.TryGetValue(type, out var constructor) ? constructor(header, data) : new Record(header, data); keep = true; } } if (keep) { this.Children.Add(item); } } } } }