private void EncodeVoltron(IoSession session, object message, IProtocolEncoderOutput output)
        {
            IVoltronPacket    voltronPacket     = (IVoltronPacket)message;
            VoltronPacketType voltronPacketType = voltronPacket.GetPacketType();

            EncodeVoltronStylePackets(session, output, AriesPacketType.Voltron, voltronPacketType.GetPacketCode(), voltronPacket);
        }
示例#2
0
 public void Encode(IoSession session, Object message, IProtocolEncoderOutput output)
 {
     lock (_encoder)
     {
         _encoder.Encode(session, message, output);
     }
 }
示例#3
0
        /// <inheritdoc/>
        public override void Encode(IoSession session, Object message, IProtocolEncoderOutput output)
        {
            if (!message.GetType().IsSerializable)
            {
                throw new System.Runtime.Serialization.SerializationException(message.GetType() + " is not serializable.");
            }

            IoBuffer buf = IoBuffer.Allocate(64);

            buf.AutoExpand = true;
            buf.PutInt32(0);
            buf.PutObject(message);

            Int32 objectSize = buf.Position - 4;

            if (objectSize > _maxObjectSize)
            {
                throw new ArgumentException(String.Format("The encoded object is too big: {0} (> {1})",
                                                          objectSize, _maxObjectSize), "message");
            }

            buf.PutInt32(0, objectSize);
            buf.Flip();
            output.Write(buf);
        }
        private void EncodeGluon(IoSession session, object message, IProtocolEncoderOutput output)
        {
            IGluonPacket    packet     = (IGluonPacket)message;
            GluonPacketType packetType = packet.GetPacketType();

            EncodeVoltronStylePackets(session, output, AriesPacketType.Gluon, packetType.GetPacketCode(), packet);
        }
示例#5
0
        public void Encode(IoSession session, ISerialPacket message, IProtocolEncoderOutput output)
        {
            var buf = message.GetBuffer();

            buf.Flip();
            output.Write(buf);
        }
 public void Encode(IoSession session, Object message, IProtocolEncoderOutput output)
 {
     lock (_encoder)
     {
         _encoder.Encode(session, message, output);
     }
 }
        public void Encode(IoSession session, object message, IProtocolEncoderOutput output)
        {
            if (message is object[])
            {
                foreach (var m in (object[])message)
                {
                    Encode(session, m, output);
                }
            }
            else if (message is VMNetMessage)
            {
                var nmsg = (VMNetMessage)message;

                var payload = IoBuffer.Allocate(128);
                payload.Order      = ByteOrder.LittleEndian;
                payload.AutoExpand = true;

                payload.PutInt32(0); //packet type
                payload.PutInt32(nmsg.Data.Length + 1);
                payload.Put((byte)nmsg.Type);
                foreach (var b in nmsg.Data)
                {
                    payload.Put(b);
                }
                payload.Flip();

                output.Write(payload);
            }
        }
示例#8
0
 public void Encode(IoSession session, object message, IProtocolEncoderOutput output)
 {
     Message msg = (Message)message;
     IoBuffer buffer = IoBuffer.Allocate(1024);
     buffer.AutoExpand = true;
     buffer.PutMessage(msg);
     buffer.Flip();
     output.Write(buffer);
 }
示例#9
0
    public void Encode(IoSession session, PacketOutStream message, IProtocolEncoderOutput output)
    {
        int      size = message.GetSize();
        IoBuffer buf  = IoBuffer.Allocate(size + 4);

        buf.PutInt32(size);
        buf.Put(message.getPackets2());
        buf.Flip();
        output.Write(buf);
    }
