// ConcurrentBufferOutputStream.java -- write bytes to blocking queue
// Copyright (c)2007 Christopher League <league@contrapunctus.net>
// This is free software, but it comes with ABSOLUTELY NO WARRANTY.
// GNU Lesser General Public License 2.1 or Common Public License 1.0
package net.contrapunctus.lzma;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.concurrent.ArrayBlockingQueue;
class ConcurrentBufferOutputStream extends OutputStream
{
protected ArrayBlockingQueue<byte[]> q;
static final int BUFSIZE = 16384;
static final int QUEUESIZE = 4096;
private static final PrintStream dbg = System.err;
private static final boolean DEBUG;
static
{
String ds = null;
try
{
ds = System.getProperty("DEBUG_ConcurrentBuffer");
}
catch (final SecurityException e)
{
}
DEBUG = ds != null;
}
private ConcurrentBufferOutputStream(ArrayBlockingQueue<byte[]> q)
{
if (DEBUG)
{
dbg.printf("%s >> %s%n", this, q);
}
this.q = q;
}
static OutputStream create(ArrayBlockingQueue<byte[]> q)
{
OutputStream out = new ConcurrentBufferOutputStream(q);
out = new BufferedOutputStream(out, BUFSIZE);
return out;
}
static ArrayBlockingQueue<byte[]> newQueue()
{
return new ArrayBlockingQueue<byte[]>(QUEUESIZE);
}
protected void guarded_put(byte[] a) throws IOException
{
try
{
q.put(a);
}
catch (final InterruptedException exn)
{
throw new InterruptedIOException(exn.getMessage());
}
}
public void write(int i) throws IOException
{
final byte b[] = new byte[1];
b[0] = (byte) (i & 0xff);
guarded_put(b);
}
public void write(byte[] b, int off, int len) throws IOException
{
final byte[] a = new byte[len];
System.arraycopy(b, off, a, 0, len);
guarded_put(a);
}
public void close() throws IOException
{
if (DEBUG)
{
dbg.printf("%s closed%n", this);
}
final byte b[] = new byte[0]; // sentinel
guarded_put(b);
}
}