static partial void CustomBinaryEndImport(MutagenFrame frame, IDialogTopicInternal obj) { if (frame.Reader.Complete) { return; } GroupHeader groupMeta = frame.GetGroup(); if (!groupMeta.IsGroup) { return; } if (groupMeta.GroupType == (int)GroupTypeEnum.TopicChildren) { obj.Timestamp = BinaryPrimitives.ReadInt32LittleEndian(groupMeta.LastModifiedSpan); if (FormKey.Factory(frame.MetaData.MasterReferences !, BinaryPrimitives.ReadUInt32LittleEndian(groupMeta.ContainedRecordTypeSpan)) != obj.FormKey) { throw new ArgumentException("Dialog children group did not match the FormID of the parent."); } } else { return; } frame.Reader.Position += groupMeta.HeaderLength; obj.Items.SetTo(Mutagen.Bethesda.Binary.ListBinaryTranslation <DialogItem> .Instance.Parse( frame: frame.SpawnWithLength(groupMeta.ContentLength), transl: (MutagenFrame r, RecordType header, out DialogItem listItem) => { return(LoquiBinaryTranslation <DialogItem> .Instance.Parse( frame: r, item: out listItem)); })); }
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 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); }
private static void CustomBinaryEnd(MutagenFrame frame, ICellInternal obj) { if (frame.Reader.Complete) { return; } if (!frame.TryGetGroup(out var groupMeta)) { return; } var formKey = FormKey.Factory(frame.MetaData.MasterReferences !, BinaryPrimitives.ReadUInt32LittleEndian(groupMeta.ContainedRecordTypeData)); if (groupMeta.GroupType == (int)GroupTypeEnum.CellChildren) { obj.Timestamp = BinaryPrimitives.ReadInt32LittleEndian(groupMeta.LastModifiedData); frame.Position += groupMeta.HeaderLength; if (formKey != obj.FormKey) { throw new ArgumentException("Cell children group did not match the FormID of the parent cell."); } } else { return; } var subFrame = frame.SpawnWithLength(groupMeta.ContentLength); while (!subFrame.Complete) { var persistGroupMeta = frame.GetGroup(); if (!persistGroupMeta.IsGroup) { throw new ArgumentException(); } GroupTypeEnum type = (GroupTypeEnum)persistGroupMeta.GroupType; var itemFrame = frame.SpawnWithLength(persistGroupMeta.TotalLength); switch (type) { case GroupTypeEnum.CellPersistentChildren: ParseTypical( frame: itemFrame, obj: obj, coll: obj.Persistent, persistentParse: true); break; case GroupTypeEnum.CellTemporaryChildren: ParseTemporary( itemFrame, obj); break; case GroupTypeEnum.CellVisibleDistantChildren: ParseTypical( frame: itemFrame, obj: obj, coll: obj.VisibleWhenDistant, persistentParse: false); break; default: throw new NotImplementedException(); } } }