CachedDataStream.cpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "CachedDataStream.h"
  2. USING_NS_BF;
  3. CachedDataStream::CachedDataStream(DataStream* stream)
  4. {
  5. mStream = stream;
  6. mDataPtr = mChunk;
  7. mDataEnd = mChunk + CHUNK_SIZE;
  8. }
  9. CachedDataStream::~CachedDataStream()
  10. {
  11. Flush();
  12. }
  13. void CachedDataStream::Flush()
  14. {
  15. int cachedBytes = (int)(mDataPtr - mChunk);
  16. if (cachedBytes > 0)
  17. {
  18. mStream->Write(mChunk, cachedBytes);
  19. mDataPtr = mChunk;
  20. }
  21. }
  22. bool CachedDataStream::Eof()
  23. {
  24. Flush();
  25. return mStream->Eof();
  26. }
  27. int CachedDataStream::GetSize()
  28. {
  29. Flush();
  30. return mStream->GetSize();
  31. }
  32. int CachedDataStream::Read(void* ptr, int size)
  33. {
  34. Flush();
  35. return mStream->Read(ptr, size);
  36. }
  37. int CachedDataStream::Write(void* ptr, int size)
  38. {
  39. while (size > 0)
  40. {
  41. int cacheLeft = (int)(mDataEnd - mDataPtr);
  42. if (cacheLeft == 0)
  43. {
  44. Flush();
  45. continue;
  46. }
  47. int writeBytes = std::min(cacheLeft, size);
  48. memcpy(mDataPtr, ptr, writeBytes);
  49. ptr = (uint8*)ptr + writeBytes;
  50. size -= writeBytes;
  51. mDataPtr += writeBytes;
  52. }
  53. return size;
  54. }
  55. int CachedDataStream::GetPos()
  56. {
  57. return mStream->GetPos() + (int)(mDataPtr - mChunk);
  58. }
  59. void CachedDataStream::Seek(int size)
  60. {
  61. Flush();
  62. mStream->Seek(size);
  63. }
  64. void CachedDataStream::SetPos(int pos)
  65. {
  66. Flush();
  67. mStream->SetPos(pos);
  68. }