package com.koushikdutta.async;
import junit.framework.Assert;
import com.koushikdutta.async.callback.DataCallback;
public class DataEmitterReader implements com.koushikdutta.async.callback.DataCallback {
DataCallback mPendingRead;
int mPendingReadLength;
ByteBufferList mPendingData = new ByteBufferList();
public void read(int count, DataCallback callback) {
Assert.assertNull(mPendingRead);
mPendingReadLength = count;
mPendingRead = callback;
mPendingData = new ByteBufferList();
}
private boolean handlePendingData(DataEmitter emitter) {
if (mPendingReadLength > mPendingData.remaining())
return false;
DataCallback pendingRead = mPendingRead;
mPendingRead = null;
pendingRead.onDataAvailable(emitter, mPendingData);
return true;
}
public DataEmitterReader() {
}
@Override
public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
// if we're registered for data, we must be waiting for a read
assert(mPendingRead != null);
do {
int need = Math.min(bb.remaining(), mPendingReadLength - mPendingData.remaining());
mPendingData.add(bb.get(need));
}
while (handlePendingData(emitter) && mPendingRead != null);
}
}