package com.koushikdutta.async.stream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import com.koushikdutta.async.AsyncServer;
import com.koushikdutta.async.ByteBufferList;
import com.koushikdutta.async.DataSink;
import com.koushikdutta.async.callback.CompletedCallback;
import com.koushikdutta.async.callback.WritableCallback;
public class OutputStreamDataSink implements DataSink {
public OutputStreamDataSink() {
}
@Override
public void end() {
close();
}
public OutputStreamDataSink(OutputStream stream) {
setOutputStream(stream);
}
OutputStream mStream;
public void setOutputStream(OutputStream stream) {
mStream = stream;
}
public OutputStream getOutputStream() {
return mStream;
}
@Override
public void write(ByteBuffer bb) {
try {
mStream.write(bb.array(), bb.arrayOffset() + bb.position(), bb.remaining());
}
catch (IOException e) {
reportClose(e);
}
bb.position(0);
bb.limit(0);
}
@Override
public void write(ByteBufferList bb) {
try {
while (bb.size() > 0) {
ByteBuffer b = bb.remove();
mStream.write(b.array(), b.arrayOffset() + b.position(), b.remaining());
ByteBufferList.reclaim(b);
}
}
catch (IOException e) {
reportClose(e);
}
finally {
bb.recycle();
}
}
WritableCallback mWritable;
@Override
public void setWriteableCallback(WritableCallback handler) {
mWritable = handler;
}
@Override
public WritableCallback getWriteableCallback() {
return mWritable;
}
@Override
public boolean isOpen() {
return closeReported;
}
@Override
public void close() {
try {
if (mStream != null)
mStream.close();
reportClose(null);
}
catch (IOException e) {
reportClose(e);
}
}
boolean closeReported;
public void reportClose(Exception ex) {
if (closeReported)
return;
closeReported = true;
if (mClosedCallback != null)
mClosedCallback.onCompleted(ex);
}
CompletedCallback mClosedCallback;
@Override
public void setClosedCallback(CompletedCallback handler) {
mClosedCallback = handler;
}
@Override
public CompletedCallback getClosedCallback() {
return mClosedCallback;
}
@Override
public AsyncServer getServer() {
return AsyncServer.getDefault();
}
}