protected override bool DoDecode(ByteBuffer input, IProtocolDecoderOutput output)
            {
                MessageDecoderResult result;

                if (_currentDecoder == null)
                {
                    IMessageDecoder[] decoders = _decoders;
                    int undecodables           = 0;

                    for (int i = decoders.Length - 1; i >= 0; i--)
                    {
                        IMessageDecoder decoder = decoders[i];
                        int             limit   = input.Limit;
                        int             pos     = input.Position;

                        try
                        {
                            result = decoder.Decodable(input);
                        }
                        finally
                        {
                            input.Position = pos;
                            input.Limit    = limit;
                        }

                        if (result == MessageDecoderResult.OK)
                        {
                            _currentDecoder = decoder;
                            break;
                        }
                        else if (result == MessageDecoderResult.NOT_OK)
                        {
                            undecodables++;
                        }
                        else if (result != MessageDecoderResult.NEED_DATA)
                        {
                            throw new Exception("Unexpected decode result (see your decodable()): " + result);
                        }
                    }

                    if (undecodables == _decoders.Length)
                    {
                        // Throw an exception if all decoders cannot decode data.
                        input.Position = input.Limit; // Skip data
                        throw new ProtocolDecoderException(
                                  "No appropriate message decoder: " + input.GetHexDump());
                    }

                    if (_currentDecoder == null)
                    {
                        // Decoder is not determined yet (i.e. we need more data)
                        return(false);
                    }
                }

                result = _currentDecoder.Decode(input, output);
                if (result == MessageDecoderResult.OK)
                {
                    _currentDecoder = null;
                    return(true);
                }
                else if (result == MessageDecoderResult.NEED_DATA)
                {
                    return(false);
                }
                else if (result == MessageDecoderResult.NOT_OK)
                {
                    throw new ProtocolDecoderException("Message decoder returned NOT_OK.");
                }
                else
                {
                    throw new Exception("Unexpected decode result (see your decode()): " + result);
                }
            }
示例#2
0
        /// <inheritdoc/>
        protected override bool DoDecode(IoSession session, IoBuffer input, IProtocolDecoderOutput output)
        {
            State state = GetState(session);

            if (state.currentDecoder == null)
            {
                IMessageDecoder[] decoders = state.decoders;
                int undecodables           = 0;

                for (int i = decoders.Length - 1; i >= 0; i--)
                {
                    IMessageDecoder decoder = decoders[i];
                    int             limit   = input.Limit;
                    int             pos     = input.Position;

                    MessageDecoderResult result;

                    try
                    {
                        result = decoder.Decodable(session, input);
                    }
                    finally
                    {
                        input.Position = pos;
                        input.Limit    = limit;
                    }

                    if (result == MessageDecoderResult.OK)
                    {
                        state.currentDecoder = decoder;
                        break;
                    }
                    else if (result == MessageDecoderResult.NotOK)
                    {
                        undecodables++;
                    }
                    else if (result != MessageDecoderResult.NeedData)
                    {
                        throw new InvalidOperationException("Unexpected decode result (see your decodable()): " + result);
                    }
                }

                if (undecodables == decoders.Length)
                {
                    // Throw an exception if all decoders cannot decode data.
                    String dump = input.GetHexDump();
                    input.Position = input.Limit; // Skip data

                    //seem to be a bug not remove session buffer
                    //add code to remove session buffer.
                    RemoveSessionBuffer(session);

                    ProtocolDecoderException e = new ProtocolDecoderException("No appropriate message decoder: " + dump);
                    e.Hexdump = dump;
                    throw e;
                }

                if (state.currentDecoder == null)
                {
                    // Decoder is not determined yet (i.e. we need more data)
                    return(false);
                }
            }

            try
            {
                MessageDecoderResult result = state.currentDecoder.Decode(session, input, output);
                if (result == MessageDecoderResult.OK)
                {
                    state.currentDecoder = null;
                    return(true);
                }
                else if (result == MessageDecoderResult.NeedData)
                {
                    return(false);
                }
                else if (result == MessageDecoderResult.NotOK)
                {
                    state.currentDecoder = null;
                    throw new ProtocolDecoderException("Message decoder returned NOT_OK.");
                }
                else
                {
                    state.currentDecoder = null;
                    throw new InvalidOperationException("Unexpected decode result (see your decode()): " + result);
                }
            }
            catch (Exception)
            {
                state.currentDecoder = null;
                throw;
            }
        }