コード例 #1
0
ファイル: RecordReader.cs プロジェクト: tstavrianos/patcher
        private void FindMainGroupsInternal(IFindRecordListener listener, FindRecordSharedData sharedData)
        {
            while (NextSegment(sharedData.GroupMetaData))
            {
                if (context.IgnoredFormKinds.Contains(sharedData.GroupMetaData.FormKind))
                {
                    // Skipt ignored form groups
                    SeekEndOfSegment();
                }
                else
                {
                    totalRecordsFound++;

                    FindRecordsInternal(listener, sharedData, 0);
                }
                EndSegment();

                if (sharedData.Args.Action == FindRecordListenerAction.Cancel)
                {
                    if (CurrentSegment != null)
                    {
                        SeekEndOfSegment();
                    }
                    break;
                }
            }
        }
コード例 #2
0
ファイル: RecordReader.cs プロジェクト: tstavrianos/patcher
        private void FindRecordsInternal(IFindRecordListener listener, FindRecordSharedData sharedData, uint parentRecordFormId)
        {
            while (!IsEndOfSegment)
            {
                if (PeekNextSegmentSignature() == "GRUP")
                {
                    FindInnerGroupsInternal(listener, sharedData, parentRecordFormId);
                }

                if (sharedData.Args.Action == FindRecordListenerAction.Cancel)
                {
                    break;
                }

                while (NextSegment(sharedData.RecordMetaData))
                {
                    totalRecordsFound++;

                    uint currentRecordFormId = sharedData.RecordMetaData.FormId;

                    listener.OnRecordFound(sharedData.RecordMetaData.Signature, sharedData.Args);
                    if (sharedData.Args.Action == FindRecordListenerAction.Read)
                    {
                        RecordEntry entry = sharedData.Args.TargetEntry;

                        entry.FilePosition       = sharedData.RecordMetaData.Position;
                        entry.Signature          = sharedData.RecordMetaData.Signature;
                        entry.FormId             = sharedData.RecordMetaData.FormId;
                        entry.ParentRecordFormId = parentRecordFormId;

                        listener.OnRecordEntry(entry);
                    }
                    else if (sharedData.Args.Action == FindRecordListenerAction.Skip)
                    {
                        // Default to Read after skipping one record
                        sharedData.Args.Action = FindRecordListenerAction.Read;
                    }

                    SeekEndOfSegment();
                    EndSegment();

                    if (sharedData.Args.Action == FindRecordListenerAction.Cancel)
                    {
                        break;
                    }

                    // Try reading child records
                    if (PeekNextSegmentSignature() == "GRUP")
                    {
                        FindInnerGroupsInternal(listener, sharedData, currentRecordFormId);
                    }
                }

                if (sharedData.Args.Action == FindRecordListenerAction.Cancel)
                {
                    SeekEndOfSegment();
                    break;
                }
            }
        }
コード例 #3
0
ファイル: RecordReader.cs プロジェクト: tstavrianos/patcher
        internal void FindRecords(IFindRecordListener listener)
        {
            // Change state to Indexing only when current state is AfterHeader
            ChangeState(States.Indexing, s => s == States.AfterHeader);

            FindRecordSharedData sharedData = new FindRecordSharedData()
            {
                Args           = new FindRecordListenerArgs(),
                RecordMetaData = context.CreateRecordMetaData(),
                GroupMetaData  = context.CreateGroupMetaData()
            };

            FindMainGroupsInternal(listener, sharedData);

            ChangeState(States.Ready);
        }
コード例 #4
0
ファイル: RecordReader.cs プロジェクト: tstavrianos/patcher
        private void FindInnerGroupsInternal(IFindRecordListener listener, FindRecordSharedData sharedData, uint parentRecordFormId)
        {
            while (PeekNextSegmentSignature() == "GRUP")
            {
                NextSegment(sharedData.GroupMetaData);
                totalRecordsFound++;

                FindRecordsInternal(listener, sharedData, parentRecordFormId);

                EndSegment();

                if (sharedData.Args.Action == FindRecordListenerAction.Cancel)
                {
                    SeekEndOfSegment();
                    break;
                }
            }
        }