OutWindow.java 1.4 KB

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