1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.common.support;
21
22 import java.nio.ByteOrder;
23 import java.nio.CharBuffer;
24 import java.nio.DoubleBuffer;
25 import java.nio.FloatBuffer;
26 import java.nio.IntBuffer;
27 import java.nio.LongBuffer;
28 import java.nio.ShortBuffer;
29
30 import org.apache.mina.common.ByteBuffer;
31 import org.apache.mina.common.ByteBufferAllocator;
32
33
34
35
36
37
38
39
40
41
42
43
44 public abstract class BaseByteBuffer extends ByteBuffer {
45 private boolean autoExpand;
46
47
48
49
50
51 private int mark = -1;
52
53 protected BaseByteBuffer() {
54 }
55
56 public boolean isDirect() {
57 return buf().isDirect();
58 }
59
60 public boolean isReadOnly() {
61 return buf().isReadOnly();
62 }
63
64 public int capacity() {
65 return buf().capacity();
66 }
67
68 public ByteBuffer capacity(int newCapacity) {
69 if (newCapacity > capacity()) {
70
71 int pos = position();
72 int limit = limit();
73 ByteOrder bo = order();
74
75 capacity0(newCapacity);
76 buf().limit(limit);
77 if (mark >= 0) {
78 buf().position(mark);
79 buf().mark();
80 }
81 buf().position(pos);
82 buf().order(bo);
83 }
84
85 return this;
86 }
87
88
89
90
91
92 protected abstract void capacity0(int newCapacity);
93
94 public boolean isAutoExpand() {
95 return autoExpand;
96 }
97
98 public ByteBuffer setAutoExpand(boolean autoExpand) {
99 this.autoExpand = autoExpand;
100 return this;
101 }
102
103 public ByteBuffer expand(int pos, int expectedRemaining) {
104 int end = pos + expectedRemaining;
105 if (end > capacity()) {
106
107 capacity(end);
108 }
109
110 if (end > limit()) {
111
112 buf().limit(end);
113 }
114 return this;
115 }
116
117 public int position() {
118 return buf().position();
119 }
120
121 public ByteBuffer position(int newPosition) {
122 autoExpand(newPosition, 0);
123 buf().position(newPosition);
124 if (mark > newPosition) {
125 mark = -1;
126 }
127 return this;
128 }
129
130 public int limit() {
131 return buf().limit();
132 }
133
134 public ByteBuffer limit(int newLimit) {
135 autoExpand(newLimit, 0);
136 buf().limit(newLimit);
137 if (mark > newLimit) {
138 mark = -1;
139 }
140 return this;
141 }
142
143 public ByteBuffer mark() {
144 buf().mark();
145 mark = position();
146 return this;
147 }
148
149 public int markValue() {
150 return mark;
151 }
152
153 public ByteBuffer reset() {
154 buf().reset();
155 return this;
156 }
157
158 public ByteBuffer clear() {
159 buf().clear();
160 mark = -1;
161 return this;
162 }
163
164 public ByteBuffer flip() {
165 buf().flip();
166 mark = -1;
167 return this;
168 }
169
170 public ByteBuffer rewind() {
171 buf().rewind();
172 mark = -1;
173 return this;
174 }
175
176 public byte get() {
177 return buf().get();
178 }
179
180 public ByteBuffer put(byte b) {
181 autoExpand(1);
182 buf().put(b);
183 return this;
184 }
185
186 public byte get(int index) {
187 return buf().get(index);
188 }
189
190 public ByteBuffer put(int index, byte b) {
191 autoExpand(index, 1);
192 buf().put(index, b);
193 return this;
194 }
195
196 public ByteBuffer get(byte[] dst, int offset, int length) {
197 buf().get(dst, offset, length);
198 return this;
199 }
200
201 public ByteBuffer put(java.nio.ByteBuffer src) {
202 autoExpand(src.remaining());
203 buf().put(src);
204 return this;
205 }
206
207 public ByteBuffer put(byte[] src, int offset, int length) {
208 autoExpand(length);
209 buf().put(src, offset, length);
210 return this;
211 }
212
213 public ByteBuffer compact() {
214 buf().compact();
215 mark = -1;
216 return this;
217 }
218
219 public ByteOrder order() {
220 return buf().order();
221 }
222
223 public ByteBuffer order(ByteOrder bo) {
224 buf().order(bo);
225 return this;
226 }
227
228 public char getChar() {
229 return buf().getChar();
230 }
231
232 public ByteBuffer putChar(char value) {
233 autoExpand(2);
234 buf().putChar(value);
235 return this;
236 }
237
238 public char getChar(int index) {
239 return buf().getChar(index);
240 }
241
242 public ByteBuffer putChar(int index, char value) {
243 autoExpand(index, 2);
244 buf().putChar(index, value);
245 return this;
246 }
247
248 public CharBuffer asCharBuffer() {
249 return buf().asCharBuffer();
250 }
251
252 public short getShort() {
253 return buf().getShort();
254 }
255
256 public ByteBuffer putShort(short value) {
257 autoExpand(2);
258 buf().putShort(value);
259 return this;
260 }
261
262 public short getShort(int index) {
263 return buf().getShort(index);
264 }
265
266 public ByteBuffer putShort(int index, short value) {
267 autoExpand(index, 2);
268 buf().putShort(index, value);
269 return this;
270 }
271
272 public ShortBuffer asShortBuffer() {
273 return buf().asShortBuffer();
274 }
275
276 public int getInt() {
277 return buf().getInt();
278 }
279
280 public ByteBuffer putInt(int value) {
281 autoExpand(4);
282 buf().putInt(value);
283 return this;
284 }
285
286 public int getInt(int index) {
287 return buf().getInt(index);
288 }
289
290 public ByteBuffer putInt(int index, int value) {
291 autoExpand(index, 4);
292 buf().putInt(index, value);
293 return this;
294 }
295
296 public IntBuffer asIntBuffer() {
297 return buf().asIntBuffer();
298 }
299
300 public long getLong() {
301 return buf().getLong();
302 }
303
304 public ByteBuffer putLong(long value) {
305 autoExpand(8);
306 buf().putLong(value);
307 return this;
308 }
309
310 public long getLong(int index) {
311 return buf().getLong(index);
312 }
313
314 public ByteBuffer putLong(int index, long value) {
315 autoExpand(index, 8);
316 buf().putLong(index, value);
317 return this;
318 }
319
320 public LongBuffer asLongBuffer() {
321 return buf().asLongBuffer();
322 }
323
324 public float getFloat() {
325 return buf().getFloat();
326 }
327
328 public ByteBuffer putFloat(float value) {
329 autoExpand(4);
330 buf().putFloat(value);
331 return this;
332 }
333
334 public float getFloat(int index) {
335 return buf().getFloat(index);
336 }
337
338 public ByteBuffer putFloat(int index, float value) {
339 autoExpand(index, 4);
340 buf().putFloat(index, value);
341 return this;
342 }
343
344 public FloatBuffer asFloatBuffer() {
345 return buf().asFloatBuffer();
346 }
347
348 public double getDouble() {
349 return buf().getDouble();
350 }
351
352 public ByteBuffer putDouble(double value) {
353 autoExpand(8);
354 buf().putDouble(value);
355 return this;
356 }
357
358 public double getDouble(int index) {
359 return buf().getDouble(index);
360 }
361
362 public ByteBuffer putDouble(int index, double value) {
363 autoExpand(index, 8);
364 buf().putDouble(index, value);
365 return this;
366 }
367
368 public DoubleBuffer asDoubleBuffer() {
369 return buf().asDoubleBuffer();
370 }
371 }