package com.koushikdutta.async; import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.callback.DataCallback; public class BufferedDataEmitter implements DataEmitter, DataCallback { DataEmitter mEmitter; public BufferedDataEmitter(DataEmitter emitter) { mEmitter = emitter; mEmitter.setDataCallback(this); mEmitter.setEndCallback(new CompletedCallback() { @Override public void onCompleted(Exception ex) { mEnded = true; mEndException = ex; if (mBuffers.remaining() == 0 && mEndCallback != null) mEndCallback.onCompleted(ex); } }); } @Override public void close() { mEmitter.close(); } boolean mEnded = false; Exception mEndException; public void onDataAvailable() { if (mDataCallback != null && !mPaused && mBuffers.remaining() > 0) mDataCallback.onDataAvailable(this, mBuffers); if (mEnded && mBuffers.remaining() == 0) mEndCallback.onCompleted(mEndException); } ByteBufferList mBuffers = new ByteBufferList(); DataCallback mDataCallback; @Override public void setDataCallback(DataCallback callback) { mDataCallback = callback; } @Override public DataCallback getDataCallback() { return mDataCallback; } @Override public boolean isChunked() { return false; } @Override public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { bb.get(mBuffers); onDataAvailable(); } private boolean mPaused; @Override public void pause() { mPaused = true; } @Override public void resume() { if (!mPaused) return; mPaused = false; onDataAvailable(); } @Override public boolean isPaused() { return mPaused; } CompletedCallback mEndCallback; @Override public void setEndCallback(CompletedCallback callback) { mEndCallback = callback; } @Override public CompletedCallback getEndCallback() { return mEndCallback; } @Override public AsyncServer getServer() { return mEmitter.getServer(); } }