2323import java .nio .ByteBuffer ;
2424
2525
26- public class LinkedBufferInput implements Input {
26+ public class LinkedBufferInput extends AbstractInput { // FIXME #MN
2727 private LinkedList <ByteBuffer > link ;
2828
2929 private int writable ;
@@ -49,17 +49,19 @@ public int read(byte[] b, int off, int len) throws EOFException {
4949 return 0 ;
5050 }
5151 int olen = len ;
52- while (true ) {
52+ while (true ) {
5353 ByteBuffer bb = link .peekFirst ();
54- if (len < bb .remaining ()) {
54+ if (len < bb .remaining ()) {
5555 bb .get (b , off , len );
56+ incrReadByteCount (len );
5657 return olen ;
5758 }
5859 int rem = bb .remaining ();
5960 bb .get (b , off , rem );
61+ incrReadByteCount (rem );
6062 len -= rem ;
6163 off += rem ;
62- if (!removeFirstLink (bb )) {
64+ if (!removeFirstLink (bb )) {
6365 break ;
6466 }
6567 }
@@ -68,26 +70,27 @@ public int read(byte[] b, int off, int len) throws EOFException {
6870
6971 public boolean tryRefer (BufferReferer ref , int len ) throws IOException {
7072 ByteBuffer bb = link .peekFirst ();
71- if (bb == null ) {
73+ if (bb == null ) {
7274 throw new EndOfBufferException ();
73- } else if (bb .remaining () < len ) {
75+ } else if (bb .remaining () < len ) {
7476 return false ;
7577 }
7678 boolean success = false ;
7779 int pos = bb .position ();
7880 int lim = bb .limit ();
7981 try {
80- bb .limit (pos + len );
82+ bb .limit (pos + len );
8183 ref .refer (bb , true );
84+ this .incrReadByteCount (len );
8285 success = true ;
8386 } finally {
8487 bb .limit (lim );
85- if (success ) {
86- bb .position (pos + len );
88+ if (success ) {
89+ bb .position (pos + len );
8790 } else {
8891 bb .position (pos );
8992 }
90- if (bb .remaining () == 0 ) {
93+ if (bb .remaining () == 0 ) {
9194 removeFirstLink (bb );
9295 }
9396 }
@@ -96,10 +99,11 @@ public boolean tryRefer(BufferReferer ref, int len) throws IOException {
9699
97100 public byte readByte () throws EOFException {
98101 ByteBuffer bb = link .peekFirst ();
99- if (bb == null || bb .remaining () == 0 ) {
102+ if (bb == null || bb .remaining () == 0 ) {
100103 throw new EndOfBufferException ();
101104 }
102105 byte result = bb .get ();
106+ incrReadOneByteCount ();
103107 if (bb .remaining () == 0 ) {
104108 removeFirstLink (bb );
105109 }
@@ -146,8 +150,8 @@ private boolean removeFirstLink(ByteBuffer first) {
146150
147151 private void requireMore (int n ) throws EOFException {
148152 int off = 0 ;
149- for (ByteBuffer bb : link ) {
150- if (n <= bb .remaining ()) {
153+ for (ByteBuffer bb : link ) {
154+ if (n <= bb .remaining ()) {
151155 int pos = bb .position ();
152156 bb .get (tmpBuffer , off , n );
153157 bb .position (pos );
@@ -170,9 +174,11 @@ private ByteBuffer require(int n) throws EOFException {
170174 }
171175 if (n <= bb .remaining ()) {
172176 nextAdvance = n ;
177+ incrReadByteCount (n );
173178 return bb ;
174179 } else {
175180 requireMore (n );
181+ incrReadByteCount (n );
176182 nextAdvance = n ;
177183 return tmpByteBuffer ;
178184 }
0 commit comments