示例#10
0
        public void Encode(IoSession session, TMessage message, IProtocolEncoderOutput output)
        {
            var buffer = IoBuffer.Allocate(48);

            buffer.AutoExpand = true;
            if (DoEncode(buffer, message))
            {
                buffer.Flip();
                output.Write(buffer);
            }
        }
            public void Encode(object message, IProtocolEncoderOutput output)
            {
                Type            type    = message.GetType();
                IMessageEncoder encoder = FindEncoder(type);

                if (encoder == null)
                {
                    throw new ProtocolEncoderException("Unexpected message type: " + type);
                }

                encoder.Encode(message, output);
            }
示例#12
0
 /// <inheritdoc/>
 public override void Encode(IoSession session, Object message, IProtocolEncoderOutput output)
 {
     String value = (String)message;
     IoBuffer buffer = IoBuffer.Allocate(value.Length);
     buffer.AutoExpand = true;
     buffer.PutPrefixedString(value, PrefixLength, Encoding);
     if (buffer.Position > MaxDataLength)
     {
         throw new ArgumentException("Data length: " + buffer.Position);
     }
     buffer.Flip();
     output.Write(buffer);
 }
示例#13
0
        private IProtocolEncoderOutput GetEncoderOut(IoSession session, INextFilter nextFilter, IWriteRequest writeRequest)
        {
            IProtocolEncoderOutput output = session.GetAttribute <IProtocolEncoderOutput>(ENCODER_OUT);

            if (output == null)
            {
                // Create a new instance, and stores it into the session
                output = new ProtocolEncoderOutputImpl(session, nextFilter, writeRequest);
                session.SetAttribute(ENCODER_OUT, output);
            }

            return(output);
        }
示例#14
0
 public void Encode(object message, IProtocolEncoderOutput output)
 {
     IDataBlock frame = (IDataBlock) message;
     int frameSize = (int)frame.Size; // TODO: sort out signed/unsigned
     ByteBuffer buffer = ByteBuffer.Allocate(frameSize);
     frame.WritePayload(buffer);
     
     if (_logger.IsDebugEnabled)
     {                
         _logger.Debug("Encoded frame byte-buffer is '" + ByteBufferHexDumper.GetHexDump(buffer) + "'");
     }
     buffer.Flip();
     output.Write(buffer);
 }
示例#15
0
        /// <inheritdoc/>
        public override void Encode(IoSession session, Object message, IProtocolEncoderOutput output)
        {
            String   value  = (String)message;
            IoBuffer buffer = IoBuffer.Allocate(value.Length);

            buffer.AutoExpand = true;
            buffer.PutPrefixedString(value, PrefixLength, Encoding);
            if (buffer.Position > MaxDataLength)
            {
                throw new ArgumentException("Data length: " + buffer.Position);
            }
            buffer.Flip();
            output.Write(buffer);
        }
示例#16
0
        public void Encode(IoSession session, Object message, IProtocolEncoderOutput output)
        {
            State           state   = GetState(session);
            IMessageEncoder encoder = FindEncoder(state, message.GetType());

            if (encoder == null)
            {
                throw new UnknownMessageTypeException("No message encoder found for message: " + message);
            }
            else
            {
                encoder.Encode(session, message, output);
            }
        }
示例#17
0
        public void Encode(IoSession session, T message, IProtocolEncoderOutput output)
        {
            IoBuffer buf = IoBuffer.Allocate(16);

            buf.AutoExpand = true; // Enable auto-expand for easier encoding

            // Encode a header
            buf.PutInt16((short)_type);
            buf.PutInt32(message.Sequence);

            // Encode a body
            EncodeBody(session, message, buf);
            buf.Flip();
            output.Write(buf);
        }
示例#18
0
        public void Encode(object message, IProtocolEncoderOutput output)
        {
            IDataBlock frame     = (IDataBlock)message;
            int        frameSize = (int)frame.Size; // TODO: sort out signed/unsigned
            ByteBuffer buffer    = ByteBuffer.Allocate(frameSize);

            frame.WritePayload(buffer);

            if (_logger.IsDebugEnabled)
            {
                _logger.Debug("Encoded frame byte-buffer is '" + ByteBufferHexDumper.GetHexDump(buffer) + "'");
            }
            buffer.Flip();
            output.Write(buffer);
        }
