misc/libphysfs/lzma/CPP/7zip/Common/InBuffer.cpp
changeset 13881 99b265e0d1d0
parent 13880 5f819b90d479
child 13882 b172a5d40eee
equal deleted inserted replaced
13880:5f819b90d479 13881:99b265e0d1d0
     1 // InBuffer.cpp
       
     2 
       
     3 #include "StdAfx.h"
       
     4 
       
     5 #include "InBuffer.h"
       
     6 
       
     7 extern "C"
       
     8 {
       
     9   #include "../../../C/Alloc.h"
       
    10 }
       
    11 
       
    12 CInBuffer::CInBuffer(): 
       
    13   _buffer(0), 
       
    14   _bufferLimit(0), 
       
    15   _bufferBase(0), 
       
    16   _stream(0),
       
    17   _bufferSize(0)
       
    18 {}
       
    19 
       
    20 bool CInBuffer::Create(UInt32 bufferSize)
       
    21 {
       
    22   const UInt32 kMinBlockSize = 1;
       
    23   if (bufferSize < kMinBlockSize)
       
    24     bufferSize = kMinBlockSize;
       
    25   if (_bufferBase != 0 && _bufferSize == bufferSize)
       
    26     return true;
       
    27   Free();
       
    28   _bufferSize = bufferSize;
       
    29   _bufferBase = (Byte *)::MidAlloc(bufferSize);
       
    30   return (_bufferBase != 0);
       
    31 }
       
    32 
       
    33 void CInBuffer::Free()
       
    34 {
       
    35   ::MidFree(_bufferBase);
       
    36   _bufferBase = 0;
       
    37 }
       
    38 
       
    39 void CInBuffer::SetStream(ISequentialInStream *stream)
       
    40 {
       
    41   _stream = stream;
       
    42 }
       
    43 
       
    44 void CInBuffer::Init()
       
    45 {
       
    46   _processedSize = 0;
       
    47   _buffer = _bufferBase;
       
    48   _bufferLimit = _buffer;
       
    49   _wasFinished = false;
       
    50   #ifdef _NO_EXCEPTIONS
       
    51   ErrorCode = S_OK;
       
    52   #endif
       
    53 }
       
    54 
       
    55 bool CInBuffer::ReadBlock()
       
    56 {
       
    57   #ifdef _NO_EXCEPTIONS
       
    58   if (ErrorCode != S_OK)
       
    59     return false;
       
    60   #endif
       
    61   if (_wasFinished)
       
    62     return false;
       
    63   _processedSize += (_buffer - _bufferBase);
       
    64   UInt32 numProcessedBytes;
       
    65   HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes);
       
    66   #ifdef _NO_EXCEPTIONS
       
    67   ErrorCode = result;
       
    68   #else
       
    69   if (result != S_OK)
       
    70     throw CInBufferException(result);
       
    71   #endif
       
    72   _buffer = _bufferBase;
       
    73   _bufferLimit = _buffer + numProcessedBytes;
       
    74   _wasFinished = (numProcessedBytes == 0);
       
    75   return (!_wasFinished);
       
    76 }
       
    77 
       
    78 Byte CInBuffer::ReadBlock2()
       
    79 {
       
    80   if(!ReadBlock())
       
    81     return 0xFF;
       
    82   return *_buffer++;
       
    83 }