private void RaiseSubRecordAddedEvent(Guid parentID, SubRecord subRecord) { if (SubRecordAdded != null) { SubRecordAdded(this, new SubRecordEventArgs(parentID, subRecord)); } }
public bool Evaluate(Record r, SubRecord sr, Element se) { if (se == null) { return(false); } var value = sr.GetCompareValue(se); int diff = ValueComparer.Compare(value, this.Value); switch (this.Type) { case BatchCondElementType.Set: break; case BatchCondElementType.Add: break; case BatchCondElementType.Subtract: break; case BatchCondElementType.Multiply: break; case BatchCondElementType.Divide: break; case BatchCondElementType.Clear: break; default: throw new ArgumentOutOfRangeException(); } return(false); }
internal static int GetByteLength(SubRecord subRecord, bool nullTerminated = false) { var s = ((StringSubRecord)subRecord).Data; var len = GlobalConfig.TextEncoding.GetByteCount(s); return(nullTerminated && !s.EndsWith("\0") ? len + 1 : len); }
private void toolStripMoveRecordUp_Click(object sender, EventArgs e) { if (listSubrecord.SelectedIndices.Count < 1) { return; } int idx = listSubrecord.SelectedIndices[0]; if (idx < 1 || idx >= (listSubrecord.Items.Count)) { return; } var rec = Selection.Record as Record; if (rec != null) { SubRecord sr = subrecords[idx]; SelectIndex(idx - 1); subrecords.RemoveAt(idx); subrecords.Insert(idx - 1, sr); Selection.SubRecord = GetSelectedSubrecord(); rec.MatchRecordStructureToRecord(SubRecords.ToArray()); FireDataChanged(); } }
private void FireSubrecordChanged(SubRecord sr) { if (OnSubrecordChanged != null) { OnSubrecordChanged(this, new RecordChangeEventArgs(sr)); } }
private void listView1_DragDrop(object sender, DragEventArgs e) { int toswap = (int)e.Data.GetData(typeof(int)) - 1; if (toswap == -1) { return; } var rec = Selection.Record as Record; SubRecord sr = subrecords[toswap]; if (listSubrecord.SelectedIndices.Count == 0) { subrecords.RemoveAt(toswap); subrecords.Add(sr); } else if (listSubrecord.SelectedIndices.Count >= 1) { int moveto = listSubrecord.SelectedIndices[0]; if (toswap == moveto) { return; } subrecords.RemoveAt(toswap); subrecords.Insert(moveto, sr); } else { return; } RebuildSelection(); return; }
public override bool Evaluate(Record r, SubRecord sr) { if (this.Type == BatchCondRecordType.Create) { if (sr == null) { // guess the best insert location int idx = -1; RecordStructure rs; if ( RecordStructure.Records.TryGetValue(r.Name, out rs) ) { for ( int i = Array.FindIndex(rs.subrecords, structure => structure.name == this.Record.name) - 1; i >= 0; --i) { var srsname = rs.subrecords[i].name; idx = r.SubRecords.IndexOf(r.SubRecords.FirstOrDefault(x => x.Name == srsname)); } } sr = new SubRecord(this.Record); if (idx < 0) r.SubRecords.Add(sr); else r.SubRecords.Insert(idx+1, sr); } } else if (this.Type == BatchCondRecordType.Delete) { while (sr != null) { r.SubRecords.Remove(sr); sr = r.SubRecords.FirstOrDefault(x => x.Name == this.Record.name); } } return true; }
public void Test_45778() { byte[] data = HexRead.ReadFromString( "15, 00, 12, 00, 14, 00, 01, 00, 01, 00, " + "01, 21, 00, 00, 3C, 13, F4, 03, 00, 00, " + "00, 00, 0C, 00, 14, 00, 00, 00, 00, 00, " + "00, 00, 00, 00, 00, 00, 01, 00, 08, 00, 00, " + "00, 10, 00, 00, 00, " + "13, 00, EE, 1F, " + "00, 00, " + "08, 00, " + //number of items "08, 00, " + //selected item "01, 03, " + //flags "00, 00, " + //objId //LbsDropData "0A, 00, " + //flags "14, 00, " + //the number of lines to be displayed in the dropdown "6C, 00, " + //the smallest width in pixels allowed for the dropdown window "00, 00, " + //num chars "00, 00"); RecordInputStream in1 = TestcaseRecordInputStream.Create(ObjRecord.sid, data); // check read OK ObjRecord record = new ObjRecord(in1); SubRecord sr = record.SubRecords[(2)]; Assert.IsTrue(sr is LbsDataSubRecord); LbsDataSubRecord lbs = (LbsDataSubRecord)sr; Assert.AreEqual(8, lbs.NumberOfItems); Assert.IsNull(lbs.Formula); // check that it re-Serializes to the same data byte[] ser = record.Serialize(); TestcaseRecordInputStream.ConfirmRecordEncoding(ObjRecord.sid, data, ser); }
public bool AddMaster(string masterName) { Record brcTES4 = Records.OfType<Record>().FirstOrDefault(x => x.Name == "TES4"); if (brcTES4 == null) throw new ApplicationException("Plugin lacks a valid TES4 record. Cannot continue."); // find existing if already present foreach (var mast in brcTES4.SubRecords.Where(x => x.Name == "MAST")) { var path = mast.GetStrData(); if (string.Compare(path, masterName, true) == 0) return false; } int idx = brcTES4.SubRecords.IndexOf(brcTES4.SubRecords.FirstOrDefault(x => x.Name == "INTV")); if (idx < 0) idx = brcTES4.SubRecords.Count; var sbrMaster = new SubRecord(); sbrMaster = new SubRecord(); sbrMaster.Name = "DATA"; sbrMaster.SetData(new byte[] {0, 0, 0, 0, 0, 0, 0, 0}); brcTES4.InsertRecord(idx, sbrMaster); sbrMaster = new SubRecord(); sbrMaster.Name = "MAST"; Int32 intCount = Encoding.CP1252.GetByteCount(masterName); var bteData = new byte[intCount + 1]; Array.Copy(Encoding.CP1252.GetBytes(masterName), bteData, intCount); sbrMaster.SetData(bteData); brcTES4.InsertRecord(idx, sbrMaster); // Fix Masters // Update IDs for current record to be +1 return true; }
public override void VisitGedcomx(Gedcomx gx) { if (IsCensusRecord(gx)) { _parsingCensus = true; } _currentRecord = new SubRecord(); _subrecords = new List <SubRecord>(); base.VisitGedcomx(gx); if (_subrecords.Count > 0) { int max = _subrecords.Max(x => x.GetLevel()); // Only export "full" rows, since the subrecord chaining has some incomplete records (e.g., the parent records) foreach (SubRecord subrecord in _subrecords.Where(x => x.GetLevel() == max)) { _rows.Add(subrecord.ToRow()); } } else { //no subrecords; just add the record fields. _rows.Add(_currentRecord.ToRow()); } _parsingCensus = false; _currentRecord = null; _subrecords = null; }
public void Test_47701() { byte[] data = HexRead.ReadFromString( "15, 00, 12, 00, 12, 00, 02, 00, 11, 20, " + "00, 00, 00, 00, 80, 3D, 03, 05, 00, 00, " + "00, 00, 0C, 00, 14, 00, 00, 00, 00, 00, " + "00, 00, 00, 00, 00, 00, 01, 00, 0A, 00, " + "00, 00, 10, 00, 01, 00, 13, 00, EE, 1F, " + "10, 00, 09, 00, 40, 9F, 74, 01, 25, 09, " + "00, 0C, 00, 07, 00, 07, 00, 07, 04, 00, " + "00, 00, 08, 00, 00, 00"); RecordInputStream in1 = TestcaseRecordInputStream.Create(ObjRecord.sid, data); // check read OK ObjRecord record = new ObjRecord(in1); Assert.AreEqual(3, record.SubRecords.Count); SubRecord sr = record.SubRecords[(2)]; Assert.IsTrue(sr is LbsDataSubRecord); LbsDataSubRecord lbs = (LbsDataSubRecord)sr; Assert.AreEqual(4, lbs.NumberOfItems); Assert.IsTrue(lbs.Formula is AreaPtg); AreaPtg ptg = (AreaPtg)lbs.Formula; CellRangeAddress range = new CellRangeAddress( ptg.FirstRow, ptg.LastRow, ptg.FirstColumn, ptg.LastColumn); Assert.AreEqual("H10:H13", range.FormatAsString()); // check that it re-Serializes to the same data byte[] ser = record.Serialize(); TestcaseRecordInputStream.ConfirmRecordEncoding(ObjRecord.sid, data, ser); }
public static string GetFormattedData(this SubRecord rec) { var sb = new StringBuilder(); rec.GetFormattedData(sb); return(sb.ToString()); }
/// <summary> /// /// </summary> /// <param name="sr"></param> /// <param name="rawData">Retain raw data instead of converting to more usuable form</param> /// <returns></returns> internal IEnumerable <Element> EnumerateElements(SubRecord sr, bool rawData) { if (sr == null) { return(new Element[0]); } return(sr.EnumerateElements(rawData)); }
internal IEnumerable <Element> EnumerateElements(SubRecord sr, Dictionary <int, Conditional> conditions) { if (sr == null) { return(new Element[0]); } return(sr.EnumerateElements(conditions)); }
/// <summary> /// Clear any state /// </summary> public void ClearControl() { r = null; sr = null; ss = null; controlMap.Clear(); fpanel1.Controls.Clear(); Enabled = false; }
/// <summary> /// Clear any state. /// </summary> public void ClearControl() { this.r = null; this.sr = null; this.ss = null; this.controlMap.Clear(); this.fpanel1.Controls.Clear(); Enabled = false; }
private void linkLabelSubRecordOpenFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { SubRecord subRecord = (SubRecord)((LinkLabel)sender).Tag; Process.Start(new ProcessStartInfo() { FileName = subRecord.Folder, Verb = "open" }); }
public MediumLevelRecordEditor(SubRecord sr, SubrecordStructure ss, dFormIDLookupS formIDLookup, dFormIDScan formIDScan, dLStringLookup strIDLookup) { InitializeComponent(); Icon = Resources.tesv_ico; SuspendLayout(); this.sr = sr; this.ss = ss; this.formIDLookup = formIDLookup; this.formIDScan = formIDScan; this.strIDLookup = strIDLookup; int offset = 0; byte[] data = sr.GetReadonlyData(); boxes = new List <TextBox>(ss.elements.Length); valueTypes = new List <ElementValueType>(ss.elements.Length); elements = new List <Panel>(); int groupOffset = 0; int CurrentGroup = 0; try { for (int i = 0; i < ss.elements.Length; i++) { if (ss.elements[i].optional && offset == data.Length) { AddElement(ss.elements[i]); } else { AddElement(ss.elements[i], ref offset, data, ref groupOffset, ref CurrentGroup); if (ss.elements[i].repeat > 0) { repeatcount++; if (offset < data.Length) { i--; } } } } if (ss.elements[ss.elements.Length - 1].repeat > 0 && repeatcount > 0) { AddElement(ss.elements[ss.elements.Length - 1]); } } catch { MessageBox.Show("The subrecord doesn't appear to conform to the expected structure.\n" + "Saving is disabled, and the formatted information may be incorrect", "Warning"); bSave.Enabled = false; } ResumeLayout(); }
private void AddSubRecord(Guid parentID, SubRecord subRecord) { if (_fileRecorder != null) { _fileRecorder.AddSubRecord(parentID, subRecord); } else { throw new SystemException("Recording not setup correctly."); } }
private bool ExtractRARContent(string rarFilePath, RootPath rootPath, Record record) { bool success = true; SubRecord subRecord = null; _lastRARVolume = string.Empty; Unrar unrar = new Unrar(rarFilePath) { DestinationPath = (EngineSettings.UseSpecificOutputFolder ? Path.Combine(EngineSettings.OutputFolder, FileHandler.GetDeltaPath(Path.GetDirectoryName(rarFilePath), rootPath.Path)) : Path.GetDirectoryName(rarFilePath)) }; unrar.ExtractionProgress += unrar_ExtractionProgress; unrar.MissingVolume += unrar_MissingVolume; unrar.NewVolume += unrar_NewVolume; unrar.PasswordRequired += unrar_PasswordRequired; try { unrar.Open(Unrar.OpenMode.Extract); while (success && unrar.ReadHeader()) { WriteLogEntry("Extracting file, name=" + unrar.CurrentFile.FileName + ", size=" + unrar.CurrentFile.UnpackedSize + ", path=" + unrar.DestinationPath); subRecord = new SubRecord(unrar.DestinationPath, unrar.CurrentFile.FileName, unrar.CurrentFile.UnpackedSize); AddSubRecord(record.ID, subRecord); unrar.Extract(); success = ValidateExtractedFile(Path.Combine(unrar.DestinationPath, unrar.CurrentFile.FileName), unrar.CurrentFile.UnpackedSize, GetRARFileCRC(_lastRARVolume, unrar.CurrentFile.FileName)); if (!success) { WriteLogEntry(LogType.Warning, "Validation FAILED, aborting extraction"); } AddSubRecord(record.ID, (success ? subRecord.Succeed() : subRecord.Fail())); } } catch (Exception ex) { WriteLogEntry("An exception occurred while extracting from RAR file, path=" + rarFilePath + ", destination=" + unrar.DestinationPath, ex); if (subRecord != null) { AddSubRecord(record.ID, subRecord.Fail()); } success = false; } finally { unrar.Close(); unrar.ExtractionProgress -= unrar_ExtractionProgress; unrar.MissingVolume -= unrar_MissingVolume; unrar.NewVolume -= unrar_NewVolume; unrar.PasswordRequired -= unrar_PasswordRequired; } return(success); }
internal Record(string name, uint Size, BinaryReader br, bool Oblivion) { bool compressedRecord = false; SubRecords = new AdvancedList <SubRecord>(1); SubRecords.AllowSorting = false; Name = name; Flags1 = br.ReadUInt32(); FormID = br.ReadUInt32(); Flags2 = br.ReadUInt32(); if (!Oblivion) { Flags3 = br.ReadUInt32(); } if ((Flags1 & 0x00040000) > 0) { //Flags1 ^= 0x00040000; uint newSize = br.ReadUInt32(); br = Decompressor.Decompress(br, (int)(Size - 4), (int)newSize); Size = newSize; compressedRecord = true; } uint AmountRead = 0; while (AmountRead < Size) { string s = ReadRecName(br); uint i = 0; if (s == "XXXX") { ushort xsize = br.ReadUInt16(); if (xsize != 4) { throw new TESParserException( String.Format("Unexpected Subrecord block XXXX size! Expected 4 but found {0:D}!", xsize)); } i = br.ReadUInt32(); s = ReadRecName(br); } var r = new SubRecord(this, s, br, i); AmountRead += (uint)(r.Size2); SubRecords.Add(r); } descNameOverride = DefaultDescriptiveName; UpdateShortDescription(); //br.BaseStream.Position+=Size; if (AmountRead != Size) { System.Windows.Forms.Application.Exit(); // throw new TESParserException( // String.Format("Subrecord block did not match the size specified in the record header. Name={3} Header size={0:D} Subrecord Size={1:D} CompressedRecord={2:G}", Size, AmountRead, compressedRecord, name)); } }
public MediumLevelRecordEditor(SubRecord sr, SubrecordStructure ss, dFormIDLookupS formIDLookup, dFormIDScan formIDScan, dLStringLookup strIDLookup) { this.InitializeComponent(); Icon = Resources.tesv_ico; SuspendLayout(); this.sr = sr; this.ss = ss; this.formIDLookup = formIDLookup; this.formIDScan = formIDScan; this.strIDLookup = strIDLookup; int offset = 0; byte[] data = sr.GetReadonlyData(); this.boxes = new List<TextBox>(ss.elements.Length); this.valueTypes = new List<ElementValueType>(ss.elements.Length); this.elements = new List<Panel>(); int groupOffset = 0; int CurrentGroup = 0; try { for (int i = 0; i < ss.elements.Length; i++) { if (ss.elements[i].optional > 0 && offset == data.Length) { this.AddElement(ss.elements[i]); } else { this.AddElement(ss.elements[i], ref offset, data, ref groupOffset, ref CurrentGroup); if (ss.elements[i].repeat > 0) { this.repeatcount++; if (offset < data.Length) { i--; } } } } if (ss.elements[ss.elements.Length - 1].repeat > 0 && this.repeatcount > 0) { this.AddElement(ss.elements[ss.elements.Length - 1]); } } catch { MessageBox.Show("The subrecord doesn't appear to conform to the expected structure.\n" + "Saving is disabled, and the formatted information may be incorrect", "Warning"); this.bSave.Enabled = false; } ResumeLayout(); }
private void CreateSubRecordVisit(Action action) { SubRecord recordFieldValues = _currentRecord; _currentRecord = new SubRecord(new Dictionary <string, string>(), recordFieldValues); action(); //add the person as a subrecord... _subrecords.Add(new SubRecord(_currentRecord.Data.ToDictionary(x => x.Key, x => x.Value), recordFieldValues)); //...and put the record back. _currentRecord = recordFieldValues; }
public override bool Evaluate(Record r, SubRecord sr) { bool any = false; foreach (bool value in sr.EnumerateElements().Where(x => x.Structure.name == this.Record.name).Select(x => Evaluate(r, sr, x))) { if (!value) { return(false); } any = true; } return(any); }
private void ShowRecordDetails(object obj) { if (obj is Record) { Record record = (Record)obj; RecordStatus subRecordStatus = record.SubRecordStatus; bool success = (record.Status == RecordStatus.Success && subRecordStatus == RecordStatus.Success); bool failure = (record.Status == RecordStatus.Failure || subRecordStatus == RecordStatus.Failure); groupBoxRecordDetails.Visible = true; groupBoxSubRecordDetails.Visible = false; textBoxRecordPath.Text = record.Folder; textBoxRecordSFVFile.Text = record.SFVName; textBoxRecordRARFile.Text = record.RARName; labelRecordRARPartsValue.Text = record.RARCount.ToString(); labelRecordRARSizeValue.Text = MakeFileSize(record.RARSize); labelRecordTimeValue.Text = record.Time.ToString("yyyy-MM-dd HH:mm:ss"); linkLabelRecordStatus.Text = MakeStatus(success ? RecordStatus.Success : (failure ? RecordStatus.Failure : RecordStatus.InProgress)) + (subRecordStatus == RecordStatus.Failure ? " (sub record failed)" : string.Empty); linkLabelRecordStatus.LinkArea = new LinkArea(0, record.Status == RecordStatus.Failure ? linkLabelRecordStatus.Text.Length : 0); linkLabelRecordStatus.Tag = record.Time; pictureBoxRecord.Image = (failure ? _recordRed : _record); linkLabelRecordOpenFolder.Tag = record; toolTip.SetToolTip(linkLabelRecordOpenFolder, record.Folder); } else if (obj is SubRecord) { SubRecord subRecord = (SubRecord)obj; groupBoxRecordDetails.Visible = false; groupBoxSubRecordDetails.Visible = true; textBoxSubRecordPath.Text = subRecord.Folder; textBoxSubRecordFile.Text = subRecord.Name; labelSubRecordFileSizeValue.Text = MakeFileSize(subRecord.Size); labelSubRecordTimeValue.Text = subRecord.Time.ToString("yyyy-MM-dd HH:mm:ss"); linkLabelSubRecordStatus.Text = MakeStatus(subRecord.Status); linkLabelSubRecordStatus.LinkArea = new LinkArea(0, subRecord.Status == RecordStatus.Failure ? linkLabelSubRecordStatus.Text.Length : 0); linkLabelSubRecordStatus.Tag = subRecord.Time; pictureBoxSubRecord.Image = (subRecord.Status == RecordStatus.Failure ? _subRecordRed : _subRecord); linkLabelSubRecordOpenFile.Tag = subRecord; linkLabelSubRecordOpenFolder.Tag = subRecord; toolTip.SetToolTip(linkLabelSubRecordOpenFolder, subRecord.Folder); } else { groupBoxRecordDetails.Visible = false; groupBoxSubRecordDetails.Visible = false; } }
private void toolStripInsertRecord_Click(object sender, EventArgs e) { if (!this.ValidateMakeChange()) { return; } var tsMenuItem = sender as ToolStripMenuItem; try { var br = this.Selection.Record; var srs = tsMenuItem != null ? tsMenuItem.Tag as SubrecordStructure : null; if (br is Record) { if (this.listSubrecord.SelectedIndices.Count == 1) { int idx = this.listSubrecord.SelectedIndices[0]; if (idx < 0 || idx >= (this.listSubrecord.Items.Count - 1)) { var p = new SubRecord(srs); br.AddRecord(p); } else { var r = (Record)br; var p = new SubRecord(srs); r.InsertRecord(idx, p); } } else { var p = new SubRecord(srs); br.AddRecord(p); } } this.FireDataChanged(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
protected override void ExtractSubRecords(BetterReader reader, GameID gameID, uint size) { var bytes = reader.ReadBytes((int)size); var name = string.Empty; using (var stream = new BetterMemoryReader(bytes)) { var end = stream.Length; while (stream.Position < end) { name = stream.ReadString(4); switch (name) { case "EDID": EDID = new STRSubRecord(); EDID.Deserialize(stream, name); break; case "DATA": switch (EDID.Value[0]) { case 's': DATA = new STRSubRecord(); ((STRSubRecord)DATA).Deserialize(stream, name); break; case 'f': DATA = new FloatSubRecord(); ((FloatSubRecord)DATA).Deserialize(stream, name); break; default: DATA = new UInt32SubRecord(); ((UInt32SubRecord)DATA).Deserialize(stream, name); break; } break; } } } }
internal Record(string name, uint Size, BinaryReader br, bool Oblivion) { SubRecords = new AdvancedList <SubRecord>(1); SubRecords.AllowSorting = false; Name = name; Flags1 = br.ReadUInt32(); FormID = br.ReadUInt32(); Flags2 = br.ReadUInt32(); if (!Oblivion) { Flags3 = br.ReadUInt32(); } if ((Flags1 & 0x00040000) > 0) { //Flags1 ^= 0x00040000; uint newSize = br.ReadUInt32(); br = Decompressor.Decompress(br, (int)(Size - 4), (int)newSize); Size = newSize; } uint AmountRead = 0; while (AmountRead < Size) { string s = ReadRecName(br); uint i = 0; if (s == "XXXX") { br.ReadUInt16(); i = br.ReadUInt32(); s = ReadRecName(br); } var r = new SubRecord(this, s, br, i); AmountRead += (uint)(r.Size2); SubRecords.Add(r); } if (AmountRead > Size) { throw new TESParserException("Subrecord block did not match the size specified in the record header"); } descNameOverride = DefaultDescriptiveName; UpdateShortDescription(); //br.BaseStream.Position+=Size; }
private void AddSubRecord(Guid parentID, SubRecord subRecord, bool update) { TreeNode parentNode = treeViewRecords.Nodes.Find(parentID.ToString(), false).FirstOrDefault(); if (parentNode != null) { TreeNode node = parentNode.Nodes.Find(subRecord.Name, false).FirstOrDefault(); int imageIndex = (subRecord.Status == RecordStatus.Failure ? 3 : 2); if (node == null) { node = parentNode.Nodes.Add(subRecord.Name, subRecord.Name, imageIndex, imageIndex); } else if (update) { node.Text = subRecord.Name; node.ImageIndex = node.SelectedImageIndex = imageIndex; if (node.IsSelected) { ShowRecordDetails(subRecord); } } node.Tag = subRecord; Record parentRecord = (Record)parentNode.Tag; SubRecord existingSubRecord = parentRecord.SubRecords.FirstOrDefault(sr => (sr.Name == subRecord.Name)); if (existingSubRecord == null) { parentRecord.SubRecords.Add(subRecord); } else { existingSubRecord.CopyFrom(subRecord); } AddRecord(parentRecord, true); } }
public void AddSubRecord(Guid parentID, SubRecord subRecord) { try { Record parentRecord = RecordList.Single(record => record.ID == parentID); SubRecord existingSubRecord = parentRecord.SubRecords.SingleOrDefault(sr => (sr == subRecord)); if (existingSubRecord == null) { parentRecord.SubRecords.Add(subRecord); } else { existingSubRecord.CopyFrom(subRecord); } FileHandler.Serialize(RecordListPathName, RecordList); RaiseSubRecordAddedEvent(parentID, subRecord); } catch (Exception ex) { RaiseLogEntryEvent("Failed to add sub record to its parent, parentid=" + parentID, ex); } }
public override bool Evaluate(Record r, SubRecord sr) { if (this.Type == BatchCondRecordType.Create) { if (sr == null) { // guess the best insert location int idx = -1; RecordStructure rs; if (RecordStructure.Records.TryGetValue(r.Name, out rs)) { for (int i = Array.FindIndex(rs.subrecords, structure => structure.name == this.Record.name) - 1; i >= 0; --i) { var srsname = rs.subrecords[i].name; idx = r.SubRecords.IndexOf(r.SubRecords.FirstOrDefault(x => x.Name == srsname)); } } sr = new SubRecord(this.Record); if (idx < 0) { r.SubRecords.Add(sr); } else { r.SubRecords.Insert(idx + 1, sr); } } } else if (this.Type == BatchCondRecordType.Delete) { while (sr != null) { r.SubRecords.Remove(sr); sr = r.SubRecords.FirstOrDefault(x => x.Name == this.Record.name); } } return(true); }
/// <summary> /// Compiles the result script. /// </summary> public static void CompileResultScript(SubRecord sr, out Record r2, out string msg) { Record r; try { ((FalloutCSharpScriptFunctionProxy)Functions).CompileResultScript(sr, out r, out msg); } catch (Exception e) { LastError = e.Message; r = null; msg = null; } if (r != null) { r2 = (Record)r.Clone(); } else { r2 = null; } }
public NewMediumLevelRecordEditor(Plugin p, Record r, SubRecord sr, SubrecordStructure ss) { this.InitializeComponent(); Icon = Resources.fosnip; SuspendLayout(); this.sr = sr; this.ss = ss; this.p = p; this.r = r; // walk each element in standard fashion int panelOffset = 0; try { this.fpanel1.ColumnStyles[0] = new ColumnStyle(SizeType.Percent, 100.0f); int maxWidth = this.fpanel1.Width - SystemInformation.VerticalScrollBarWidth - 8; int leftOffset = 0; // 8; foreach (var elem in ss.elements) { Control c = null; if (elem.options != null && elem.options.Length > 1) { c = new OptionsElement(); } else if (elem.flags != null && elem.flags.Length > 1) { c = new FlagsElement(); } else { switch (elem.type) { case ElementValueType.LString: c = new LStringElement(); break; case ElementValueType.FormID: c = new FormIDElement(); break; case ElementValueType.Blob: c = new HexElement(); break; default: c = new TextElement(); break; } } if (c is IElementControl) { var ec = c as IElementControl; ec.formIDLookup = p.GetRecordByID; ec.formIDScan = p.EnumerateRecords; ec.strIDLookup = p.LookupFormStrings; ec.Element = elem; if (elem.repeat > 0) { var ge = new RepeatingElement(); c = ge; c.Left = leftOffset; c.Width = maxWidth; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; ge.InnerControl = ec; ge.Element = elem; ec = ge; } else if (elem.optional > 0) { var re = new OptionalElement(); c = re; c.Left = leftOffset; c.Width = maxWidth; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; re.InnerControl = ec; re.Element = elem; ec = re; c = re; } else { c.Left = leftOffset; c.Width = maxWidth; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; } this.controlMap.Add(elem, ec); int idx = this.fpanel1.RowCount - 1; this.fpanel1.Controls.Add(c, 0, idx); var info = new RowStyle(SizeType.Absolute, c.Size.Height+2); if (idx == 0) this.fpanel1.RowStyles[0] = info; else this.fpanel1.RowStyles.Add(info); panelOffset = 0; ++this.fpanel1.RowCount; } } foreach (Element elem in r.EnumerateElements(sr, true)) { var es = elem.Structure; IElementControl c; if (this.controlMap.TryGetValue(es, out c)) { if (c is IGroupedElementControl) { var gc = c as IGroupedElementControl; gc.Elements.Add(elem.Data); } else { c.Data = elem.Data; } } } } catch { this.strWarnOnSave = "The subrecord doesn't appear to conform to the expected structure.\nThe formatted information may be incorrect."; this.Error.SetError(this.bSave, this.strWarnOnSave); this.Error.SetIconAlignment(this.bSave, ErrorIconAlignment.MiddleLeft); AcceptButton = this.bCancel; // remove save as default button when exception occurs CancelButton = this.bCancel; UpdateDefaultButton(); } ResumeLayout(); }
public abstract bool Match(Record r, SubRecord sr);
public void Process(FalloutSnip.Data.Subrecord sr, SubRecord subrec) { FalloutSnip.Data.SubrecordElement expectedElement = (sr.Elements.Count >= 1) ? sr.Elements[0] : null; if (expectedElement != null && expectedElement.type == "blob") return; byte[] data = subrec.GetReadonlyData(); if (data.Length == 0) { if (sr.Elements.Count == 0) sr.Elements.Add(CreateBlob()); return; } if (data.Length == 2) { // common scenarios if (expectedElement != null && expectedElement.size == 2) return; FalloutSnip.Data.SubrecordElement elem = new FalloutSnip.Data.SubrecordElement(); elem.name = "Unknown"; elem.type = "short"; elem.size = 2; sr.Elements.Add(elem); UpdateSize(sr); return; } if (data.Length > 0) { bool isAscii = true; for (int i = 0; i < data.Length - 1 && isAscii; ++i) isAscii = !Char.IsControl((char)data[i]); isAscii = (isAscii && data[data.Length - 1] == 0); if (isAscii) { // test if its a string if (expectedElement == null) { FalloutSnip.Data.SubrecordElement elem = new FalloutSnip.Data.SubrecordElement(); elem.name = "Unknown"; elem.type = "string"; sr.Elements.Add(elem); } else if (expectedElement.type != "string") { sr.Elements.Clear(); sr.Elements.Add(CreateBlob()); } return; } } for (int offset = 0, elemSize = 4; offset < data.Length; offset += elemSize) { if (IsCanceled) return; int left = data.Length - offset; if (left >= 4) { // common scenarios if (expectedElement != null && expectedElement.size == 4) continue; ushort lhs = TypeConverter.h2s(data[offset], data[offset + 1]); ushort uhs = TypeConverter.h2s(data[offset + 2], data[offset + 3]); uint ui4 = TypeConverter.h2i(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]); if (ui4 == 0) { if (expectedElement == null) { FalloutSnip.Data.SubrecordElement elem = new FalloutSnip.Data.SubrecordElement(); elem.name = "Unknown"; elem.type = "int"; elem.size = 4; sr.Elements.Add(elem); UpdateSize(sr); continue; } } else { float flt = TypeConverter.h2f(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]); if (IsLikelyFloat(flt)) { // replace element which is int with float if (expectedElement == null) { FalloutSnip.Data.SubrecordElement elem = new FalloutSnip.Data.SubrecordElement(); elem.name = "Unknown"; elem.type = "float"; elem.size = 4; sr.Elements.Add(elem); } else { if (expectedElement.type == "int") expectedElement.type = "float"; } continue; } else { Record r = this.FormLookup(ui4); if (r != null) { string reftype = r.DescriptiveName.Substring(0, 4); // ??? if (expectedElement == null) { FalloutSnip.Data.SubrecordElement elem = new FalloutSnip.Data.SubrecordElement(); elem.name = "ID"; elem.type = "formid"; elem.reftype = reftype; elem.size = 4; sr.Elements.Add(elem); } else { if (expectedElement.type == "formid") { if (expectedElement.reftype != reftype) expectedElement.reftype = string.Empty; } } continue; } else { string s = this.StringLookup(ui4); if (!string.IsNullOrEmpty(s)) { if (expectedElement == null) { FalloutSnip.Data.SubrecordElement elem = new FalloutSnip.Data.SubrecordElement(); elem.name = "Unknown"; elem.type = "string"; sr.Elements.Add(elem); } continue; } } if (expectedElement == null) { if (lhs > 0 && lhs < 255 && uhs > 0 && uhs < 255) { FalloutSnip.Data.SubrecordElement elem = new FalloutSnip.Data.SubrecordElement(); elem.name = "Unknown"; elem.type = "short"; elem.size = 2; sr.Elements.Add(elem); sr.Elements.Add(elem); } else { FalloutSnip.Data.SubrecordElement elem = new FalloutSnip.Data.SubrecordElement(); elem.name = "Unknown"; elem.type = "int"; elem.size = 4; sr.Elements.Add(elem); UpdateSize(sr); } } } } } } if (sr.Elements.Count == 0) { sr.Elements.Add(CreateBlob()); } UpdateSize(sr); }
public override bool Match(Record r, SubRecord sr) { return this.Type == SearchCondRecordType.Exists ^ sr == null; }
public abstract bool Match(Record r, SubRecord sr, Element se);
public bool MatchRecordStructureToRecord(SubRecord[] subs) { try { if (RecordStructure.Records == null) { return false; } RecordStructure rs; if (!RecordStructure.Records.TryGetValue(Name, out rs)) { return false; } var subrecords = new List<SubrecordStructure>(); var sss = rs.subrecordTree; foreach (var sub in subs) { sub.DetachStructure(); } var conditions = new Dictionary<int, Conditional>(); var context = new LoopContext(0, sss); var result = this.InnerLoop(subs, conditions, context); if (result == LoopContext.LoopEvalResult.Success && context.idx == subs.Length) { return true; } } catch { } return false; }
public override bool Match(Record r, SubRecord sr, Element se) { return false; }
public bool Evaluate(Record r, SubRecord sr, Element se) { if (se == null) return false; var value = sr.GetCompareValue(se); int diff = ValueComparer.Compare(value, this.Value); switch (this.Type) { case BatchCondElementType.Set: break; case BatchCondElementType.Add: break; case BatchCondElementType.Subtract: break; case BatchCondElementType.Multiply: break; case BatchCondElementType.Divide: break; case BatchCondElementType.Clear: break; default: throw new ArgumentOutOfRangeException(); } return false; }
public static bool Compile(Record r2, out string msg) { msg=null; r=new Record(); string script=null; int scptype=0; foreach(SubRecord sr2 in r2.SubRecords) { if(sr2.Name=="SCTX") script=sr2.GetStrData(); if(sr2.Name=="SCHR") { byte[] tmp=sr2.GetReadonlyData(); scptype=TypeConverter.h2si(tmp[16], tmp[17], tmp[18], tmp[19]); } } if(script==null) { msg="Script had no SCTX record to compile"; return false; } locals.Clear(); localList.Clear(); edidRefs.Clear(); refcount=0; errors.Clear(); ts=new TokenStream(script, errors); if(errors.Count>0) return OutputErrors( out msg); Token[] smt=ts.PopNextStatement(); if(smt.Length!=2||!smt[0].IsKeyword(Keywords.ScriptName)||smt[1].token==null) return ReturnError("Expected 'ScriptName <edid>'", out msg); SubRecord sr=new SubRecord(); sr.Name="EDID"; sr.SetStrData(smt[1].utoken, true); r.AddRecord(sr); r.descriptiveName=" ("+smt[1].token+")"; schr=new SubRecord(); schr.Name="SCHR"; r.AddRecord(schr); scda=new SubRecord(); scda.Name="SCDA"; r.AddRecord(scda); sr=new SubRecord(); sr.Name="SCTX"; sr.SetStrData(script, false); r.AddRecord(sr); bw=new BinaryWriter(new MemoryStream()); Emit(0x001d); Emit(0x0000); try { HandleVariables(); } catch(Exception ex) { return ReturnError(ex.Message, out msg); } for(int i=0;i<localList.Count;i++) { if(localList[i].type==VarType.Ref) { sr=new SubRecord(); sr.Name="SCRV"; sr.SetData(TypeConverter.si2h(i+1)); r.AddRecord(sr); refcount++; localList[i].refid=refcount; } } while(ts.PeekNextStatement().Length>0) { try { HandleBlock(); } catch(Exception ex) { return ReturnError(ex.Message, out msg); } } if(errors.Count>0) { return OutputErrors(out msg); } byte[] header=new byte[20]; TypeConverter.si2h(refcount, header, 4); TypeConverter.i2h((uint)bw.BaseStream.Length, header, 8); TypeConverter.si2h(localList.Count, header, 12); TypeConverter.si2h(scptype, header, 16); schr.SetData(header); byte[] compileddata=((MemoryStream)bw.BaseStream).GetBuffer(); if(compileddata.Length!=bw.BaseStream.Length) Array.Resize<byte>(ref compileddata, (int)bw.BaseStream.Length); scda.SetData(compileddata); r2.SubRecords.Clear(); r2.SubRecords.AddRange(r.SubRecords); bw.Close(); return true; }
private static void EmitRefLabel(Token t, RefType type) { if(t.type==TokenType.Global) { EmitByte(0x47); } else { switch(type) { case RefType.Standard: Emit(0x1c); break; case RefType.Expression: EmitByte(0x72); break; case RefType.Standalone: EmitByte(0x5a); break; } } if(t.type==TokenType.Local) { LocalVar var=locals[t.token]; if(var.refid==0) AddError("Variable was not of type ref"); else Emit((ushort)var.refid); } else if(t.type==TokenType.edid||t.type==TokenType.Global) { if(!edidRefs.ContainsKey(t.token)) { SubRecord sr=new SubRecord(); sr.Name="SCRO"; if(t.type==TokenType.edid) sr.SetData(TypeConverter.i2h(edidList[t.token].Key)); else sr.SetData(TypeConverter.i2h(globals[t.token])); r.AddRecord(sr); refcount++; edidRefs[t.token]=(ushort)refcount; } Emit(edidRefs[t.token]); } else { AddError("Expected ref variable or edid"); } }
public SubRecord(Dictionary<string, string> record, SubRecord parent) : this(record) { Parent = parent; }
private void CreateSubRecordVisit(Action action) { SubRecord recordFieldValues = _currentRecord; _currentRecord = new SubRecord(new Dictionary<string, string>(), recordFieldValues); action(); //add the person as a subrecord... _subrecords.Add(new SubRecord(_currentRecord.Data.ToDictionary(x => x.Key, x => x.Value), recordFieldValues)); //...and put the record back. _currentRecord = recordFieldValues; }
public override void VisitGedcomx(Gedcomx gx) { if (IsCensusRecord(gx)) { _parsingCensus = true; } _currentRecord = new SubRecord(); _subrecords = new List<SubRecord>(); base.VisitGedcomx(gx); if (_subrecords.Count > 0) { int max = _subrecords.Max(x => x.GetLevel()); // Only export "full" rows, since the subrecord chaining has some incomplete records (e.g., the parent records) foreach (SubRecord subrecord in _subrecords.Where(x => x.GetLevel() == max)) { _rows.Add(subrecord.ToRow()); } } else { //no subrecords; just add the record fields. _rows.Add(_currentRecord.ToRow()); } _parsingCensus = false; _currentRecord = null; _subrecords = null; }
private void ProcessSubRecord(Subrecord sr, SubRecord[] srs) { long minSize = srs.Min(a => a.Size); long maxSize = srs.Max(a => a.Size); if (maxSize == 0) { // likely a group start sr.size = -1; return; } int szCount = 0; foreach (var ss in srs) { if (ss.Size == 0) { continue; } var data = ss.GetReadonlyData(); if (IsLikelyString(new ArraySegment<byte>(data, 0, (int) ss.Size))) { if (++szCount > 10) { var elem = CreateType(null, "string"); sr.Items.Add(elem); break; } } else { break; } } if (sr.Elements.Any()) { return; // found string } if (minSize == maxSize && maxSize < 256) { sr.size = (int) maxSize; int index = 0; // Walk through each element guessing the data type for (int offset = 0, elemSize = 4; offset < maxSize; offset += elemSize) { int numZero = 0; int numFloat = 0; int num2Short = 0; int isFormID = 0; int numTotal = 0; int isLString = 0; string reftype = null; if (maxSize - offset < 4) { if (maxSize >= 2) { var elem = CreateType(index++, "short"); elem.size = 2; sr.Items.Add(elem); elemSize = 2; continue; } else { var elem = CreateType(index++, "byte"); elem.size = 1; sr.Items.Add(elem); elemSize = 1; continue; } } foreach (var ss in srs) { // .Random(srs.Length < 10 ? 0 : srs.Length / 10) ++numTotal; var data = ss.GetReadonlyData(); uint ui4 = TypeConverter.h2i(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]); if (ui4 == 0) { ++numZero; continue; } ushort lhs = TypeConverter.h2s(data[offset], data[offset + 1]); ushort uhs = TypeConverter.h2s(data[offset + 2], data[offset + 3]); float flt = TypeConverter.h2f(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]); if (IsLikelyFloat(flt)) { ++numFloat; } if (lhs > 0 && lhs < 255 && uhs > 0 && uhs < 255) { ++num2Short; } if (ui4 > 100) { var r = FormLookup(ui4); if (r != null) { if (string.IsNullOrEmpty(reftype)) { reftype = r.Name; isFormID++; } else if (reftype == r.Name) { isFormID++; } } if (!string.IsNullOrEmpty(StringLookup(ui4))) { ++isLString; } } } if (numTotal > 0) { float floatPct = (numFloat + numZero)/(float) numTotal; float shortPct = (num2Short + numZero)/(float) numTotal; float formPct = (isFormID + numZero)/(float) numTotal; float lstrPct = (isLString + numZero)/(float) numTotal; if (numFloat > 0 && floatPct > 0.5f) { var elem = CreateType(index++, "float"); elem.size = 4; sr.Items.Add(elem); } else if (num2Short > 0 && shortPct > 0.5f) { var elem = CreateType(index++, "short"); elem.size = 2; sr.Items.Add(elem); sr.Items.Add(elem); UpdateSize(sr); } else if (isFormID > 0 && formPct > 0.5f) { var elem = CreateType(index++, "formid"); elem.reftype = reftype; elem.size = 4; sr.Items.Add(elem); } else if (isLString > 0 && lstrPct > 0.5f) { var elem = CreateType(index++, "lstring"); elem.size = 4; sr.Items.Add(elem); } else { var elem = CreateType(index++, "int"); elem.size = 4; sr.Items.Add(elem); } } } } else { // guess dynamically sized object... default to blob if (!sr.Elements.Any()) { long modSum = srs.Sum(a => a.Size%4); // useful if we suspect this is an array of integers if (modSum == 0) { int count = 0; string reftype = null; foreach (var ss in srs) { var data = ss.GetReadonlyData(); int offset = 0; uint ui4 = GetUInt32(data, offset); if (ui4 < 100) { continue; } var r = FormLookup(ui4); if (r != null) { if (string.IsNullOrEmpty(reftype)) { reftype = r.Name; } else if (reftype == r.Name) { if (++count > 10) { break; } } } else { break; } } if (count > 0) { var elem = CreateType("ID", "formid"); elem.reftype = reftype; elem.size = 4; elem.repeat = 1; elem.optional = 1; sr.Items.Add(elem); } } } // check if it is a string else make it a blob sr.size = 0; if (!sr.Elements.Any()) { sr.Items.Add(CreateBlob()); } } }
public static bool CompileResultScript(SubRecord sr, out Record r2, out string msg) { msg=null; r2=null; r=new Record(); string script=sr.GetStrData(); locals.Clear(); localList.Clear(); edidRefs.Clear(); refcount=0; errors.Clear(); ts=new TokenStream(script, errors); if(errors.Count>0) return OutputErrors(out msg); schr=new SubRecord(); schr.Name="SCHR"; r.AddRecord(schr); scda=new SubRecord(); scda.Name="SCDA"; r.AddRecord(scda); sr=(SubRecord)sr.Clone(); r.AddRecord(sr); bw=new BinaryWriter(new MemoryStream()); while(ts.PeekNextStatement().Length>0) { try { HandleResultsBlock(); } catch(Exception ex) { return ReturnError(ex.Message, out msg); } } if(errors.Count>0) { return OutputErrors(out msg); } byte[] header=new byte[20]; TypeConverter.si2h(refcount, header, 4); TypeConverter.i2h((uint)bw.BaseStream.Length, header, 8); TypeConverter.si2h(localList.Count, header, 12); TypeConverter.si2h(0x10000, header, 16); schr.SetData(header); byte[] compileddata=((MemoryStream)bw.BaseStream).GetBuffer(); if(compileddata.Length!=bw.BaseStream.Length) Array.Resize<byte>(ref compileddata, (int)bw.BaseStream.Length); scda.SetData(compileddata); bw.Close(); r2=r; return true; }
internal Record(string name, uint dataSizeParam, SnipStreamWrapper snipStreamWrapper, bool oblivion) //internal Record(string name, uint dataSize, BinaryReader recordReader, bool oblivion) { bool compressed = false; uint amountRead = 0; uint realSize = 0; //MemoryStream stream = null; //BinaryReader dataReader = null; SubRecord record = null; //long ws; try { this.dataSize = dataSizeParam; this.SubRecords = new AdvancedList<SubRecord>(1) {AllowSorting = false}; //if (snipStreamWrapper.SnipStream.Position >= 1330432) // Name = name; Name = name; RecordsTace.AddRecordToRecordsList(Name); this.Flags1 = snipStreamWrapper.ReadUInt32(); //recordReader.ReadUInt32(); this.FormID = snipStreamWrapper.ReadUInt32(); //recordReader.ReadUInt32(); this.Flags2 = snipStreamWrapper.ReadUInt32(); //recordReader.ReadUInt32(); if (!oblivion) { this.Flags3 = snipStreamWrapper.ReadUInt32(); //recordReader.ReadUInt32(); } //if (this.FormID == 496431) // Name = name; compressed = (this.Flags1 & 0x00040000) != 0; amountRead = 0; realSize = dataSizeParam; if (!compressed) realSize = dataSizeParam; if (compressed) { realSize = snipStreamWrapper.ReadUInt32(); // recordReader.ReadUInt32(); // snipStreamWrapper.JumpTo(-4,SeekOrigin.Current); //if (realSize > 0) dataSizeParam -= 4; RecordsTace.AddRecordToCompressedRecordsList(Name); } #if DEBUGCOMPRESSREALSIZE if (compressed & realSize == 0) { Clipboard.SetText(name + " - " + this.FormID.ToString(CultureInfo.InvariantCulture)); } #endif //using (var stream = new MemoryStream(recordReader.ReadBytes((int) dataSize))) //{ //using (var dataReader = compressed ? ZLib.Decompress(stream, (int) realSize) : new BinaryReader(stream)) //{. try { //if (dataSize == 0) // throw new TESParserException("Record.Record: ZLib inflate error. Output buffer is empty."); if (dataSizeParam > 0) //dawnguard.esm at position 6.812.369 at a dataSize == 0 - Record=NAVM { ZLibWrapper.CopyStreamToInputBuffer(snipStreamWrapper.SnipStream, dataSizeParam); //stream = new MemoryStream(recordReader.ReadBytes((int) dataSize)); //dataReader = compressed ? ZLib.Decompress(stream, out compressLevel, (int)realSize) : new BinaryReader(stream); if (compressed & realSize > 0) { //Clipboard.SetText(Name + realSize.ToString(CultureInfo.InvariantCulture)); ZLib.Decompress(compressLevel: out compressLevel, expectedSize: (int) realSize); //Array.Copy(); } else { ZLibWrapper.CopyInputBufferToOutputBuffer(dataSizeParam); } } else { ZLibWrapper.ResetBufferSizeAndPosition(); } } catch (Exception ex) { throw new TESParserException("Record.Record: ZLib error" + Environment.NewLine + "Message: " + ex.Message + Environment.NewLine + "StackTrace: " + ex.StackTrace); } if (compressed & dataSizeParam > 0) //dawnguard.esm at position 6.812.369 at a dataSize == 0 - Record=NAVM if (ZLibWrapper.OutputBufferLength <= 0) //if (dataReader == null) { throw new TESParserException("Record.Record: ZLib inflate error. Output buffer is empty."); } while (ZLibWrapper.OutputBufferPosition < ZLibWrapper.OutputBufferLength) //while (dataReader.BaseStream.Position < dataReader.BaseStream.Length) { var type = "XXXX"; uint size = 0; if (realSize == 0) //compressed & { type = "????"; //ReadRecName(ZLibWrapper.Read4Bytes()); size = dataSizeParam; //realSize = dataSizeParam; //this.dataSize = dataSizeParam; } else { type = ReadRecName(ZLibWrapper.Read4Bytes()); //var type = ReadRecName(dataReader); if (type == "XXXX") { ZLibWrapper.ReadUInt16(); //dataReader.ReadUInt16(); size = ZLibWrapper.ReadUInt32(); //dataReader.ReadUInt32(); type = ReadRecName(ZLibWrapper.Read4Bytes()); //ReadRecName(dataReader); ZLibWrapper.ReadUInt16(); //dataReader.ReadUInt16(); } else { size = ZLibWrapper.ReadUInt16(); //dataReader.ReadUInt16(); } } record = new SubRecord(this, type, snipStreamWrapper, size); //record = new SubRecord(this, type, dataReader, size); //var record = new SubRecord(this, type, dataReader, size); this.SubRecords.Add(record); amountRead += (uint) record.Size2; } //} //using (var dataReader = compressed ? ZLib.Decompress(stream, (int) realSize) : new BinaryReader(stream)) //if (dataReader != null) //{ // dataReader.Close(); // dataReader.Dispose(); // dataReader = null; //} if ((compressed & realSize != 0) | (!compressed)) if (amountRead > realSize) { Debug.Print( " * ERROR: SUB-RECORD {0} DATA DOESN'T MATCH THE SIZE SPECIFIED IN THE HEADER: DATA-SIZE={1} REAL-SIZE={2} AMOUNT-READ={3}", name, dataSizeParam, realSize, amountRead); throw new TESParserException( string.Format( "Subrecord block did not match the size specified in the record header: ExpectedSize={0} ReadSize={1} DataSize={2}", realSize, amountRead, dataSizeParam)); } this.descNameOverride = this.DefaultDescriptiveName; this.UpdateShortDescription(); // br.BaseStream.Position+=Size; //} //using (var stream = new MemoryStream(recordReader.ReadBytes((int) dataSize))) } catch (Exception ex) { string errMsg = "Message: " + ex.Message + Environment.NewLine + Environment.NewLine + "StackTrace: " + ex.StackTrace + Environment.NewLine + Environment.NewLine + "Source: " + ex.Source + Environment.NewLine + Environment.NewLine + "GetType: " + ex.GetType().ToString(); System.Windows.Forms.Clipboard.SetDataObject(errMsg, true); // Create an EventLog instance and assign its source. EventLog myLog = new EventLog(); myLog.Source = "ThreadException"; myLog.WriteEntry(errMsg); MessageBox.Show(errMsg, "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); } finally { //if (stream != null) //{ // stream.Close(); // stream.Dispose(); //} } }
public override bool Match(Record r, SubRecord sr, Element se) { if (this.Type == SearchCondElementType.Exists && se != null) { return true; } if (this.Type == SearchCondElementType.Missing && se == null) { return true; } if (se == null) { return false; } var value = sr.GetCompareValue(se); int diff = ValueComparer.Compare(value, this.Value); switch (this.Type) { case SearchCondElementType.Equal: return diff == 0; case SearchCondElementType.Not: return diff != 0; case SearchCondElementType.Greater: return diff > 0; case SearchCondElementType.Less: return diff < 0; case SearchCondElementType.GreaterEqual: return diff >= 0; case SearchCondElementType.LessEqual: return diff <= 0; case SearchCondElementType.StartsWith: if (diff == 0) { return true; } if (value != null && this.Value != null) { return value.ToString().StartsWith(this.Value.ToString(), StringComparison.CurrentCultureIgnoreCase); } break; case SearchCondElementType.EndsWith: if (diff == 0) { return true; } if (value != null && this.Value != null) { return value.ToString().EndsWith(this.Value.ToString(), StringComparison.CurrentCultureIgnoreCase); } break; case SearchCondElementType.Contains: if (diff == 0) { return true; } if (value != null && this.Value != null) { return value.ToString().IndexOf(this.Value.ToString(), StringComparison.CurrentCultureIgnoreCase) >= 0; } break; } return false; }
public override bool Evaluate(Record r, SubRecord sr) { bool any = false; foreach (bool value in sr.EnumerateElements().Where(x => x.Structure.name == this.Record.name).Select(x => Evaluate(r, sr, x))) { if (!value) return false; any = true; } return any; }
/// <summary> /// </summary> /// <param name="sr"> /// </param> /// <param name="rawData"> /// Retain raw data instead of converting to more usuable form /// </param> /// <returns> /// The System.Collections.Generic.IEnumerable`1[T -> TESVSnip.Element]. /// </returns> internal IEnumerable<Element> EnumerateElements(SubRecord sr, bool rawData) { if (sr == null) { return new Element[0]; } return sr.EnumerateElements(rawData); }
public abstract bool Evaluate(Record r, SubRecord sr);
internal IEnumerable<Element> EnumerateElements(SubRecord sr) { return this.EnumerateElements(sr, false); }
public End(SubRecord record) : base(record) { }
internal IEnumerable<Element> EnumerateElements(SubRecord sr, Dictionary<int, Conditional> conditions) { if (sr == null) { return new Element[0]; } return sr.EnumerateElements(conditions); }
public NewMediumLevelRecordEditor(Plugin p, Record r, SubRecord sr, SubrecordStructure ss) { InitializeComponent(); Icon = Resources.tesv_ico; SuspendLayout(); this.sr = sr; this.ss = ss; this.p = p; this.r = r; // walk each element in standard fashion int panelOffset = 0; try { foreach (var elem in ss.elements) { Control c = null; if (elem.options != null && elem.options.Length > 1) { c = new OptionsElement(); } else if (elem.flags != null && elem.flags.Length > 1) { c = new FlagsElement(); } else { switch (elem.type) { case ElementValueType.LString: c = new LStringElement(); break; case ElementValueType.FormID: c = new FormIDElement(); break; case ElementValueType.Blob: c = new HexElement(); break; default: c = new TextElement(); break; } } if (c is IElementControl) { var ec = c as IElementControl; ec.formIDLookup = p.GetRecordByID; ec.formIDScan = p.EnumerateRecords; ec.strIDLookup = p.LookupFormStrings; ec.Element = elem; if (elem.repeat > 0) { var ge = new RepeatingElement(); c = ge; c.Left = 8; c.Width = fpanel1.Width - 16; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; ge.InnerControl = ec; ge.Element = elem; ec = ge; } else if (elem.optional) { var re = new OptionalElement(); c = re; c.Left = 8; c.Width = fpanel1.Width - 16; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; re.InnerControl = ec; re.Element = elem; ec = re; c = re; } else { c.Left = 8; c.Width = fpanel1.Width - 16; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; } c.MinimumSize = c.Size; controlMap.Add(elem, ec); fpanel1.Controls.Add(c); panelOffset = c.Bottom; } } foreach (Element elem in r.EnumerateElements(sr, true)) { var es = elem.Structure; IElementControl c; if (controlMap.TryGetValue(es, out c)) { if (c is IGroupedElementControl) { var gc = c as IGroupedElementControl; gc.Elements.Add(elem.Data); } else { c.Data = elem.Data; } } } } catch { strWarnOnSave = "The subrecord doesn't appear to conform to the expected structure.\nThe formatted information may be incorrect."; Error.SetError(bSave, strWarnOnSave); Error.SetIconAlignment(bSave, ErrorIconAlignment.MiddleLeft); AcceptButton = bCancel; // remove save as default button when exception occurs CancelButton = bCancel; UpdateDefaultButton(); } ResumeLayout(); }
private LoopContext.LoopEvalResult InnerLoop(SubRecord[] subs, Dictionary<int, Conditional> conditions, LoopContext context) { while (true) { if (context.idx >= subs.Length || context.ssidx >= context.sss.Length) { return LoopContext.LoopEvalResult.Success; } var ssb = context.sss[context.ssidx]; var sb = subs[context.idx]; if (ssb is SubrecordGroup) { var sg = ssb as SubrecordGroup; var newcontext = new LoopContext(context.idx, sg.elements); LoopContext.LoopEvalResult result = this.InnerLoop(subs, conditions, newcontext); if (context.idx == newcontext.idx) { if (ssb.optional > 0 || (ssb.repeat > 0 && context.matches > 0)) { ++context.ssidx; context.matches = 0; continue; } } else if (result == LoopContext.LoopEvalResult.Success) { if (ssb.repeat == 0) { ++context.ssidx; } else { ++context.matches; } context.idx = newcontext.idx; continue; } break; } else if (ssb is SubrecordStructure) { var ss = (SubrecordStructure) ssb; if (ss.Condition != CondType.None && !MatchRecordCheckCondition(conditions, ss)) { ++context.ssidx; continue; } if (sb.Name == ss.name && (ss.size == 0 || ss.size == sb.Size)) { sb.AttachStructure(ss); if (ss.ContainsConditionals) { foreach (var elem in this.EnumerateElements(sb)) { if (elem != null && elem.Structure != null) { var es = elem.Structure; if (es.CondID != 0) { conditions[es.CondID] = new Conditional(elem.Type, elem.Value); } } } } ++context.idx; if (ss.repeat == 0) { ++context.ssidx; context.matches = 0; } else { // keep ss context and try again ++context.matches; } continue; } else { if (ss.optional > 0 || (ss.repeat > 0 && context.matches > 0)) { ++context.ssidx; context.matches = 0; continue; } else { // true failure break; } } } } return LoopContext.LoopEvalResult.Failed; }