public static M SubrecordParse <M>( M record, MutagenFrame frame, RecordTypeConverter?recordTypeConverter, RecordStructFill <M> fillStructs, SubrecordFill <M> fillTyped) { fillStructs?.Invoke( record: record, frame: frame); int?lastParsed = null; while (!frame.Complete) { var subMeta = frame.GetSubrecord(); var finalPos = frame.Position + subMeta.TotalLength; var parsed = fillTyped( record: record, frame: frame, lastParsed: lastParsed, nextRecordType: subMeta.RecordType, contentLength: subMeta.ContentLength, recordTypeConverter: recordTypeConverter); if (parsed.Failed) { break; } if (frame.Position < finalPos) { frame.Position = finalPos; } lastParsed = parsed.Value; } return(record); }
public static M MajorRecordParse <M>( M record, MutagenFrame frame, RecordTypeConverter?recordTypeConverter, RecordStructFill <M> fillStructs, RecordTypeFill <M> fillTyped) where M : IMajorRecordCommonGetter { frame = frame.SpawnWithFinalPosition(HeaderTranslation.ParseRecord(frame.Reader)); fillStructs( record: record, frame: frame); if (fillTyped == null) { return(record); } try { MutagenFrame targetFrame = frame; if (record.IsCompressed) { targetFrame = frame.Decompress(); } Dictionary <RecordType, int>?recordParseCount = null; frame.MetaData.FormVersion = record.FormVersion; while (!targetFrame.Complete) { var subMeta = targetFrame.GetSubrecord(); var finalPos = targetFrame.Position + subMeta.TotalLength; ParseResult parsed; try { parsed = fillTyped( record: record, frame: targetFrame, recordParseCount: recordParseCount, nextRecordType: subMeta.RecordType, contentLength: subMeta.ContentLength, recordTypeConverter: recordTypeConverter); } catch (Exception ex) { throw new SubrecordException( subMeta.RecordType, record.FormKey, modKey: frame.Reader.MetaData.ModKey, edid: record.EditorID, innerException: ex); } if (!parsed.KeepParsing) { break; } if (parsed.DuplicateParseMarker != null) { if (recordParseCount == null) { recordParseCount = new Dictionary <RecordType, int>(); } recordParseCount[parsed.DuplicateParseMarker !.Value] = recordParseCount.GetOrAdd(parsed.DuplicateParseMarker !.Value) + 1;
public static M SubrecordParse <M>( M record, MutagenFrame frame, RecordTypeConverter?recordTypeConverter, RecordStructFill <M> fillStructs) { fillStructs?.Invoke( record: record, frame: frame); return(record); }
public static M ModParse <M, G>( M record, MutagenFrame frame, G importMask, RecordTypeConverter?recordTypeConverter, RecordStructFill <M> fillStructs, ModRecordTypeFill <M, G> fillTyped) { var modHeader = frame.Reader.GetMod(); fillTyped( record: record, frame: frame, importMask: importMask, nextRecordType: modHeader.RecordType, contentLength: checked ((int)modHeader.ContentLength), recordTypeConverter: recordTypeConverter); while (!frame.Complete) { var groupHeader = frame.GetGroup(); if (!groupHeader.IsGroup) { throw new ArgumentException("Did not see GRUP header as expected."); } var len = checked ((int)groupHeader.ContentLength); var finalPos = frame.Position + groupHeader.TotalLength; if (len == 0) { frame.Position = finalPos; continue; } var parsed = fillTyped( record: record, frame: frame, importMask: importMask, nextRecordType: groupHeader.ContainedRecordType, contentLength: len, recordTypeConverter: recordTypeConverter); if (parsed.Failed) { break; } if (frame.Position < finalPos) { frame.Position = finalPos; } } frame.SetToFinalPosition(); return(record); }
public static M MajorRecordParse <M>( M record, MutagenFrame frame, RecordTypeConverter?recordTypeConverter, RecordStructFill <M> fillStructs, RecordTypeFill <M> fillTyped) where M : IMajorRecordCommonGetter { frame = frame.SpawnWithFinalPosition(HeaderTranslation.ParseRecord(frame.Reader)); fillStructs( record: record, frame: frame); if (fillTyped == null) { return(record); } MutagenFrame targetFrame = frame; if (record.IsCompressed) { targetFrame = frame.Decompress(); } while (!targetFrame.Complete) { var subMeta = targetFrame.GetSubrecord(); var finalPos = targetFrame.Position + subMeta.TotalLength; var parsed = fillTyped( record: record, frame: targetFrame, nextRecordType: subMeta.RecordType, contentLength: subMeta.ContentLength, recordTypeConverter: recordTypeConverter); if (parsed.Failed) { break; } if (targetFrame.Position < finalPos) { targetFrame.Position = finalPos; } } frame.SetToFinalPosition(); return(record); }
public static G GroupParse <G>( G record, MutagenFrame frame, RecordTypeConverter?recordTypeConverter, RecordStructFill <G> fillStructs, RecordTypeFill <G> fillTyped) { var groupMeta = frame.GetGroup(); if (!groupMeta.IsGroup) { throw new ArgumentException($"Expected GRUP header was not read in: {frame.Position}"); } frame.Position += groupMeta.TypeAndLengthLength; frame = frame.ReadAndReframe(checked ((int)(groupMeta.TotalLength - groupMeta.TypeAndLengthLength))); fillStructs?.Invoke( record: record, frame: frame); while (!frame.Complete) { var nextRecordType = HeaderTranslation.GetNextSubrecordType( reader: frame.Reader, contentLength: out var contentLength); var finalPos = frame.Position + contentLength; var parsed = fillTyped( record: record, frame: frame, nextRecordType: nextRecordType, contentLength: contentLength, recordTypeConverter: recordTypeConverter); if (parsed.Failed) { break; } if (frame.Position < finalPos) { frame.Position = finalPos; } } frame.SetToFinalPosition(); return(record); }
public static M MajorRecordParse <M>( M record, MutagenFrame frame, TypedParseParams?translationParams, RecordStructFill <M> fillStructs, MajorRecordFill <M> fillTyped) where M : IMajorRecordGetter { frame = frame.SpawnWithFinalPosition(HeaderTranslation.ParseRecord(frame.Reader)); fillStructs( record: record, frame: frame); try { MutagenFrame targetFrame = frame; if (record.IsCompressed) { targetFrame = frame.Decompress(); } Dictionary <RecordType, int>?recordParseCount = null; frame.MetaData.FormVersion = record.FormVersion; var lastParsed = new PreviousParse(); while (!targetFrame.Complete) { var subMeta = targetFrame.GetSubrecord(); var finalPos = targetFrame.Position + subMeta.TotalLength; ParseResult parsed; try { parsed = fillTyped( record: record, frame: targetFrame, lastParsed: lastParsed, recordParseCount: recordParseCount, nextRecordType: subMeta.RecordType, contentLength: lastParsed.LengthOverride ?? subMeta.ContentLength, translationParams: translationParams); } catch (Exception ex) { throw new SubrecordException( subMeta.RecordType, record.FormKey, majorRecordType: record.Registration.ClassType, modKey: frame.Reader.MetaData.ModKey, edid: record.EditorID, innerException: ex); } if (!parsed.KeepParsing) { break; } if (parsed.DuplicateParseMarker != null) { if (recordParseCount == null) { recordParseCount = new Dictionary <RecordType, int>(); } recordParseCount[parsed.DuplicateParseMarker !.Value] =