michael@0: // StreamObjects.cpp michael@0: michael@0: #include "StdAfx.h" michael@0: michael@0: #include "StreamObjects.h" michael@0: #include "../../Common/Defs.h" michael@0: michael@0: michael@0: STDMETHODIMP CSequentialInStreamImp::Read(void *data, UInt32 size, UInt32 *processedSize) michael@0: { michael@0: UInt32 numBytesToRead = (UInt32)(MyMin(_pos + size, _size) - _pos); michael@0: memmove(data, _dataPointer + _pos, numBytesToRead); michael@0: _pos += numBytesToRead; michael@0: if(processedSize != NULL) michael@0: *processedSize = numBytesToRead; michael@0: return S_OK; michael@0: } michael@0: michael@0: michael@0: void CWriteBuffer::Write(const void *data, size_t size) michael@0: { michael@0: size_t newCapacity = _size + size; michael@0: _buffer.EnsureCapacity(newCapacity); michael@0: memmove(_buffer + _size, data, size); michael@0: _size += size; michael@0: } michael@0: michael@0: STDMETHODIMP CSequentialOutStreamImp::Write(const void *data, UInt32 size, UInt32 *processedSize) michael@0: { michael@0: _writeBuffer.Write(data, size); michael@0: if(processedSize != NULL) michael@0: *processedSize = size; michael@0: return S_OK; michael@0: } michael@0: michael@0: STDMETHODIMP CSequentialOutStreamImp2::Write(const void *data, UInt32 size, UInt32 *processedSize) michael@0: { michael@0: UInt32 newSize = size; michael@0: if (_pos + size > _size) michael@0: newSize = (UInt32)(_size - _pos); michael@0: memmove(_buffer + _pos, data, newSize); michael@0: if(processedSize != NULL) michael@0: *processedSize = newSize; michael@0: _pos += newSize; michael@0: if (newSize != size) michael@0: return E_FAIL; michael@0: return S_OK; michael@0: } michael@0: michael@0: STDMETHODIMP CSequentialInStreamSizeCount::Read(void *data, UInt32 size, UInt32 *processedSize) michael@0: { michael@0: UInt32 realProcessedSize; michael@0: HRESULT result = _stream->Read(data, size, &realProcessedSize); michael@0: _size += realProcessedSize; michael@0: if (processedSize != 0) michael@0: *processedSize = realProcessedSize; michael@0: return result; michael@0: } michael@0: michael@0: STDMETHODIMP CSequentialInStreamRollback::Read(void *data, UInt32 size, UInt32 *processedSize) michael@0: { michael@0: if (_currentPos != _currentSize) michael@0: { michael@0: size_t curSize = _currentSize - _currentPos; michael@0: if (size > curSize) michael@0: size = (UInt32)curSize; michael@0: memmove(data, _buffer + _currentPos, size); michael@0: _currentPos += size; michael@0: if (processedSize != 0) michael@0: *processedSize = size; michael@0: return S_OK; michael@0: } michael@0: UInt32 realProcessedSize; michael@0: if (size > _bufferSize) michael@0: size = (UInt32)_bufferSize; michael@0: HRESULT result = _stream->Read(_buffer, size, &realProcessedSize); michael@0: memmove(data, _buffer, realProcessedSize); michael@0: _size += realProcessedSize; michael@0: _currentSize = realProcessedSize; michael@0: _currentPos = realProcessedSize; michael@0: if (processedSize != 0) michael@0: *processedSize = realProcessedSize; michael@0: return result; michael@0: } michael@0: michael@0: HRESULT CSequentialInStreamRollback::Rollback(size_t rollbackSize) michael@0: { michael@0: if (rollbackSize > _currentPos) michael@0: return E_INVALIDARG; michael@0: _currentPos -= rollbackSize; michael@0: return S_OK; michael@0: } michael@0: michael@0: STDMETHODIMP CSequentialOutStreamSizeCount::Write(const void *data, UInt32 size, UInt32 *processedSize) michael@0: { michael@0: UInt32 realProcessedSize; michael@0: HRESULT result = _stream->Write(data, size, &realProcessedSize); michael@0: _size += realProcessedSize; michael@0: if (processedSize != 0) michael@0: *processedSize = realProcessedSize; michael@0: return result; michael@0: }