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 import openr66.protocol.utils.FileUtils;
25
26 import org.jboss.netty.buffer.ChannelBuffer;
27 import org.jboss.netty.buffer.ChannelBuffers;
28
29
30
31
32
33
34
35
36 public class DataPacket extends AbstractLocalPacket {
37 private final int packetRank;
38
39 private final int lengthPacket;
40
41 private final ChannelBuffer data;
42
43 private final ChannelBuffer key;
44
45
46
47
48
49
50
51
52
53 public static DataPacket createFromBuffer(int headerLength,
54 int middleLength, int endLength, ChannelBuffer buf)
55 throws OpenR66ProtocolPacketException {
56 if (headerLength - 1 <= 0) {
57 throw new OpenR66ProtocolPacketException("Not enough data");
58 }
59 if (middleLength <= 0) {
60 throw new OpenR66ProtocolPacketException("Not enough data");
61 }
62 int packetRank = buf.readInt();
63 ChannelBuffer data = buf.readBytes(middleLength);
64 int readerIndex = buf.readerIndex();
65 ChannelBuffer key;
66 if (endLength > 0) {
67 key = buf.slice(readerIndex, endLength);
68 buf.skipBytes(endLength);
69 } else {
70 key = ChannelBuffers.EMPTY_BUFFER;
71 }
72 return new DataPacket(packetRank, data, key);
73 }
74
75
76
77
78
79
80 public DataPacket(int packetRank, ChannelBuffer data, ChannelBuffer key) {
81 this.packetRank = packetRank;
82 this.data = data;
83 this.key = key == null? ChannelBuffers.EMPTY_BUFFER : key;
84 lengthPacket = data.readableBytes();
85 }
86
87
88
89
90
91
92 @Override
93 public void createEnd() throws OpenR66ProtocolPacketException {
94 end = key;
95 }
96
97
98
99
100
101
102
103 @Override
104 public void createHeader() throws OpenR66ProtocolPacketException {
105 header = ChannelBuffers.buffer(4);
106 header.writeInt(packetRank);
107 }
108
109
110
111
112
113
114
115 @Override
116 public void createMiddle() throws OpenR66ProtocolPacketException {
117 middle = data;
118 }
119
120 @Override
121 public byte getType() {
122 return LocalPacketFactory.DATAPACKET;
123 }
124
125
126
127
128
129
130 @Override
131 public String toString() {
132 return "DataPacket: " + packetRank + ":" + lengthPacket;
133 }
134
135
136
137
138 public int getPacketRank() {
139 return packetRank;
140 }
141
142
143
144
145 public int getLengthPacket() {
146 return lengthPacket;
147 }
148
149
150
151
152 public ChannelBuffer getData() {
153 return data;
154 }
155
156
157
158
159 public ChannelBuffer getKey() {
160 return key;
161 }
162
163
164
165
166
167 public boolean isKeyValid() {
168 if (key == null || key == ChannelBuffers.EMPTY_BUFFER) {
169 return true;
170 }
171 ChannelBuffer newbufkey = FileUtils.getHash(data);
172 return ChannelBuffers.equals(key, newbufkey);
173 }
174 }