コード例 #1
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;
                }
            }
        }