@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
Object msg) throws Exception {
if (!(msg instanceof ChannelBuffer))
return msg;
final ChannelBuffer buffer = (ChannelBuffer) msg;
if (!handshaked) {
final HandshakeMessage message = new HandshakeMessage();
message.read(buffer);
return message;
} else {
if(buffer.readableBytes() == 0)
return new KeepAliveMessage();
final byte opcode = buffer.readByte();
final PeerWireMessage message;
switch (opcode) {
case CancelMessage.MESSAGE_ID:
message = new CancelMessage();
break;