public override EsfNode CreateCopy() { RecordNode node = new RecordNode(Codec, OriginalTypeCode); CopyMembers(node); return(node); }
//re-compress node public override void Encode(BinaryWriter writer) { // encode the node into bytes byte[] data; MemoryStream uncompressedStream = new MemoryStream(); using (BinaryWriter w = new BinaryWriter(uncompressedStream)) { // use the node's own codec or we'll mess up the string lists Decoded.Codec.EncodeRootNode(w, Decoded); data = uncompressedStream.ToArray(); } uint uncompressedSize = (uint)data.LongLength; // compress the encoded data #if DEBUG Console.WriteLine("compressing..."); #endif MemoryStream outStream = new MemoryStream(); LzmaEncoder encoder = new LzmaEncoder(); using (uncompressedStream = new MemoryStream(data)) { encoder.Code(uncompressedStream, outStream, data.Length, long.MaxValue, null); data = outStream.ToArray(); } #if DEBUG Console.WriteLine("ok, compression done"); #endif // prepare decoding information List <EsfNode> infoItems = new List <EsfNode>(); infoItems.Add(new UIntNode { Value = uncompressedSize, TypeCode = EsfType.UINT32, Codec = Codec }); using (MemoryStream propertyStream = new MemoryStream()) { encoder.WriteCoderProperties(propertyStream); infoItems.Add(new RawDataNode(Codec) { Value = propertyStream.ToArray() }); } // put together the items expected by the unzipper List <EsfNode> dataItems = new List <EsfNode>(); dataItems.Add(new RawDataNode(Codec) { Value = data }); dataItems.Add(new RecordNode(Codec) { Name = CompressedNode.INFO_TAG, Value = infoItems }); RecordNode compressedNode = new RecordNode(Codec) { Name = CompressedNode.TAG_NAME, Value = dataItems }; // and finally encode compressedNode.Encode(writer); }
// protected byte[] EncodeArrayNode<T>(T[] array, ValueWriter<T> WriteItem) { // byte[] result; // MemoryStream bufferStream = new MemoryStream(); // using (BinaryWriter writer = new BinaryWriter(bufferStream)) { // for (int i = 0; i < array.Length; i++) { // WriteItem(writer, array[i]); // } // result = bufferStream.ToArray(); // } // return result; // } #endregion #region Record Nodes // read an identified node from the reader at its current position public virtual RecordNode ReadRecordNode(BinaryReader reader, byte typeCode, bool forceDecode = false) { RecordNode node; if (!forceDecode && buffer != null) { node = new MemoryMappedRecordNode(this, buffer, (int)reader.BaseStream.Position); } else { node = new RecordNode(this, typeCode); } node.Decode(reader, EsfType.RECORD); return(node); }
// Section can now be compressed public override RecordNode ReadRecordNode(BinaryReader reader, byte typeCode, bool forceDecode = false) { RecordNode node = base.ReadRecordNode(reader, typeCode, forceDecode) as RecordNode; if (forceDecode && node.Name == CompressedNode.TAG_NAME) { // decompress node // Console.WriteLine("reading compressed node"); node = new CompressedNode(this, node); } if (node is MemoryMappedRecordNode) { // we don't need to invalidate following sections because // all the sizes are relative so we won't need to adjust them (node as MemoryMappedRecordNode).InvalidateSiblings = false; } return(node); }
public CompressedNode(EsfCodec codec, RecordNode rootNode) : base(codec) { Name = TAG_NAME; compressedNode = rootNode; }
protected virtual void WriteRecordNode(BinaryWriter writer, EsfNode node) { RecordNode recordNode = node as RecordNode; recordNode.Encode(writer); }