// 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]; | |
} | |
} |