1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.filter.codec.statemachine;
21
22 import org.apache.mina.common.IoBuffer;
23 import org.apache.mina.filter.codec.ProtocolDecoderException;
24 import org.apache.mina.filter.codec.ProtocolDecoderOutput;
25
26
27
28
29
30
31
32
33
34
35 public abstract class ConsumeToEndOfSessionDecodingState implements DecodingState {
36
37 private IoBuffer buffer;
38 private final int maxLength;
39
40 public ConsumeToEndOfSessionDecodingState(int maxLength) {
41 this.maxLength = maxLength;
42 }
43
44 public DecodingState decode(IoBuffer in, ProtocolDecoderOutput out)
45 throws Exception {
46 if (buffer == null) {
47 buffer = IoBuffer.allocate(256).setAutoExpand(true);
48 }
49
50 if (buffer.position() + in.remaining() > maxLength) {
51 throw new ProtocolDecoderException("Received data exceeds " + maxLength + " byte(s).");
52 }
53 buffer.put(in);
54 return this;
55 }
56
57 public DecodingState finishDecode(ProtocolDecoderOutput out)
58 throws Exception {
59 try {
60 buffer.flip();
61 return finishDecode(buffer, out);
62 } finally {
63 buffer = null;
64 }
65 }
66
67 protected abstract DecodingState finishDecode(IoBuffer readData,
68 ProtocolDecoderOutput out) throws Exception;
69 }