TESVSnip.Domain.Model.Record.SaveData C# (CSharp) Method

SaveData() private method

private SaveData ( BinaryWriter writer ) : void
writer System.IO.BinaryWriter
return void
        internal override void SaveData(BinaryWriter writer)
        {
            var position = writer.BaseStream.Position;
            WriteString(writer, Name);

            uint realSize;
            var compressed = false;
            byte[] data;
            using (var stream = new MemoryStream())
            {
                var dataWriter = new BinaryWriter(stream);
                foreach (var subRecord in this.SubRecords)
                {
                    subRecord.SaveData(dataWriter);
                }

                realSize = (uint)stream.Length;

                if (Properties.Settings.Default.UseDefaultRecordCompression)
                {
                    compressed = ((this.Flags1 & 0x00040000) != 0) ||
                                 (Properties.Settings.Default.EnableAutoCompress && Compressor.CompressRecord(Name))
                                 ||
                                 (Properties.Settings.Default.EnableCompressionLimit &&
                                  (realSize >= Properties.Settings.Default.CompressionLimit));
                }
                if (Properties.Settings.Default.UsePluginRecordCompression)
                {
                    compressed = (this.Flags1 & 0x00040000) != 0;
                }

                data = stream.ToArray();
                if (compressed) // compressed
                {
                    data = Compressor.Compress(data, (compressLevel == 0) ? 9 : compressLevel);
                }
            }

            var dataSize = (uint)data.Length;
            var flags = this.Flags1 & ~0x00040000U;
            if (compressed)
            {
                dataSize += 4;
                flags |= 0x00040000;

                Debug.WriteLineIf(
                    this.dataSize != dataSize,
                    string.Format(
                        "COMPRESSED RECORD [NAME={0} AT POSITION={1}] SIZE DIFFERS FROM ORIGINAL: ORIGINAL={2} ACTUAL={3}, RAW RECORD SIZE={4}",
                        Name, position, this.dataSize, dataSize, realSize));
            }

            writer.Write(dataSize); // Size of compressed section + length
            writer.Write(flags);
            writer.Write(this.FormID);
            writer.Write(this.Flags2);
            writer.Write(this.Flags3);
            if (compressed)
            {
                writer.Write(realSize);
            }

            writer.Write(data, 0, data.Length);
        }