package com.koushikdutta.async;
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 mPendingRead == null;
mPendingReadLength = count;
mPendingRead = callback;
mPendingData.recycle();
}
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());
bb.get(mPendingData, need);
}
while (handlePendingData(emitter) && mPendingRead != null);
}
}