Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZ/LZOutWindow.cpp, revision 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>