annotate 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
rev   line source
rlm@1 1 // InBuffer.h
rlm@1 2
rlm@1 3 #ifndef __INBUFFER_H
rlm@1 4 #define __INBUFFER_H
rlm@1 5
rlm@1 6 #include "../IStream.h"
rlm@1 7 #include "../../Common/MyCom.h"
rlm@1 8 #include "../../Common/MyException.h"
rlm@1 9
rlm@1 10 #ifndef _NO_EXCEPTIONS
rlm@1 11 struct CInBufferException: public CSystemException
rlm@1 12 {
rlm@1 13 CInBufferException(HRESULT errorCode): CSystemException(errorCode) {}
rlm@1 14 };
rlm@1 15 #endif
rlm@1 16
rlm@1 17 class CInBuffer
rlm@1 18 {
rlm@1 19 Byte *_buffer;
rlm@1 20 Byte *_bufferLimit;
rlm@1 21 Byte *_bufferBase;
rlm@1 22 CMyComPtr<ISequentialInStream> _stream;
rlm@1 23 UInt64 _processedSize;
rlm@1 24 UInt32 _bufferSize;
rlm@1 25 bool _wasFinished;
rlm@1 26
rlm@1 27 bool ReadBlock();
rlm@1 28 Byte ReadBlock2();
rlm@1 29
rlm@1 30 public:
rlm@1 31 #ifdef _NO_EXCEPTIONS
rlm@1 32 HRESULT ErrorCode;
rlm@1 33 #endif
rlm@1 34
rlm@1 35 CInBuffer();
rlm@1 36 ~CInBuffer() { Free(); }
rlm@1 37
rlm@1 38 bool Create(UInt32 bufferSize);
rlm@1 39 void Free();
rlm@1 40
rlm@1 41 void SetStream(ISequentialInStream *stream);
rlm@1 42 void Init();
rlm@1 43 void ReleaseStream() { _stream.Release(); }
rlm@1 44
rlm@1 45 bool ReadByte(Byte &b)
rlm@1 46 {
rlm@1 47 if (_buffer >= _bufferLimit)
rlm@1 48 if (!ReadBlock())
rlm@1 49 return false;
rlm@1 50 b = *_buffer++;
rlm@1 51 return true;
rlm@1 52 }
rlm@1 53 Byte ReadByte()
rlm@1 54 {
rlm@1 55 if (_buffer >= _bufferLimit)
rlm@1 56 return ReadBlock2();
rlm@1 57 return *_buffer++;
rlm@1 58 }
rlm@1 59 UInt32 ReadBytes(Byte *buf, UInt32 size)
rlm@1 60 {
rlm@1 61 if ((UInt32)(_bufferLimit - _buffer) >= size)
rlm@1 62 {
rlm@1 63 for (UInt32 i = 0; i < size; i++)
rlm@1 64 buf[i] = _buffer[i];
rlm@1 65 _buffer += size;
rlm@1 66 return size;
rlm@1 67 }
rlm@1 68 for (UInt32 i = 0; i < size; i++)
rlm@1 69 {
rlm@1 70 if (_buffer >= _bufferLimit)
rlm@1 71 if (!ReadBlock())
rlm@1 72 return i;
rlm@1 73 buf[i] = *_buffer++;
rlm@1 74 }
rlm@1 75 return size;
rlm@1 76 }
rlm@1 77 UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); }
rlm@1 78 bool WasFinished() const { return _wasFinished; }
rlm@1 79 };
rlm@1 80
rlm@1 81 #endif