Exemple #1
0
        /// <summary>
        /// Reads the message.
        /// </summary>
        /// <returns>A message.</returns>
        public CompressedMessage ReadMessage()
        {
            var reader = CreateBinaryReader();
            var stream = reader.BsonStream;

            var messageStartPosition = stream.Position;
            var messageLength        = stream.ReadInt32();

            EnsureMessageLengthIsValid(messageLength);
            var requestId  = stream.ReadInt32();
            var responseTo = stream.ReadInt32();
            var opcode     = (Opcode)stream.ReadInt32();

            EnsureOpcodeIsValid(opcode);
            var originalOpcode   = (Opcode)stream.ReadInt32();
            var uncompressedSize = stream.ReadInt32();
            var compressorType   = (CompressorType)stream.ReadByte();
            var compressor       = _compressorSource.Get(compressorType);

            using (var uncompressedBuffer = new MultiChunkBuffer(new OutputBufferChunkSource(BsonChunkPool.Default)))
                using (var uncompressedStream = new ByteBufferStream(uncompressedBuffer, ownsBuffer: false))
                {
                    uncompressedStream.WriteInt32(uncompressedSize + MessageHeaderLength);
                    uncompressedStream.WriteInt32(requestId);
                    uncompressedStream.WriteInt32(responseTo);
                    uncompressedStream.WriteInt32((int)originalOpcode);
                    compressor.Decompress(stream, uncompressedStream);
                    uncompressedStream.Position = 0;
                    uncompressedBuffer.MakeReadOnly();

                    var originalMessageEncoderFactory = new BinaryMessageEncoderFactory(uncompressedStream, _encoderSettings, _compressorSource);
                    var originalMessageEncoder        = _originalEncoderSelector.GetEncoder(originalMessageEncoderFactory);
                    var originalMessage = originalMessageEncoder.ReadMessage();

                    return(new CompressedMessage(originalMessage, null, compressorType));
                }
        }