OLD | NEW |
| (Empty) |
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 } | |
OLD | NEW |