Package muduo.rpc

Source Code of muduo.rpc.RpcDecoder

package muduo.rpc;

import java.nio.charset.Charset;
import java.util.zip.Adler32;

import muduo.rpc.proto.RpcProto.RpcMessage;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.oneone.OneToOneDecoder;
import org.jboss.netty.channel.ChannelHandler.Sharable;

@Sharable
public class RpcDecoder extends OneToOneDecoder {

    @Override
    public Object decode(ChannelHandlerContext ctx, Channel channel, Object obj)
            throws Exception {
        if (obj instanceof ChannelBuffer) {
            ChannelBuffer buffer = (ChannelBuffer) obj;
            if (buffer.readableBytes() > 8) {
                String version = buffer.toString(buffer.readerIndex(), 4, Charset.defaultCharset());
                if (version.equals("RPC0")) {
                    Adler32 adler32 = new Adler32();
                    adler32.update(buffer.array(),
                            buffer.arrayOffset() + buffer.readerIndex(),
                            buffer.readableBytes() - 4);
                    buffer.markReaderIndex();
                    buffer.readerIndex(buffer.writerIndex() - 4);
                    int checksum = buffer.readInt();
                    if (checksum == (int)adler32.getValue()) {
                        buffer.resetReaderIndex();
                        RpcMessage message = RpcMessage.newBuilder().mergeFrom(
                                buffer.array(),
                                buffer.arrayOffset() + buffer.readerIndex() + 4,
                                buffer.readableBytes() - 8).build();
                        return message;
                    }
                }
            }
        }
        return obj;
    }
}
TOP

Related Classes of muduo.rpc.RpcDecoder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.