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
47
48
49 public ProtobufVarint32LengthFieldPrepender() {
50 super();
51 }
52
53 @Override
54 protected Object encode(ChannelHandlerContext ctx, Channel channel,
55 Object msg) throws Exception {
56 if (!(msg instanceof ChannelBuffer)) {
57 return msg;
58 }
59
60 ChannelBuffer body = (ChannelBuffer) msg;
61 int length = body.readableBytes();
62 ChannelBuffer header =
63 channel.getConfig().getBufferFactory().getBuffer(
64 body.order(),
65 CodedOutputStream.computeRawVarint32Size(length));
66 CodedOutputStream codedOutputStream = CodedOutputStream
67 .newInstance(new ChannelBufferOutputStream(header));
68 codedOutputStream.writeRawVarint32(length);
69 codedOutputStream.flush();
70 return wrappedBuffer(header, body);
71 }
72
73 }