示例#19
0
        /// <inheritdoc/>
        public void Encode(IoSession session, Object message, IProtocolEncoderOutput output)
        {
            String value = message == null ? String.Empty : message.ToString();

            value += _delimiter.Value;
            Byte[] bytes = _encoding.GetBytes(value);
            if (bytes.Length > _maxLineLength)
            {
                throw new ArgumentException("Line too long: " + bytes.Length);
            }

            // TODO BufferAllocator
            IoBuffer buf = IoBuffer.Wrap(bytes);

            output.Write(buf);
        }
示例#20
0
        public void TestEncoder()
        {
            String expected = "1234";

            ProtocolCodecSession   session = new ProtocolCodecSession();
            IProtocolEncoderOutput output  = session.EncoderOutput;

            IProtocolEncoder encoder = new ObjectSerializationEncoder();

            encoder.Encode(session, expected, output);

            Assert.AreEqual(1, session.EncoderOutputQueue.Count);
            IoBuffer buf = (IoBuffer)session.EncoderOutputQueue.Dequeue();

            TestDecoderAndInputStream(expected, buf);
        }
示例#21
0
        public void Encode(IoSession session, byte[] message, IProtocolEncoderOutput output)
        {
            try
            {
                var      data = (byte[])message;
                IoBuffer buf  = IoBuffer.Allocate(data.Length);
                buf.AutoExpand = true; // Enable auto-expand for easier encoding

                buf.Put(data);
                buf.Flip();
                output.Write(buf);
            }
            catch (System.Exception ex)
            {
                _logger.Error(System.String.Format("Exception in {0} {1}", LST.GetCurrentMethod(), ex.Message));
            }
        }
示例#22
0
        public void TestEncode()
        {
            TextLineEncoder        encoder = new TextLineEncoder(Encoding.UTF8, LineDelimiter.Windows);
            ProtocolCodecSession   session = new ProtocolCodecSession();
            IProtocolEncoderOutput output  = session.EncoderOutput;

            encoder.Encode(session, "ABC", output);
            Assert.AreEqual(1, session.EncoderOutputQueue.Count);
            IoBuffer buf = (IoBuffer)session.EncoderOutputQueue.Dequeue();

            Assert.AreEqual(5, buf.Remaining);
            Assert.AreEqual((Byte)'A', buf.Get());
            Assert.AreEqual((Byte)'B', buf.Get());
            Assert.AreEqual((Byte)'C', buf.Get());
            Assert.AreEqual((Byte)'\r', buf.Get());
            Assert.AreEqual((Byte)'\n', buf.Get());
        }
示例#23
0
        private void EncodeVoltronStylePackets(IoSession session, IProtocolEncoderOutput output, AriesPacketType ariesType, ushort packetType, IoBufferSerializable message)
        {
            var payload = IoBuffer.Allocate(512);

            payload.Order      = ByteOrder.BigEndian;
            payload.AutoExpand = true;
            message.Serialize(payload, Context);
            payload.Flip();

            int      payloadSize = payload.Remaining;
            IoBuffer headers     = IoBuffer.Allocate(18);

            headers.Order = ByteOrder.LittleEndian;

            /**
             * Aries header
             *  uint32	type
             *  uint32	timestamp
             *  uint32	payloadSize
             */
            uint timestamp = (uint)TimeSpan.FromTicks(DateTime.Now.Ticks - session.CreationTime.Ticks).TotalMilliseconds;

            headers.PutUInt32(ariesType.GetPacketCode());
            headers.PutUInt32(timestamp);
            headers.PutUInt32((uint)payloadSize + 6);

            /**
             * Voltron header
             *  uint16	type
             *  uint32	payloadSize
             */
            headers.Order = ByteOrder.BigEndian;
            headers.PutUInt16(packetType);
            headers.PutUInt32((uint)payloadSize + 6);

            if (payloadSize > 0)
            {
                headers.AutoExpand = true;
                headers.Put(payload);
            }

            headers.Flip();
            output.Write(headers);
            //output.Flush();
        }
        public override void Encode(IoSession session, Object message, IProtocolEncoderOutput output)
        {
            if (!message.GetType().IsSerializable)
                throw new System.Runtime.Serialization.SerializationException(message.GetType() + " is not serializable.");

            IoBuffer buf = IoBuffer.Allocate(64);
            buf.AutoExpand = true;
            buf.PutInt32(0);
            buf.PutObject(message);

            Int32 objectSize = buf.Position - 4;
            if (objectSize > _maxObjectSize)
                throw new ArgumentException(String.Format("The encoded object is too big: {0} (> {1})",
                    objectSize, _maxObjectSize), "message");

            buf.PutInt32(0, objectSize);
            buf.Flip();
            output.Write(buf);
        }
