| OLD | NEW |
| (Empty) |
| 1 // LzOutWindow.cs | |
| 2 | |
| 3 namespace SevenZip.Compression.LZ | |
| 4 { | |
| 5 public class OutWindow | |
| 6 { | |
| 7 byte[] _buffer = null; | |
| 8 uint _pos; | |
| 9 uint _windowSize = 0; | |
| 10 uint _streamPos; | |
| 11 System.IO.Stream _stream; | |
| 12 | |
| 13 public uint TrainSize = 0; | |
| 14 | |
| 15 public void Create(uint windowSize) | |
| 16 { | |
| 17 if (_windowSize != windowSize) | |
| 18 { | |
| 19 // System.GC.Collect(); | |
| 20 _buffer = new byte[windowSize]; | |
| 21 } | |
| 22 _windowSize = windowSize; | |
| 23 _pos = 0; | |
| 24 _streamPos = 0; | |
| 25 } | |
| 26 | |
| 27 public void Init(System.IO.Stream stream, bool solid) | |
| 28 { | |
| 29 ReleaseStream(); | |
| 30 _stream = stream; | |
| 31 if (!solid) | |
| 32 { | |
| 33 _streamPos = 0; | |
| 34 _pos = 0; | |
| 35 TrainSize = 0; | |
| 36 } | |
| 37 } | |
| 38 | |
| 39 public bool Train(System.IO.Stream stream) | |
| 40 { | |
| 41 long len = stream.Length; | |
| 42 uint size = (len < _windowSize) ? (uint)len : _windowSiz
e; | |
| 43 TrainSize = size; | |
| 44 stream.Position = len - size; | |
| 45 _streamPos = _pos = 0; | |
| 46 while (size > 0) | |
| 47 { | |
| 48 uint curSize = _windowSize - _pos; | |
| 49 if (size < curSize) | |
| 50 curSize = size; | |
| 51 int numReadBytes = stream.Read(_buffer, (int)_po
s, (int)curSize); | |
| 52 if (numReadBytes == 0) | |
| 53 return false; | |
| 54 size -= (uint)numReadBytes; | |
| 55 _pos += (uint)numReadBytes; | |
| 56 _streamPos += (uint)numReadBytes; | |
| 57 if (_pos == _windowSize) | |
| 58 _streamPos = _pos = 0; | |
| 59 } | |
| 60 return true; | |
| 61 } | |
| 62 | |
| 63 public void ReleaseStream() | |
| 64 { | |
| 65 Flush(); | |
| 66 _stream = null; | |
| 67 } | |
| 68 | |
| 69 public void Flush() | |
| 70 { | |
| 71 uint size = _pos - _streamPos; | |
| 72 if (size == 0) | |
| 73 return; | |
| 74 _stream.Write(_buffer, (int)_streamPos, (int)size); | |
| 75 if (_pos >= _windowSize) | |
| 76 _pos = 0; | |
| 77 _streamPos = _pos; | |
| 78 } | |
| 79 | |
| 80 public void CopyBlock(uint distance, uint len) | |
| 81 { | |
| 82 uint pos = _pos - distance - 1; | |
| 83 if (pos >= _windowSize) | |
| 84 pos += _windowSize; | |
| 85 for (; len > 0; len--) | |
| 86 { | |
| 87 if (pos >= _windowSize) | |
| 88 pos = 0; | |
| 89 _buffer[_pos++] = _buffer[pos++]; | |
| 90 if (_pos >= _windowSize) | |
| 91 Flush(); | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 public void PutByte(byte b) | |
| 96 { | |
| 97 _buffer[_pos++] = b; | |
| 98 if (_pos >= _windowSize) | |
| 99 Flush(); | |
| 100 } | |
| 101 | |
| 102 public byte GetByte(uint distance) | |
| 103 { | |
| 104 uint pos = _pos - distance - 1; | |
| 105 if (pos >= _windowSize) | |
| 106 pos += _windowSize; | |
| 107 return _buffer[pos]; | |
| 108 } | |
| 109 } | |
| 110 } | |
| OLD | NEW |