// DecoderThread.java -- run LZMA decoder in a separate thread // 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 SevenZip.Compression.LZMA.Decoder; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.util.concurrent.ArrayBlockingQueue; class DecoderThread extends Thread { protected BlockingIntQueue q; protected InputStream in; protected OutputStream out; protected Decoder dec; protected IOException exn; private static final PrintStream dbg = System.err; private static final boolean DEBUG = System.getProperty("DEBUG_LzmaCoders") != null; DecoderThread( InputStream _in ) { q = new BlockingIntQueue( ); in = _in; out = new ConcurrentBufferOutputStream( q ); dec = new Decoder(); exn = null; if(DEBUG) dbg.printf("%s >> %s (%s)%n", this, out, q); } static final int propSize = 5; static final byte[] props = new byte[propSize]; static { // enc.SetEndMarkerMode( true ); // enc.SetDictionarySize( 1 << 20 ); props[0] = 0x5d; props[1] = 0x00; props[2] = 0x00; props[3] = 0x10; props[4] = 0x00; } public void run( ) { try { // int n = in.read( props, 0, propSize ); dec.SetDecoderProperties( props ); if(DEBUG) dbg.printf("%s begins%n", this); dec.Code( in, out, -1 ); if(DEBUG) dbg.printf("%s ends%n", this); in.close( ); //? out.close( ); } catch( IOException _exn ) { exn = _exn; if(DEBUG) dbg.printf("%s exception: %s%n", exn.getMessage()); } } public String toString( ) { return String.format("Dec@%x", hashCode()); } }