| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // LZ.OutWindow
- package SevenZip.Compression.LZ;
- import java.io.IOException;
- public class OutWindow
- {
- byte[] _buffer;
- int _pos;
- int _windowSize = 0;
- int _streamPos;
- java.io.OutputStream _stream;
-
- public void Create(int windowSize)
- {
- if (_buffer == null || _windowSize != windowSize)
- _buffer = new byte[windowSize];
- _windowSize = windowSize;
- _pos = 0;
- _streamPos = 0;
- }
-
- public void SetStream(java.io.OutputStream stream) throws IOException
- {
- ReleaseStream();
- _stream = stream;
- }
-
- public void ReleaseStream() throws IOException
- {
- Flush();
- _stream = null;
- }
-
- public void Init(boolean solid)
- {
- if (!solid)
- {
- _streamPos = 0;
- _pos = 0;
- }
- }
-
- public void Flush() throws IOException
- {
- int size = _pos - _streamPos;
- if (size == 0)
- return;
- _stream.write(_buffer, _streamPos, size);
- if (_pos >= _windowSize)
- _pos = 0;
- _streamPos = _pos;
- }
-
- public void CopyBlock(int distance, int len) throws IOException
- {
- int pos = _pos - distance - 1;
- if (pos < 0)
- pos += _windowSize;
- for (; len != 0; len--)
- {
- if (pos >= _windowSize)
- pos = 0;
- _buffer[_pos++] = _buffer[pos++];
- if (_pos >= _windowSize)
- Flush();
- }
- }
-
- public void PutByte(byte b) throws IOException
- {
- _buffer[_pos++] = b;
- if (_pos >= _windowSize)
- Flush();
- }
-
- public byte GetByte(int distance)
- {
- int pos = _pos - distance - 1;
- if (pos < 0)
- pos += _windowSize;
- return _buffer[pos];
- }
- }
|