示例#25
0
        public void Encode(IoSession session, object message, IProtocolEncoderOutput output)
        {
            WampCommandBase cmd  = (WampCommandBase)message;
            string          json = cmd.toCommandJson();

            byte[] jsonByteArray = System.Text.Encoding.UTF8.GetBytes(json);
            int    len           = jsonByteArray.Length + 4;

            if (len > 1000000)
            {
                throw new ArgumentException("{msg:'data size > 1m', dataSize:" + len + "}");
            }
            IoBuffer buffer = IoBuffer.Allocate(len);

            buffer.AutoExpand = true;
            buffer.PutInt32(len);
            buffer.Put(jsonByteArray);

            buffer.Flip();
            output.Write(buffer);
        }
示例#26
0
        private void EncodeAries(IoSession session, object message, IProtocolEncoderOutput output)
        {
            IAriesPacket    ariesPacket     = (IAriesPacket)message;
            AriesPacketType ariesPacketType = ariesPacket.GetPacketType();

            var payload = IoBuffer.Allocate(128);

            payload.Order      = ByteOrder.LittleEndian;
            payload.AutoExpand = true;
            ariesPacket.Serialize(payload, Context);
            payload.Flip();

            int      payloadSize = payload.Remaining;
            IoBuffer headers     = IoBuffer.Allocate(12);

            headers.Order = ByteOrder.LittleEndian;

            /**
             * Aries header
             *  uint32	type
             *  uint32	timestamp
             *  uint32	payloadSize
             */
            uint timestamp = (uint)TimeSpan.FromTicks(DateTime.Now.Ticks - session.CreationTime.Ticks).TotalMilliseconds;

            headers.PutUInt32(ariesPacketType.GetPacketCode());
            headers.PutUInt32(timestamp);
            headers.PutUInt32((uint)payloadSize);

            if (payloadSize > 0)
            {
                headers.AutoExpand = true;
                headers.Put(payload);
            }

            headers.Flip();
            output.Write(headers);
            //output.Flush();
        }
示例#27
0
        public void Encode(IoSession session, object message, IProtocolEncoderOutput output)
        {
            if (message is IVoltronPacket)
            {
                EncodeVoltron(session, message, output);
            }
            else if (message is IElectronPacket)
            {
                EncodeElectron(session, message, output);
            }
            else if (message is IGluonPacket)
            {
                EncodeGluon(session, message, output);
            }
            else if (message is IAriesPacket)
            {
                EncodeAries(session, message, output);
            }
            else if (message.GetType().IsArray)
            {
                object[] arr        = (object[])message;
                bool     allVoltron = true;

                for (var i = 0; i < arr.Length; i++)
                {
                    if (!(arr[i] is IVoltronPacket))
                    {
                        allVoltron = false;
                        break;
                    }
                }

                //TODO: Chunk these into fewer packets
                for (var i = 0; i < arr.Length; i++)
                {
                    Encode(session, arr[i], output);
                }
            }
        }
