Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZ/LZOutWindow.cpp, revision 1.1.1.1

1.1       misho       1: // LZOutWindow.cpp
                      2: 
                      3: #include "StdAfx.h"
                      4: 
                      5: #include "../../../Common/Alloc.h"
                      6: #include "LZOutWindow.h"
                      7: 
                      8: bool CLZOutWindow::Create(UInt32 windowSize)
                      9: {
                     10:   const UInt32 kMinBlockSize = 1;
                     11:   if (windowSize < kMinBlockSize)
                     12:     windowSize = kMinBlockSize;
                     13:   if (_buffer != 0 && _windowSize == windowSize)
                     14:     return true;
                     15: 
                     16:   // It's here to allow Solid decoding / and calling Create for RAR
                     17:   _pos = 0;
                     18:   _streamPos = 0;
                     19:   
                     20:   Free();
                     21:   _windowSize = windowSize;
                     22:   _buffer = (Byte *)::BigAlloc(windowSize);
                     23:   return (_buffer != 0);
                     24: }
                     25: 
                     26: void CLZOutWindow::Free()
                     27: {
                     28:   ::BigFree(_buffer);
                     29:   _buffer = 0;
                     30: }
                     31: 
                     32: void CLZOutWindow::SetStream(ISequentialOutStream *stream)
                     33: {
                     34:   ReleaseStream();
                     35:   _stream = stream;
                     36:   _stream->AddRef();
                     37: }
                     38: 
                     39: void CLZOutWindow::Init(bool solid)
                     40: {
                     41:   if(!solid)
                     42:   {
                     43:     _streamPos = 0;
                     44:     _pos = 0;
                     45:   }
                     46:   #ifdef _NO_EXCEPTIONS
                     47:   ErrorCode = S_OK;
                     48:   #endif
                     49: }
                     50: 
                     51: void CLZOutWindow::ReleaseStream()
                     52: {
                     53:   if(_stream != 0)
                     54:   {
                     55:     // Flush(); // Test it
                     56:     _stream->Release();
                     57:     _stream = 0;
                     58:   }
                     59: }
                     60: 
                     61: void CLZOutWindow::FlushWithCheck()
                     62: {
                     63:   HRESULT result = Flush();
                     64:   #ifdef _NO_EXCEPTIONS
                     65:   ErrorCode = result;
                     66:   #else
                     67:   if (result != S_OK)
                     68:     throw CLZOutWindowException(result);
                     69:   #endif
                     70: }
                     71: 
                     72: HRESULT CLZOutWindow::Flush()
                     73: {
                     74:   UInt32 size = _pos - _streamPos;
                     75:   if(size == 0)
                     76:     return S_OK;
                     77:   #ifdef _NO_EXCEPTIONS
                     78:   if (ErrorCode != S_OK)
                     79:     return ErrorCode;
                     80:   #endif
                     81: 
                     82:   if(_stream != 0)
                     83:   {
                     84:     UInt32 processedSize;
                     85:     HRESULT result = _stream->Write(_buffer + _streamPos, size, &processedSize);
                     86:     if (result != S_OK)
                     87:       return result;
                     88:     if (size != processedSize)
                     89:       return E_FAIL;
                     90:   }
                     91:   if (_pos >= _windowSize)
                     92:     _pos = 0;
                     93:   _streamPos = _pos;
                     94:   return S_OK;
                     95: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>