5 #include "../../../C/Alloc.h"
\r
7 #include "OutBuffer.h"
\r
9 bool COutBuffer::Create(UInt32 bufferSize)
\r
11 const UInt32 kMinBlockSize = 1;
\r
12 if (bufferSize < kMinBlockSize)
\r
13 bufferSize = kMinBlockSize;
\r
14 if (_buffer != 0 && _bufferSize == bufferSize)
\r
17 _bufferSize = bufferSize;
\r
18 _buffer = (Byte *)::MidAlloc(bufferSize);
\r
19 return (_buffer != 0);
\r
22 void COutBuffer::Free()
\r
28 void COutBuffer::SetStream(ISequentialOutStream *stream)
\r
33 void COutBuffer::Init()
\r
36 _limitPos = _bufferSize;
\r
40 #ifdef _NO_EXCEPTIONS
\r
45 UInt64 COutBuffer::GetProcessedSize() const
\r
47 UInt64 res = _processedSize + _pos - _streamPos;
\r
48 if (_streamPos > _pos)
\r
54 HRESULT COutBuffer::FlushPart()
\r
56 // _streamPos < _bufferSize
\r
57 UInt32 size = (_streamPos >= _pos) ? (_bufferSize - _streamPos) : (_pos - _streamPos);
\r
58 HRESULT result = S_OK;
\r
59 #ifdef _NO_EXCEPTIONS
\r
64 memmove(_buffer2, _buffer + _streamPos, size);
\r
69 #ifdef _NO_EXCEPTIONS
\r
70 && (ErrorCode == S_OK)
\r
74 UInt32 processedSize = 0;
\r
75 result = _stream->Write(_buffer + _streamPos, size, &processedSize);
\r
76 size = processedSize;
\r
79 if (_streamPos == _bufferSize)
\r
81 if (_pos == _bufferSize)
\r
86 _limitPos = (_streamPos > _pos) ? _streamPos : _bufferSize;
\r
87 _processedSize += size;
\r
91 HRESULT COutBuffer::Flush()
\r
93 #ifdef _NO_EXCEPTIONS
\r
94 if (ErrorCode != S_OK)
\r
98 while(_streamPos != _pos)
\r
100 HRESULT result = FlushPart();
\r
101 if (result != S_OK)
\r
107 void COutBuffer::FlushWithCheck()
\r
109 HRESULT result = Flush();
\r
110 #ifdef _NO_EXCEPTIONS
\r
111 ErrorCode = result;
\r
113 if (result != S_OK)
\r
114 throw COutBufferException(result);
\r