示例#28
0
 public void Encode(IoSession session, WampCommandBase message, IProtocolEncoderOutput output)
 {
     Console.WriteLine("not run to here");
 }
示例#29
0
 public void Encode(IoSession session, object message, IProtocolEncoderOutput output)
 {
     Encode(session, (ISerialPacket)message, output);
 }
示例#30
0
        /// <inheritdoc/>
        public override void FilterWrite(INextFilter nextFilter, IoSession session, IWriteRequest writeRequest)
        {
            Object message = writeRequest.Message;

            // Bypass the encoding if the message is contained in a IoBuffer,
            // as it has already been encoded before
            if (message is IoBuffer || message is IFileRegion)
            {
                nextFilter.FilterWrite(session, writeRequest);
                return;
            }

            // Get the encoder in the session
            IProtocolEncoder       encoder    = _factory.GetEncoder(session);
            IProtocolEncoderOutput encoderOut = GetEncoderOut(session, nextFilter, writeRequest);

            if (encoder == null)
            {
                throw new ProtocolEncoderException("The encoder is null for the session " + session);
            }
            if (encoderOut == null)
            {
                throw new ProtocolEncoderException("The encoderOut is null for the session " + session);
            }

            try
            {
                encoder.Encode(session, message, encoderOut);
                AbstractProtocolEncoderOutput ape = encoderOut as AbstractProtocolEncoderOutput;
                if (ape != null)
                {
                    // Send it directly
                    IQueue <Object> bufferQueue = ape.MessageQueue;
                    // Write all the encoded messages now
                    while (!bufferQueue.IsEmpty)
                    {
                        Object encodedMessage = bufferQueue.Dequeue();

                        if (encodedMessage == null)
                        {
                            break;
                        }

                        // Flush only when the buffer has remaining.
                        IoBuffer buf = encodedMessage as IoBuffer;
                        if (buf == null || buf.HasRemaining)
                        {
                            IWriteRequest encodedWriteRequest = new EncodedWriteRequest(encodedMessage, null, writeRequest.Destination);
                            nextFilter.FilterWrite(session, encodedWriteRequest);
                        }
                    }
                }

                // Call the next filter
                nextFilter.FilterWrite(session, new MessageWriteRequest(writeRequest));
            }
            catch (Exception ex)
            {
                ProtocolEncoderException pee = ex as ProtocolEncoderException;
                if (pee == null)
                {
                    pee = new ProtocolEncoderException(null, ex);
                }
                throw pee;
            }
        }
            public void Encode(object message, IProtocolEncoderOutput output)
            {
                Type type = message.GetType();
                IMessageEncoder encoder = FindEncoder(type);
                if (encoder == null)
                {
                    throw new ProtocolEncoderException("Unexpected message type: " + type);
                }

                encoder.Encode(message, output);
            }
示例#32
0
 public abstract void Encode(IoSession session, Object message, IProtocolEncoderOutput output);
 public abstract void Encode(IoSession session, Object message, IProtocolEncoderOutput output);
示例#34
0
 public void Encode(IoSession session, object message, IProtocolEncoderOutput output)
 {
     Encode(session, (PacketOutStream)message, output);
 }
示例#35
0
        /// <inheritdoc/>
        public void Encode(IoSession session, Object message, IProtocolEncoderOutput output)
        {
            String value = message == null ? String.Empty : message.ToString();
            value += _delimiter.Value;
            Byte[] bytes = _encoding.GetBytes(value);
            if (bytes.Length > _maxLineLength)
                throw new ArgumentException("Line too long: " + bytes.Length);

            // TODO BufferAllocator
            IoBuffer buf = IoBuffer.Wrap(bytes);
            output.Write(buf);
        }
示例#36
0
 public void Encode(IoSession session, object message, IProtocolEncoderOutput output)
 {
     Encode(session, (TMessage)message, output);
 }