CInputStream.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #pragma once
  2. /*
  3. * CInputStream.h, part of VCMI engine
  4. *
  5. * Authors: listed in file AUTHORS in main folder
  6. *
  7. * License: GNU General Public License v2.0 or later
  8. * Full text of license available in license.txt file, in main folder
  9. *
  10. */
  11. /**
  12. * Abstract class which provides method definitions for reading from a stream.
  13. */
  14. class DLL_LINKAGE CInputStream : private boost::noncopyable
  15. {
  16. public:
  17. /**
  18. * D-tor.
  19. */
  20. virtual ~CInputStream() {}
  21. /**
  22. * Reads n bytes from the stream into the data buffer.
  23. *
  24. * @param data A pointer to the destination data array.
  25. * @param size The number of bytes to read.
  26. * @return the number of bytes read actually.
  27. */
  28. virtual si64 read(ui8 * data, si64 size) = 0;
  29. /**
  30. * Seeks the internal read pointer to the specified position.
  31. *
  32. * @param position The read position from the beginning.
  33. * @return the position actually moved to, -1 on error.
  34. */
  35. virtual si64 seek(si64 position) = 0;
  36. /**
  37. * Gets the current read position in the stream.
  38. *
  39. * @return the read position.
  40. */
  41. virtual si64 tell() = 0;
  42. /**
  43. * Skips delta numbers of bytes.
  44. *
  45. * @param delta The count of bytes to skip.
  46. * @return the count of bytes skipped actually.
  47. */
  48. virtual si64 skip(si64 delta) = 0;
  49. /**
  50. * Gets the length in bytes of the stream.
  51. *
  52. * @return the length in bytes of the stream.
  53. */
  54. virtual si64 getSize() = 0;
  55. /**
  56. * @brief for convenience, reads whole stream at once
  57. *
  58. * @return pair, first = raw data, second = size of data
  59. */
  60. std::pair<std::unique_ptr<ui8[]>, si64> readAll()
  61. {
  62. std::unique_ptr<ui8[]> data(new ui8[getSize()]);
  63. seek(0);
  64. auto readSize = read(data.get(), getSize());
  65. assert(readSize == getSize());
  66. UNUSED(readSize);
  67. return std::make_pair(std::move(data), getSize());
  68. }
  69. /**
  70. * @brief calculateCRC32 calculates CRC32 checksum for the whole file
  71. * @return calculated checksum
  72. */
  73. virtual ui32 calculateCRC32()
  74. {
  75. si64 originalPos = tell();
  76. boost::crc_32_type checksum;
  77. auto data = readAll();
  78. checksum.process_bytes(reinterpret_cast<const void *>(data.first.get()), data.second);
  79. seek(originalPos);
  80. return checksum.checksum();
  81. }
  82. };