Author: trustin
Date: Mon Dec 10 02:26:44 2007
New Revision: 602842

URL: http://svn.apache.org/viewvc?rev=602842&view=rev
Log:
Reimplemented DecodingStateProtocolDecoder not to complain when a state slices 
the received buffer.

Modified:
    
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateProtocolDecoder.java

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateProtocolDecoder.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateProtocolDecoder.java?rev=602842&r1=602841&r2=602842&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateProtocolDecoder.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateProtocolDecoder.java
 Mon Dec 10 02:26:44 2007
@@ -19,18 +19,22 @@
  */
 package org.apache.mina.filter.codec.statemachine;
 
+import java.util.Queue;
+
 import org.apache.mina.common.IoBuffer;
 import org.apache.mina.common.IoSession;
-import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
+import org.apache.mina.filter.codec.ProtocolDecoder;
 import org.apache.mina.filter.codec.ProtocolDecoderOutput;
+import org.apache.mina.util.CircularQueue;
 
 /**
  * 
  * @author The Apache MINA Project ([EMAIL PROTECTED])
  * @version $Rev$, $Date$
  */
-public class DecodingStateProtocolDecoder extends CumulativeProtocolDecoder {
+public class DecodingStateProtocolDecoder implements ProtocolDecoder {
     private final DecodingState state;
+    private final Queue<IoBuffer> undecodedBuffers = new 
CircularQueue<IoBuffer>();
 
     public DecodingStateProtocolDecoder(DecodingState stateMachine) {
         if (stateMachine == null) {
@@ -39,19 +43,28 @@
         this.state = stateMachine;
     }
     
-    @Override
-    protected boolean doDecode(IoSession session, IoBuffer in,
-            ProtocolDecoderOutput out) throws Exception {
-        state.decode(in, out);
-        return !in.hasRemaining();
+    public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput 
out)
+            throws Exception {
+        undecodedBuffers.offer(in);
+        for (;;) {
+            IoBuffer b = undecodedBuffers.peek();
+            if (b == null) {
+                break;
+            }
+
+            state.decode(b, out);
+            if (b.hasRemaining()) {
+                return;
+            } else {
+                undecodedBuffers.poll();
+            }
+        }
     }
 
-    @Override
     public void finishDecode(IoSession session, ProtocolDecoderOutput out)
             throws Exception {
         state.finishDecode(out);
     }
 
-    @Override
     public void dispose(IoSession session) throws Exception {}
 }


Reply via email to