Exemplo n.º 1
0
        static partial void FillBinaryRegionAreaLogicCustom(MutagenFrame frame, IRegionInternal item)
        {
            var rdat = HeaderTranslation.GetNextSubrecordType(frame.Reader, out var rdatType);

            while (rdat.Equals(RecordTypes.RDAT))
            {
                ParseRegionData(frame, item);
                if (frame.Complete)
                {
                    break;
                }
                rdat = HeaderTranslation.GetNextSubrecordType(frame.Reader, out rdatType);
            }
        }
Exemplo n.º 2
0
        private static void AlignMajorRecordsByRules(
            IMutagenReadStream inputStream,
            MutagenWriter writer,
            AlignmentRules alignmentRules,
            RecordLocatorResults fileLocs)
        {
            while (!inputStream.Complete)
            {
                // Import until next listed major record
                long noRecordLength;
                if (fileLocs.ListedRecords.TryGetInDirection(
                        inputStream.Position,
                        higher: true,
                        result: out var nextRec))
                {
                    var recordLocation = fileLocs.ListedRecords.Keys[nextRec.Key];
                    noRecordLength = recordLocation - inputStream.Position;
                }
                else
                {
                    noRecordLength = inputStream.Remaining;
                }
                inputStream.WriteTo(writer.BaseStream, (int)noRecordLength);

                // If complete overall, return
                if (inputStream.Complete)
                {
                    break;
                }

                var recType = HeaderTranslation.ReadNextRecordType(
                    inputStream,
                    out var len);
                if (!alignmentRules.StopMarkers.TryGetValue(recType, out var stopMarkers))
                {
                    stopMarkers = null;
                }
                writer.Write(recType.TypeInt);
                writer.Write(len);
                if (!alignmentRules.Alignments.TryGetValue(recType, out var alignments))
                {
                    inputStream.WriteTo(writer.BaseStream, inputStream.MetaData.Constants.MajorConstants.LengthAfterLength + len);
                    continue;
                }
                inputStream.WriteTo(writer.BaseStream, inputStream.MetaData.Constants.MajorConstants.LengthAfterLength);
                var writerEndPos = writer.Position + len;
                var endPos       = inputStream.Position + len;
                var dataDict     = new Dictionary <RecordType, ReadOnlyMemorySlice <byte> >();
                ReadOnlyMemorySlice <byte>?rest = null;
                while (inputStream.Position < endPos)
                {
                    var subType = HeaderTranslation.GetNextSubrecordType(
                        inputStream,
                        out var _);
                    if (stopMarkers?.Contains(subType) ?? false)
                    {
                        rest = inputStream.ReadMemory((int)(endPos - inputStream.Position), readSafe: true);
                        break;
                    }
                    if (!alignments.TryGetValue(subType, out var rule))
                    {
                        throw new ArgumentException($"Encountered an unknown record: {subType}");
                    }
                    dataDict.Add(subType, rule.GetBytes(inputStream));
                }
                foreach (var alignment in alignmentRules.Alignments[recType])
                {
                    if (dataDict.TryGetValue(
                            alignment.Key,
                            out var data))
                    {
                        writer.Write(data);
                        dataDict.Remove(alignment.Key);
                    }
                }
                if (dataDict.Count > 0)
                {
                    throw new ArgumentException($"Encountered an unknown record: {dataDict.First().Key}");
                }
                if (rest != null)
                {
                    writer.Write(rest.Value);
                }
                if (writer.Position != writerEndPos)
                {
                    throw new ArgumentException("Record alignment changed length");
                }
            }
        }
Exemplo n.º 3
0
            public static partial void CustomBinaryEndImport(MutagenFrame frame, IWorldspaceInternal obj)
            {
                try
                {
                    if (!frame.Reader.TryReadGroup(out var groupHeader))
                    {
                        return;
                    }
                    if (groupHeader.GroupType == (int)GroupTypeEnum.WorldChildren)
                    {
                        obj.SubCellsTimestamp = BinaryPrimitives.ReadInt32LittleEndian(groupHeader.LastModifiedData);
                        obj.SubCellsUnknown   = BinaryPrimitives.ReadInt32LittleEndian(groupHeader.HeaderData.Slice(groupHeader.HeaderLength - 4));
                        var formKey = FormKeyBinaryTranslation.Instance.Parse(groupHeader.ContainedRecordTypeData, frame.MetaData.MasterReferences !);
                        if (formKey != obj.FormKey)
                        {
                            throw new ArgumentException("Cell children group did not match the FormID of the parent worldspace.");
                        }
                    }
                    else
                    {
                        frame.Reader.Position -= groupHeader.HeaderLength;
                        return;
                    }
                    frame.MetaData.InWorldspace = true;
                    try
                    {
                        var subFrame = MutagenFrame.ByLength(frame.Reader, groupHeader.ContentLength);
                        for (int i = 0; i < 2; i++)
                        {
                            if (subFrame.Complete)
                            {
                                return;
                            }
                            var subType = HeaderTranslation.GetNextSubrecordType(frame.Reader, out var subLen);
                            switch (subType.TypeInt)
                            {
                            case 0x4C4C4543:     // "CELL":
                                if (LoquiBinaryTranslation <Cell> .Instance.Parse(subFrame, out var topCell))
                                {
                                    obj.TopCell = topCell;
                                }
                                else
                                {
                                    obj.TopCell = default;
                                }
                                break;

                            case 0x50555247:     // "GRUP":
                                obj.SubCells.SetTo(
                                    ListBinaryTranslation <WorldspaceBlock> .Instance.Parse(
                                        reader: frame,
                                        triggeringRecord: RecordTypes.GRUP,
                                        transl: LoquiBinaryTranslation <WorldspaceBlock> .Instance.Parse));
                                break;

                            default:
                                return;
                            }
                        }
                    }
                    finally
                    {
                        frame.MetaData.InWorldspace = false;
                    }
                }
                catch (Exception ex)
                {
                    throw RecordException.Enrich(ex, obj);
                }
            }