1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package openr66.protocol.localhandler.packet;
22
23 import openr66.protocol.exception.OpenR66ProtocolPacketException;
24
25 import org.jboss.netty.buffer.ChannelBuffer;
26 import org.jboss.netty.buffer.ChannelBuffers;
27
28
29
30
31
32
33
34
35
36
37
38 public abstract class AbstractLocalPacket {
39 protected ChannelBuffer header;
40
41 protected ChannelBuffer middle;
42
43 protected ChannelBuffer end;
44
45 public AbstractLocalPacket(ChannelBuffer header, ChannelBuffer middle,
46 ChannelBuffer end) {
47 this.header = header;
48 this.middle = middle;
49 this.end = end;
50 }
51
52 public AbstractLocalPacket() {
53 header = null;
54 middle = null;
55 end = null;
56 }
57
58
59
60
61 public abstract void createHeader() throws OpenR66ProtocolPacketException;
62
63
64
65
66 public abstract void createMiddle() throws OpenR66ProtocolPacketException;
67
68
69
70
71 public abstract void createEnd() throws OpenR66ProtocolPacketException;
72
73
74
75
76 public abstract byte getType();
77
78 @Override
79 public abstract String toString();
80
81
82
83
84
85 public ChannelBuffer getLocalPacket() throws OpenR66ProtocolPacketException {
86 final ChannelBuffer buf = ChannelBuffers.buffer(4 * 3 + 1);
87
88 if (header == null) {
89 createHeader();
90 }
91 final ChannelBuffer newHeader = header != null? header
92 : ChannelBuffers.EMPTY_BUFFER;
93 final int headerLength = 4 * 2 + 1 + newHeader.readableBytes();
94 if (middle == null) {
95 createMiddle();
96 }
97 final ChannelBuffer newMiddle = middle != null? middle
98 : ChannelBuffers.EMPTY_BUFFER;
99 final int middleLength = newMiddle.readableBytes();
100 if (end == null) {
101 createEnd();
102 }
103 final ChannelBuffer newEnd = end != null? end
104 : ChannelBuffers.EMPTY_BUFFER;
105 final int endLength = newEnd.readableBytes();
106 buf.writeInt(headerLength);
107 buf.writeInt(middleLength);
108 buf.writeInt(endLength);
109 buf.writeByte(getType());
110 final ChannelBuffer channelBuffer = ChannelBuffers.wrappedBuffer(
111 buf, newHeader, newMiddle, newEnd);
112 return channelBuffer;
113 }
114 }