annotate src/win32/7zip/7z/CPP/7zip/Common/OutBuffer.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
rlm@1 1 // OutByte.cpp
rlm@1 2
rlm@1 3 #include "StdAfx.h"
rlm@1 4
rlm@1 5 #include "OutBuffer.h"
rlm@1 6
rlm@1 7 extern "C"
rlm@1 8 {
rlm@1 9 #include "../../../C/Alloc.h"
rlm@1 10 }
rlm@1 11
rlm@1 12 bool COutBuffer::Create(UInt32 bufferSize)
rlm@1 13 {
rlm@1 14 const UInt32 kMinBlockSize = 1;
rlm@1 15 if (bufferSize < kMinBlockSize)
rlm@1 16 bufferSize = kMinBlockSize;
rlm@1 17 if (_buffer != 0 && _bufferSize == bufferSize)
rlm@1 18 return true;
rlm@1 19 Free();
rlm@1 20 _bufferSize = bufferSize;
rlm@1 21 _buffer = (Byte *)::MidAlloc(bufferSize);
rlm@1 22 return (_buffer != 0);
rlm@1 23 }
rlm@1 24
rlm@1 25 void COutBuffer::Free()
rlm@1 26 {
rlm@1 27 ::MidFree(_buffer);
rlm@1 28 _buffer = 0;
rlm@1 29 }
rlm@1 30
rlm@1 31 void COutBuffer::SetStream(ISequentialOutStream *stream)
rlm@1 32 {
rlm@1 33 _stream = stream;
rlm@1 34 }
rlm@1 35
rlm@1 36 void COutBuffer::Init()
rlm@1 37 {
rlm@1 38 _streamPos = 0;
rlm@1 39 _limitPos = _bufferSize;
rlm@1 40 _pos = 0;
rlm@1 41 _processedSize = 0;
rlm@1 42 _overDict = false;
rlm@1 43 #ifdef _NO_EXCEPTIONS
rlm@1 44 ErrorCode = S_OK;
rlm@1 45 #endif
rlm@1 46 }
rlm@1 47
rlm@1 48 UInt64 COutBuffer::GetProcessedSize() const
rlm@1 49 {
rlm@1 50 UInt64 res = _processedSize + _pos - _streamPos;
rlm@1 51 if (_streamPos > _pos)
rlm@1 52 res += _bufferSize;
rlm@1 53 return res;
rlm@1 54 }
rlm@1 55
rlm@1 56
rlm@1 57 HRESULT COutBuffer::FlushPart()
rlm@1 58 {
rlm@1 59 // _streamPos < _bufferSize
rlm@1 60 UInt32 size = (_streamPos >= _pos) ? (_bufferSize - _streamPos) : (_pos - _streamPos);
rlm@1 61 HRESULT result = S_OK;
rlm@1 62 #ifdef _NO_EXCEPTIONS
rlm@1 63 result = ErrorCode;
rlm@1 64 #endif
rlm@1 65 if (_buffer2 != 0)
rlm@1 66 {
rlm@1 67 memmove(_buffer2, _buffer + _streamPos, size);
rlm@1 68 _buffer2 += size;
rlm@1 69 }
rlm@1 70
rlm@1 71 if (_stream != 0
rlm@1 72 #ifdef _NO_EXCEPTIONS
rlm@1 73 && (ErrorCode == S_OK)
rlm@1 74 #endif
rlm@1 75 )
rlm@1 76 {
rlm@1 77 UInt32 processedSize = 0;
rlm@1 78 result = _stream->Write(_buffer + _streamPos, size, &processedSize);
rlm@1 79 size = processedSize;
rlm@1 80 }
rlm@1 81 _streamPos += size;
rlm@1 82 if (_streamPos == _bufferSize)
rlm@1 83 _streamPos = 0;
rlm@1 84 if (_pos == _bufferSize)
rlm@1 85 {
rlm@1 86 _overDict = true;
rlm@1 87 _pos = 0;
rlm@1 88 }
rlm@1 89 _limitPos = (_streamPos > _pos) ? _streamPos : _bufferSize;
rlm@1 90 _processedSize += size;
rlm@1 91 return result;
rlm@1 92 }
rlm@1 93
rlm@1 94 HRESULT COutBuffer::Flush()
rlm@1 95 {
rlm@1 96 #ifdef _NO_EXCEPTIONS
rlm@1 97 if (ErrorCode != S_OK)
rlm@1 98 return ErrorCode;
rlm@1 99 #endif
rlm@1 100
rlm@1 101 while(_streamPos != _pos)
rlm@1 102 {
rlm@1 103 HRESULT result = FlushPart();
rlm@1 104 if (result != S_OK)
rlm@1 105 return result;
rlm@1 106 }
rlm@1 107 return S_OK;
rlm@1 108 }
rlm@1 109
rlm@1 110 void COutBuffer::FlushWithCheck()
rlm@1 111 {
rlm@1 112 HRESULT result = Flush();
rlm@1 113 #ifdef _NO_EXCEPTIONS
rlm@1 114 ErrorCode = result;
rlm@1 115 #else
rlm@1 116 if (result != S_OK)
rlm@1 117 throw COutBufferException(result);
rlm@1 118 #endif
rlm@1 119 }