InBuffer.cpp 1.5 KB

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