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