diff --git a/include/BinaryReader.hpp b/include/BinaryReader.hpp index 5810351..a549359 100644 --- a/include/BinaryReader.hpp +++ b/include/BinaryReader.hpp @@ -18,6 +18,7 @@ #include "Stream.hpp" #include +#include namespace zelda { @@ -64,6 +65,12 @@ public: */ std::string filepath() const; + bool readBit(); + Int8 readByte(); + Uint8 readUByte(); + Int8* readBytes(Int64 length); + Uint8* readUBytes(Int64 length); + /*! \brief Reads a Int16 and swaps to proper endianness depending on platform * and Stream settings, and advances the current position * @@ -163,7 +170,9 @@ public: */ std::string readString(); + void setProgressCallback(std::function cb); protected: + void loadData(); /*! \brief Overload of isOpenForWriting in Stream * * \return false @@ -180,6 +189,9 @@ protected: */ void writeBytes(Int8*, Int64); std::string m_filepath; //!< Path to the target file + Uint32 m_currentLength; + FILE* m_file; + std::function m_progressCallback; }; } } diff --git a/src/BinaryReader.cpp b/src/BinaryReader.cpp index 6b08300..cc9a18e 100644 --- a/src/BinaryReader.cpp +++ b/src/BinaryReader.cpp @@ -49,43 +49,46 @@ BinaryReader::BinaryReader(const std::string& filename) : m_filepath(filename) { Stream::setAutoResizing(false); - FILE* in; - Uint32 length; - in = fopen(filename.c_str(), "rb"); +} - if (!in) - throw error::FileNotFoundException(filename); +bool BinaryReader::readBit() +{ + if (!m_data) + loadData(); - fseek(in, 0, SEEK_END); - length = ftell(in); - fseek(in, 0, SEEK_SET); -#ifdef HW_RVL - m_data = (Uint8*)memalign(32, length); -#else - m_data = new Uint8[length]; -#endif + return Stream::readBit(); +} - Uint32 done = 0; - Uint32 blocksize = BLOCKSZ; - do - { - if (blocksize > length - done) - blocksize = length - done; +Int8 BinaryReader::readByte() +{ + if (!m_data) + loadData(); - Int32 ret = fread(m_data + done, 1, blocksize, in); + return Stream::readByte(); +} - if (ret < 0) - throw error::IOException("BinaryReader::BinaryReader -> reading data from disk"); - else if (ret == 0) - break; +Uint8 BinaryReader::readUByte() +{ + if (!m_data) + loadData(); - done += blocksize; - } while (done < length); + return Stream::readUByte(); +} - fclose(in); - m_length = length; - m_position = 0; - m_bitPosition = 0; +Int8* BinaryReader::readBytes(Int64 length) +{ + if (!m_data) + loadData(); + + return Stream::readBytes(length); +} + +Uint8* BinaryReader::readUBytes(Int64 length) +{ + if (!m_data) + loadData(); + + return Stream::readUBytes(length); } void BinaryReader::writeByte(Int8) @@ -100,6 +103,9 @@ void BinaryReader::writeBytes(Int8*, Int64) Int16 BinaryReader::readInt16() { + if (!m_data) + loadData(); + if (m_bitPosition > 0) { m_bitPosition = 0; @@ -118,6 +124,9 @@ Int16 BinaryReader::readInt16() Uint16 BinaryReader::readUInt16() { + if (!m_data) + loadData(); + if (m_bitPosition > 0) { m_bitPosition = 0; @@ -136,6 +145,9 @@ Uint16 BinaryReader::readUInt16() Int32 BinaryReader::readInt32() { + if (!m_data) + loadData(); + if (m_bitPosition > 0) { m_bitPosition = 0; @@ -153,6 +165,9 @@ Int32 BinaryReader::readInt32() Uint32 BinaryReader::readUInt32() { + if (!m_data) + loadData(); + if (m_bitPosition > 0) { m_bitPosition = 0; @@ -171,6 +186,9 @@ Uint32 BinaryReader::readUInt32() Int64 BinaryReader::readInt64() { + if (!m_data) + loadData(); + if (m_bitPosition > 0) { m_bitPosition = 0; @@ -189,6 +207,9 @@ Int64 BinaryReader::readInt64() Uint64 BinaryReader::readUInt64() { + if (!m_data) + loadData(); + if (m_bitPosition > 0) { m_bitPosition = 0; @@ -206,6 +227,9 @@ Uint64 BinaryReader::readUInt64() float BinaryReader::readFloat() { + if (!m_data) + loadData(); + if (m_bitPosition > 0) { m_bitPosition = 0; @@ -224,6 +248,9 @@ float BinaryReader::readFloat() double BinaryReader::readDouble() { + if (!m_data) + loadData(); + if (m_bitPosition > 0) { m_bitPosition = 0; @@ -243,6 +270,9 @@ double BinaryReader::readDouble() bool BinaryReader::readBool() { + if (!m_data) + loadData(); + if (m_bitPosition > 0) { m_bitPosition = 0; @@ -258,6 +288,8 @@ bool BinaryReader::readBool() std::string BinaryReader::readUnicode() { + if (!m_data) + loadData(); std::string ret; std::vector tmp; @@ -288,6 +320,56 @@ std::string BinaryReader::readString() return ret; } +void BinaryReader::setProgressCallback(std::function cb) +{ + m_progressCallback = cb; +} + +void BinaryReader::loadData() +{ + FILE* in; + Uint32 length; + in = fopen(m_filepath.c_str(), "rb"); + + if (!in) + throw error::FileNotFoundException(m_filepath); + + fseek(in, 0, SEEK_END); + length = ftell(in); + fseek(in, 0, SEEK_SET); +#ifdef HW_RVL + m_data = (Uint8*)memalign(32, length); +#else + m_data = new Uint8[length]; +#endif + + Uint32 done = 0; + Uint32 blocksize = BLOCKSZ; + do + { + if (blocksize > length - done) + blocksize = length - done; + + Int32 ret = fread(m_data + done, 1, blocksize, in); + + if (ret < 0) + throw error::IOException("BinaryReader::BinaryReader -> reading data from disk"); + else if (ret == 0) + break; + + done += ret; + + if (m_progressCallback) + m_progressCallback((int)((float)(done* 100.f)/length)); + + } while (done < length); + + fclose(in); + m_length = length; + m_position = 0; + m_bitPosition = 0; +} + bool BinaryReader::isOpenForWriting() { return false; diff --git a/src/Stream.cpp b/src/Stream.cpp index c420e4e..8b5a2e6 100644 --- a/src/Stream.cpp +++ b/src/Stream.cpp @@ -28,7 +28,7 @@ namespace zelda namespace io { -const Uint32 Stream::BLOCKSZ = 512; +const Uint32 Stream::BLOCKSZ = (32*1024); Stream::Stream() : m_bitPosition(0),