//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 virtual void WriteRecordNode(BinaryWriter writer, EsfNode node) { RecordNode recordNode = node as RecordNode; recordNode.Encode(writer); }