1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.common.file;
21
22 import io.netty.buffer.ByteBuf;
23 import io.netty.buffer.Unpooled;
24 import org.waarp.common.utility.WaarpNettyUtil;
25
26
27
28
29 public class DataBlock {
30 private static final int EOR = 128;
31
32 private static final int EOF = 64;
33
34 private static final int ERROR = 32;
35
36 private static final int RESTART = 16;
37
38
39
40
41 private int descriptor;
42
43
44
45
46 private int byteCount = -1;
47
48
49
50
51 private int[] markers;
52
53
54
55
56 private byte[] block;
57 private ByteBuf blockBuf;
58 private int offsetBuf;
59
60
61
62
63 private boolean isEOF;
64
65
66
67
68 private boolean isEOR;
69
70
71
72
73 private boolean isERROR;
74
75
76
77
78 private boolean isRESTART;
79
80
81
82
83 public DataBlock() {
84
85 }
86
87
88
89
90
91
92 @Deprecated
93 public final ByteBuf getBlock() {
94 if (blockBuf == null) {
95 blockBuf = Unpooled.wrappedBuffer(block);
96 offsetBuf = 0;
97 }
98 return blockBuf;
99 }
100
101
102
103
104 public final byte[] getByteBlock() {
105 return block;
106 }
107
108
109
110
111 public final int getOffset() {
112 return offsetBuf;
113 }
114
115
116
117
118
119
120 public final void addOffset(final int offset) {
121 offsetBuf += offset;
122 }
123
124
125
126
127
128
129 public final void setBlock(final ByteBuf block) {
130 if (isRESTART) {
131 this.block = null;
132 markers = new int[6];
133 for (int i = 0; i < 6; i++) {
134 markers[i] = block.readByte();
135 }
136 byteCount = 6;
137 return;
138 }
139 byteCount = block.readableBytes();
140 this.block = new byte[byteCount];
141 offsetBuf = 0;
142 if (blockBuf != null) {
143 WaarpNettyUtil.release(blockBuf);
144 blockBuf = null;
145 }
146 block.readBytes(this.block);
147 WaarpNettyUtil.release(block);
148 }
149
150
151
152
153
154
155 public final void setBlock(final byte[] block) {
156 setBlock(block, block != null? block.length : 0);
157 }
158
159
160
161
162
163
164
165 public final void setBlock(final byte[] block, final int size) {
166 if (isRESTART) {
167 this.block = null;
168 markers = new int[6];
169 if (block == null) {
170 for (int i = 0; i < 6; i++) {
171 markers[i] = 0;
172 }
173 } else {
174 for (int i = 0; i < 6; i++) {
175 markers[i] = block[i];
176 }
177 }
178 byteCount = 6;
179 return;
180 }
181 this.block = block;
182 if (this.block == null) {
183 byteCount = 0;
184 } else {
185 byteCount = size;
186 }
187 if (blockBuf != null) {
188 WaarpNettyUtil.release(blockBuf);
189 blockBuf = null;
190 }
191 offsetBuf = 0;
192 }
193
194
195
196
197 public final int getByteCount() {
198 return byteCount - offsetBuf;
199 }
200
201
202
203
204 public final void setByteCount(final int byteCount) {
205 this.byteCount = byteCount;
206 }
207
208
209
210
211
212 public final void setByteCount(final byte upper, final byte lower) {
213 byteCount = upper << 8 | (lower & 0xFF);
214 }
215
216
217
218
219 public final byte getByteCountUpper() {
220 return (byte) (byteCount >> 8 & 0xFF);
221 }
222
223
224
225
226 public final byte getByteCountLower() {
227 return (byte) (byteCount & 0xFF);
228 }
229
230
231
232
233 public final byte getDescriptor() {
234 return (byte) (descriptor & 0xFF);
235 }
236
237
238
239
240 public final void setDescriptor(final int descriptor) {
241 this.descriptor = descriptor & 0xFF;
242 isEOF = (this.descriptor & EOF) != 0;
243 isEOR = (this.descriptor & EOR) != 0;
244 isERROR = (this.descriptor & ERROR) != 0;
245 isRESTART = (this.descriptor & RESTART) != 0;
246 }
247
248
249
250
251 public final boolean isEOF() {
252 return isEOF;
253 }
254
255
256
257
258 public final void setEOF(final boolean isEOF) {
259 this.isEOF = isEOF;
260 descriptor |= EOF;
261 }
262
263
264
265
266 public final boolean isEOR() {
267 return isEOR;
268 }
269
270
271
272
273 public final void setEOR(final boolean isEOR) {
274 this.isEOR = isEOR;
275 descriptor |= EOR;
276 }
277
278
279
280
281 public final boolean isERROR() {
282 return isERROR;
283 }
284
285
286
287
288 public final void setERROR(final boolean isERROR) {
289 this.isERROR = isERROR;
290 descriptor |= ERROR;
291 }
292
293
294
295
296 public final boolean isRESTART() {
297 return isRESTART;
298 }
299
300
301
302
303 public final void setRESTART(final boolean isRESTART) {
304 this.isRESTART = isRESTART;
305 descriptor |= RESTART;
306 }
307
308
309
310
311 public final int[] getMarkers() {
312 return markers;
313 }
314
315
316
317
318 public final byte[] getByteMarkers() {
319 final byte[] bmarkers = new byte[6];
320 if (markers == null) {
321 for (int i = 0; i < 6; i++) {
322 bmarkers[i] = 0;
323 }
324 } else {
325 for (int i = 0; i < 6; i++) {
326 bmarkers[i] = (byte) (markers[i] & 0xFF);
327 }
328 }
329 return bmarkers;
330 }
331
332
333
334
335
336
337 public final void setMarkers(final int[] markers) {
338 this.markers = markers;
339 byteCount = 6;
340 }
341
342
343
344
345 public final void clear() {
346 if (blockBuf != null) {
347 WaarpNettyUtil.release(blockBuf);
348 blockBuf = null;
349 }
350 block = null;
351 byteCount = -1;
352 descriptor = 0;
353 isEOF = false;
354 isEOR = false;
355 isERROR = false;
356 isRESTART = false;
357 markers = null;
358 }
359
360
361
362
363
364
365 public final boolean isCleared() {
366 return byteCount == -1;
367 }
368
369 @Override
370 public String toString() {
371 return "DataBlock Length:" + byteCount + " isEof:" + isEOF + " isEOR:" +
372 isEOR + " isERROR:" + isERROR + " isRESTART:" + isRESTART;
373 }
374
375
376
377
378
379
380
381
382
383
384 public static String toBinaryString(final byte[] bytes,
385 final boolean cutted) {
386 final StringBuilder buffer = new StringBuilder();
387 boolean first = true;
388 for (final byte b : bytes) {
389 if (cutted) {
390 if (first) {
391 first = false;
392 } else {
393 buffer.append(' ');
394 }
395 }
396 String bin = Integer.toBinaryString(b & 0xFF);
397 bin = bin.substring(0, Math.min(bin.length(), 8));
398 for (int j = 0; j < 8 - bin.length(); j++) {
399 buffer.append('0');
400 }
401 buffer.append(bin);
402 }
403 return buffer.toString();
404 }
405 }