Home | History | Annotate | Download | only in LZ
      1 // LZ.OutWindow
      2 
      3 package SevenZip.Compression.LZ;
      4 
      5 import java.io.IOException;
      6 
      7 public class OutWindow
      8 {
      9 	byte[] _buffer;
     10 	int _pos;
     11 	int _windowSize = 0;
     12 	int _streamPos;
     13 	java.io.OutputStream _stream;
     14 
     15 	public void Create(int windowSize)
     16 	{
     17 		if (_buffer == null || _windowSize != windowSize)
     18 			_buffer = new byte[windowSize];
     19 		_windowSize = windowSize;
     20 		_pos = 0;
     21 		_streamPos = 0;
     22 	}
     23 
     24 	public void SetStream(java.io.OutputStream stream) throws IOException
     25 	{
     26 		ReleaseStream();
     27 		_stream = stream;
     28 	}
     29 
     30 	public void ReleaseStream() throws IOException
     31 	{
     32 		Flush();
     33 		_stream = null;
     34 	}
     35 
     36 	public void Init(boolean solid)
     37 	{
     38 		if (!solid)
     39 		{
     40 			_streamPos = 0;
     41 			_pos = 0;
     42 		}
     43 	}
     44 
     45 	public void Flush() throws IOException
     46 	{
     47 		int size = _pos - _streamPos;
     48 		if (size == 0)
     49 			return;
     50 		_stream.write(_buffer, _streamPos, size);
     51 		if (_pos >= _windowSize)
     52 			_pos = 0;
     53 		_streamPos = _pos;
     54 	}
     55 
     56 	public void CopyBlock(int distance, int len) throws IOException
     57 	{
     58 		int pos = _pos - distance - 1;
     59 		if (pos < 0)
     60 			pos += _windowSize;
     61 		for (; len != 0; len--)
     62 		{
     63 			if (pos >= _windowSize)
     64 				pos = 0;
     65 			_buffer[_pos++] = _buffer[pos++];
     66 			if (_pos >= _windowSize)
     67 				Flush();
     68 		}
     69 	}
     70 
     71 	public void PutByte(byte b) throws IOException
     72 	{
     73 		_buffer[_pos++] = b;
     74 		if (_pos >= _windowSize)
     75 			Flush();
     76 	}
     77 
     78 	public byte GetByte(int distance)
     79 	{
     80 		int pos = _pos - distance - 1;
     81 		if (pos < 0)
     82 			pos += _windowSize;
     83 		return _buffer[pos];
     84 	}
     85 }
     86