Mercurial > vba-linux
view src/win32/7zip/7z/CPP/7zip/Common/InBuffer.h @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
line wrap: on
line source
1 // InBuffer.h3 #ifndef __INBUFFER_H4 #define __INBUFFER_H6 #include "../IStream.h"7 #include "../../Common/MyCom.h"8 #include "../../Common/MyException.h"10 #ifndef _NO_EXCEPTIONS11 struct CInBufferException: public CSystemException12 {13 CInBufferException(HRESULT errorCode): CSystemException(errorCode) {}14 };15 #endif17 class CInBuffer18 {19 Byte *_buffer;20 Byte *_bufferLimit;21 Byte *_bufferBase;22 CMyComPtr<ISequentialInStream> _stream;23 UInt64 _processedSize;24 UInt32 _bufferSize;25 bool _wasFinished;27 bool ReadBlock();28 Byte ReadBlock2();30 public:31 #ifdef _NO_EXCEPTIONS32 HRESULT ErrorCode;33 #endif35 CInBuffer();36 ~CInBuffer() { Free(); }38 bool Create(UInt32 bufferSize);39 void Free();41 void SetStream(ISequentialInStream *stream);42 void Init();43 void ReleaseStream() { _stream.Release(); }45 bool ReadByte(Byte &b)46 {47 if (_buffer >= _bufferLimit)48 if (!ReadBlock())49 return false;50 b = *_buffer++;51 return true;52 }53 Byte ReadByte()54 {55 if (_buffer >= _bufferLimit)56 return ReadBlock2();57 return *_buffer++;58 }59 UInt32 ReadBytes(Byte *buf, UInt32 size)60 {61 if ((UInt32)(_bufferLimit - _buffer) >= size)62 {63 for (UInt32 i = 0; i < size; i++)64 buf[i] = _buffer[i];65 _buffer += size;66 return size;67 }68 for (UInt32 i = 0; i < size; i++)69 {70 if (_buffer >= _bufferLimit)71 if (!ReadBlock())72 return i;73 buf[i] = *_buffer++;74 }75 return size;76 }77 UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); }78 bool WasFinished() const { return _wasFinished; }79 };81 #endif