CFileInputStream.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include "StdInc.h"
  2. #include "CFileInputStream.h"
  3. #include "CFileInfo.h"
  4. CFileInputStream::CFileInputStream(const boost::filesystem::path & file, si64 start, si64 size)
  5. : dataStart{start},
  6. dataSize{size},
  7. fileStream{file, std::ios::in | std::ios::binary}
  8. {
  9. if (fileStream.fail())
  10. throw std::runtime_error("File " + file.string() + " isn't available.");
  11. if (dataSize == 0)
  12. {
  13. fileStream.seekg(0, std::ios::end);
  14. dataSize = tell();
  15. }
  16. fileStream.seekg(dataStart, std::ios::beg);
  17. }
  18. CFileInputStream::CFileInputStream(const CFileInfo & file, si64 start, si64 size)
  19. : CFileInputStream{file.getName(), start, size} {}
  20. si64 CFileInputStream::read(ui8 * data, si64 size)
  21. {
  22. si64 origin = tell();
  23. si64 toRead = std::min(dataSize - origin, size);
  24. fileStream.read(reinterpret_cast<char *>(data), toRead);
  25. return fileStream.gcount();
  26. }
  27. si64 CFileInputStream::seek(si64 position)
  28. {
  29. fileStream.seekg(dataStart + std::min(position, dataSize));
  30. return tell();
  31. }
  32. si64 CFileInputStream::tell()
  33. {
  34. return static_cast<si64>(fileStream.tellg()) - dataStart;
  35. }
  36. si64 CFileInputStream::skip(si64 delta)
  37. {
  38. si64 origin = tell();
  39. //ensure that we're not seeking past the end of real data
  40. si64 toSeek = std::min(dataSize - origin, delta);
  41. fileStream.seekg(toSeek, std::ios::cur);
  42. return tell() - origin;
  43. }
  44. si64 CFileInputStream::getSize()
  45. {
  46. return dataSize;
  47. }