Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 package org.ros.internal.node.service;
00018
00019 import org.jboss.netty.buffer.ChannelBuffer;
00020 import org.jboss.netty.channel.Channel;
00021 import org.jboss.netty.channel.ChannelHandlerContext;
00022 import org.jboss.netty.handler.codec.replay.ReplayingDecoder;
00023
00029 class ServiceResponseDecoder<ResponseType> extends
00030 ReplayingDecoder<ServiceResponseDecoderState> {
00031
00032 private ServiceServerResponse response;
00033
00034 public ServiceResponseDecoder() {
00035 reset();
00036 }
00037
00038 @SuppressWarnings("fallthrough")
00039 @Override
00040 protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer,
00041 ServiceResponseDecoderState state) throws Exception {
00042 switch (state) {
00043 case ERROR_CODE:
00044 response.setErrorCode(buffer.readByte());
00045 checkpoint(ServiceResponseDecoderState.MESSAGE_LENGTH);
00046 case MESSAGE_LENGTH:
00047 response.setMessageLength(buffer.readInt());
00048 checkpoint(ServiceResponseDecoderState.MESSAGE);
00049 case MESSAGE:
00050 response.setMessage(buffer.readBytes(response.getMessageLength()));
00051 try {
00052 return response;
00053 } finally {
00054 reset();
00055 }
00056 default:
00057 throw new IllegalStateException();
00058 }
00059 }
00060
00061 private void reset() {
00062 checkpoint(ServiceResponseDecoderState.ERROR_CODE);
00063 response = new ServiceServerResponse();
00064 }
00065 }