1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.openr66.protocol.localhandler.packet;
21
22 import io.netty.buffer.ByteBuf;
23 import io.netty.buffer.ByteBufAllocator;
24 import org.waarp.common.utility.WaarpNettyUtil;
25 import org.waarp.common.utility.WaarpStringUtils;
26 import org.waarp.openr66.protocol.localhandler.LocalChannelReference;
27
28
29
30
31
32
33 public class ValidPacket extends AbstractLocalPacket {
34 private final String sheader;
35
36 private String smiddle;
37
38 private final byte send;
39
40
41
42
43
44
45
46
47
48 public static ValidPacket createFromBuffer(final int headerLength,
49 final int middleLength,
50 final int endLength,
51 final ByteBuf buf) {
52 final byte[] bheader = new byte[headerLength - 1];
53 final byte[] bmiddle = new byte[middleLength];
54 final byte bend;
55 if (headerLength - 1 > 0) {
56 buf.readBytes(bheader);
57 }
58 if (middleLength > 0) {
59 buf.readBytes(bmiddle);
60 }
61 bend = buf.readByte();
62 return new ValidPacket(new String(bheader, WaarpStringUtils.UTF8),
63 new String(bmiddle, WaarpStringUtils.UTF8), bend);
64 }
65
66
67
68
69
70
71 public ValidPacket(final String header, final String middle, final byte end) {
72 sheader = header;
73 smiddle = middle;
74 send = end;
75 }
76
77 @Override
78 public final boolean hasGlobalBuffer() {
79 return true;
80 }
81
82 @Override
83 public final synchronized void createAllBuffers(
84 final LocalChannelReference lcr, final int networkHeader) {
85 final byte[] headerBytes =
86 sheader != null? sheader.getBytes(WaarpStringUtils.UTF8) : EMPTY_ARRAY;
87 final int headerSize = headerBytes.length;
88 final byte[] middleBytes =
89 smiddle != null? smiddle.getBytes(WaarpStringUtils.UTF8) : EMPTY_ARRAY;
90 final int middleSize = middleBytes.length;
91 final int endSize = 1;
92 final int globalSize =
93 networkHeader + LOCAL_HEADER_SIZE + headerSize + middleSize + endSize;
94 int offset = networkHeader + LOCAL_HEADER_SIZE;
95 global = ByteBufAllocator.DEFAULT.ioBuffer(globalSize, globalSize);
96 header = WaarpNettyUtil.slice(global, offset, headerSize);
97 header.writeBytes(headerBytes);
98 offset += headerSize;
99 middle = WaarpNettyUtil.slice(global, offset, middleSize);
100 middle.writeBytes(middleBytes);
101 offset += middleSize;
102 end = WaarpNettyUtil.slice(global, offset, endSize);
103 end.writeByte(send);
104 }
105
106 @Override
107 public final String toString() {
108 return "ValidPacket: " + sheader + ':' + smiddle + ':' + send;
109 }
110
111 @Override
112 public final byte getType() {
113 return LocalPacketFactory.VALIDPACKET;
114 }
115
116
117
118
119 public final String getSheader() {
120 return sheader;
121 }
122
123
124
125
126 public final synchronized String getSmiddle() {
127 return smiddle;
128 }
129
130
131
132
133 public final synchronized void setSmiddle(final String smiddle) {
134 this.smiddle = smiddle;
135 middle = null;
136 }
137
138
139
140
141 public final byte getTypeValid() {
142 return send;
143 }
144
145 }