예제 #1
0
        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);
        }
예제 #3
0
//        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);
        }
예제 #4
0
        // 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;
 }
예제 #6
0
        protected virtual void WriteRecordNode(BinaryWriter writer, EsfNode node)
        {
            RecordNode recordNode = node as RecordNode;

            recordNode.Encode(writer);
        }