public static RecordView LoadFromBinary(BinaryReader reader, MemoryMappedFile mmf = null) { RecordView newView = new RecordView(); newView.Source = (DataSource)reader.ReadByte(); newView.FormID = new FormID(reader.ReadUInt32()); switch (newView.Source) { case DataSource.XML: newView.FilePath = reader.ReadString(); break; case DataSource.Binary: newView.file = mmf; newView.Offset = reader.ReadInt64(); newView.Size = reader.ReadInt64(); break; default: throw new NotImplementedException(newView.Source.ToString()); } return(newView); }
public void ReadXML(string sourceFolder, ElderScrollsPlugin master) { XDocument doc = XDocument.Load(Path.Combine(sourceFolder, "GroupHeader.metadata")); XElement headerRoot = (XElement)doc.FirstNode; Tag = "GRUP"; ReadTypeDataXML(headerRoot, master); foreach (var folder in Directory.EnumerateDirectories(sourceFolder, "*.*", SearchOption.TopDirectoryOnly)) { Group newGroup = Group.CreateGroup(folder); if (GroupAdded != null) { GroupAdded(newGroup); } newGroup.GroupAdded += (g) => { AllSubgroups.Add(g); if (GroupAdded != null) { GroupAdded(g); } }; newGroup.RecordViewAdded += (r) => { AllRecordViews.Add(r); if (RecordViewAdded != null) { RecordViewAdded(r); } }; Children.Add(newGroup); AllSubgroups.Add(newGroup); newGroup.ReadXML(folder, master); } foreach (var file in Directory.EnumerateFiles(sourceFolder, "*.xml", SearchOption.TopDirectoryOnly).Where(f => Path.GetFileName(f) != "GroupHeader.metadata")) { RecordView newView = new RecordView(file); ChildRecordViews.Add(newView); AllRecordViews.Add(newView); if (RecordViewAdded != null) { RecordViewAdded(newView); } } }
/// <summary> /// Creates a new plugin using the given RecordView that is assumed to contain a Header record /// </summary> /// <param name="name">The name of the plugin</param> /// <param name="header">The RecordView for the plugin, MUST be a view to a Header record</param> public ElderScrollsPlugin(string name, RecordView header) { if (header.Record is Header) { Name = name; Header = header; } else { throw new ArgumentException("header must be a RecordView to a Header record"); } }
public void ReadBinary(ESPReader reader, MemoryMappedFile source) { Tag = reader.ReadTag(); Size = reader.ReadUInt32() - 24; ReadTypeData(reader); GroupType thisType = (GroupType)reader.ReadUInt32(); Debug.Assert(thisType == type); LastModified = new DateStamp(); LastModified.ReadBinary(reader); Unknown = reader.ReadBytes(6); long offset = reader.BaseStream.Position; while (reader.BaseStream.Position < offset + Size) { if (reader.PeekTag() == "GRUP") { Group newGroup = Group.CreateGroup(reader); if (GroupAdded != null) { GroupAdded(newGroup); } newGroup.GroupAdded += (g) => { AllSubgroups.Add(g); if (GroupAdded != null) { GroupAdded(g); } }; newGroup.RecordViewAdded += (r) => { AllRecordViews.Add(r); if (RecordViewAdded != null) { RecordViewAdded(r); } }; Children.Add(newGroup); AllSubgroups.Add(newGroup); newGroup.ReadBinary(reader, source); } else { RecordView newView = new RecordView(reader, source); ChildRecordViews.Add(newView); AllRecordViews.Add(newView); if (RecordViewAdded != null) { RecordViewAdded(newView); } } } }