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