CFileInputStream.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * CFileInputStream.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "CFileInputStream.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. CFileInputStream::CFileInputStream(const boost::filesystem::path & file, si64 start, si64 size)
  14. : dataStart{start},
  15. dataSize{size},
  16. fileStream{file, std::ios::in | std::ios::binary}
  17. {
  18. if (fileStream.fail())
  19. throw std::runtime_error("File " + file.string() + " isn't available.");
  20. if (dataSize == 0)
  21. {
  22. fileStream.seekg(0, std::ios::end);
  23. dataSize = tell();
  24. }
  25. fileStream.seekg(dataStart, std::ios::beg);
  26. }
  27. si64 CFileInputStream::read(ui8 * data, si64 size)
  28. {
  29. si64 origin = tell();
  30. si64 toRead = std::min(dataSize - origin, size);
  31. fileStream.read(reinterpret_cast<char *>(data), toRead);
  32. return fileStream.gcount();
  33. }
  34. si64 CFileInputStream::seek(si64 position)
  35. {
  36. fileStream.seekg(dataStart + std::min(position, dataSize));
  37. return tell();
  38. }
  39. si64 CFileInputStream::tell()
  40. {
  41. return static_cast<si64>(fileStream.tellg()) - dataStart;
  42. }
  43. si64 CFileInputStream::skip(si64 delta)
  44. {
  45. si64 origin = tell();
  46. //ensure that we're not seeking past the end of real data
  47. si64 toSeek = std::min(dataSize - origin, delta);
  48. fileStream.seekg(toSeek, std::ios::cur);
  49. return tell() - origin;
  50. }
  51. si64 CFileInputStream::getSize()
  52. {
  53. return dataSize;
  54. }
  55. VCMI_LIB_NAMESPACE_END