1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.jboss.netty.handler.codec.protobuf;
17
18 import static org.jboss.netty.buffer.ChannelBuffers.*;
19
20 import org.jboss.netty.buffer.ChannelBuffer;
21 import org.jboss.netty.buffer.ChannelBufferOutputStream;
22 import org.jboss.netty.channel.Channel;
23 import org.jboss.netty.channel.ChannelHandler.Sharable;
24 import org.jboss.netty.channel.ChannelHandlerContext;
25 import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
26
27 import com.google.protobuf.CodedOutputStream;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 @Sharable
44 public class ProtobufVarint32LengthFieldPrepender extends OneToOneEncoder {
45
46 @Override
47 protected Object encode(ChannelHandlerContext ctx, Channel channel,
48 Object msg) throws Exception {
49 if (!(msg instanceof ChannelBuffer)) {
50 return msg;
51 }
52
53 ChannelBuffer body = (ChannelBuffer) msg;
54 int length = body.readableBytes();
55 ChannelBuffer header =
56 channel.getConfig().getBufferFactory().getBuffer(
57 body.order(),
58 CodedOutputStream.computeRawVarint32Size(length));
59 CodedOutputStream codedOutputStream = CodedOutputStream
60 .newInstance(new ChannelBufferOutputStream(header));
61 codedOutputStream.writeRawVarint32(length);
62 codedOutputStream.flush();
63 return wrappedBuffer(header, body);
64 }
65
66 }