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; } } }