Beispiel #1
0
 private void RaiseSubRecordAddedEvent(Guid parentID, SubRecord subRecord)
 {
     if (SubRecordAdded != null)
     {
         SubRecordAdded(this, new SubRecordEventArgs(parentID, subRecord));
     }
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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;
        }
Beispiel #7
0
 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;
 }
Beispiel #8
0
        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);

        }
Beispiel #9
0
        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;
        }
Beispiel #10
0
            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;
            }
Beispiel #11
0
        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);
        }
Beispiel #12
0
        public static string GetFormattedData(this SubRecord rec)
        {
            var sb = new StringBuilder();

            rec.GetFormattedData(sb);
            return(sb.ToString());
        }
Beispiel #13
0
 /// <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));
 }
Beispiel #14
0
 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;
 }
Beispiel #16
0
 /// <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;
 }
Beispiel #17
0
 /// <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;
 }
Beispiel #18
0
 /// <summary>
 /// Clear any state
 /// </summary>
 public void ClearControl()
 {
     r  = null;
     sr = null;
     ss = null;
     controlMap.Clear();
     fpanel1.Controls.Clear();
     Enabled = false;
 }
Beispiel #19
0
        private void linkLabelSubRecordOpenFolder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            SubRecord subRecord = (SubRecord)((LinkLabel)sender).Tag;

            Process.Start(new ProcessStartInfo()
            {
                FileName = subRecord.Folder,
                Verb     = "open"
            });
        }
Beispiel #20
0
        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();
        }
Beispiel #21
0
 private void AddSubRecord(Guid parentID, SubRecord subRecord)
 {
     if (_fileRecorder != null)
     {
         _fileRecorder.AddSubRecord(parentID, subRecord);
     }
     else
     {
         throw new SystemException("Recording not setup correctly.");
     }
 }
Beispiel #22
0
        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);
        }
Beispiel #23
0
        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();
        }
Beispiel #25
0
            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;
            }
Beispiel #26
0
        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);
        }
Beispiel #27
0
 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);
            }
        }
Beispiel #29
0
        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;
                    }
                }
            }
        }
Beispiel #30
0
        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;
        }
Beispiel #31
0
        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);
            }
        }
Beispiel #32
0
 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);
     }
 }
Beispiel #33
0
 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);
 }
Beispiel #34
0
        /// <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();
        }
Beispiel #36
0
 public abstract bool Match(Record r, SubRecord sr);
Beispiel #37
0
        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);
        }
Beispiel #38
0
 public override bool Match(Record r, SubRecord sr)
 {
     return this.Type == SearchCondRecordType.Exists ^ sr == null;
 }
Beispiel #39
0
 public abstract bool Match(Record r, SubRecord sr, Element se);
Beispiel #40
0
        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;
        }
Beispiel #41
0
 public override bool Match(Record r, SubRecord sr, Element se)
 {
     return false;
 }
Beispiel #42
0
        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;
        }
Beispiel #43
0
        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;
        }
Beispiel #44
0
        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;
        }
Beispiel #45
0
 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;
            }
Beispiel #49
0
        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());
                }
            }
        }
Beispiel #50
0
        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;
        }
Beispiel #51
0
        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();
                //}
            }
        }
Beispiel #52
0
        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;
        }
Beispiel #53
0
 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;
 }
Beispiel #54
0
        /// <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 -&gt; TESVSnip.Element].
        /// </returns>
        internal IEnumerable<Element> EnumerateElements(SubRecord sr, bool rawData)
        {
            if (sr == null)
            {
                return new Element[0];
            }

            return sr.EnumerateElements(rawData);
        }
Beispiel #55
0
 public abstract bool Evaluate(Record r, SubRecord sr);
Beispiel #56
0
 internal IEnumerable<Element> EnumerateElements(SubRecord sr)
 {
     return this.EnumerateElements(sr, false);
 }
Beispiel #57
0
 public End(SubRecord record)
     : base(record)
 {
 }
Beispiel #58
0
        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();
        }
Beispiel #60
0
        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;
        }