diff --git a/include/BinaryWriter.hpp b/include/BinaryWriter.hpp index 3faa971..8709b9e 100644 --- a/include/BinaryWriter.hpp +++ b/include/BinaryWriter.hpp @@ -12,11 +12,11 @@ // // You should have received a copy of the GNU General Public License // along with libZelda. If not, see -#ifndef __BINARYWRITER_HPP__ -#define __BINARYWRITER_HPP__ - -#include "Stream.hpp" -#include +#ifndef __BINARYWRITER_HPP__ +#define __BINARYWRITER_HPP__ + +#include "Stream.hpp" +#include /*! \class BinaryWriter * \brief A Stream class for writing binary data @@ -25,40 +25,40 @@ * all work is done using a memory buffer, and not written directly to the disk * this allows for fast, flexible code as well as the ability to quickly modify data * \sa Stream - */ -class BinaryWriter : public Stream -{ + */ +class BinaryWriter : public Stream +{ public: /*! \brief This constructor takes an existing buffer to write to. * * \param data The existing buffer * \param length The length of the existing buffer - */ + */ BinaryWriter(const Uint8* data, Uint64 length); /*! \brief This constructor takes an existing Stream to write to. * * \param stream The stream to write data to - */ + */ BinaryWriter(const Stream& stream); /*! \brief This constructor creates an instance from a file on disk. * * \param filename The file to create the stream from - */ + */ BinaryWriter(const std::string& filename); /*! \brief Saves the file to the specified file. * * \param filename If not empty, the filename to save to - */ - void save(const std::string& filename=""); + */ + void save(const std::string& filename=""); /*! \brief Writes an Int16 to the buffer and advances the buffer. * It also swaps the bytes depending on the platform and Stream settings. * * \sa Endian * \param val The value to write to the buffer - */ + */ void writeInt16(Int16 val); /*! \brief Writes an Uint16 to the buffer and advances the buffer. @@ -66,7 +66,7 @@ public: * * \sa Endian * \param val The value to write to the buffer - */ + */ void writeUInt16(Uint16); /*! \brief Writes an Int32 to the buffer and advances the buffer. @@ -74,7 +74,7 @@ public: * * \sa Endian * \param val The value to write to the buffer - */ + */ void writeInt32(Int32); /*! \brief Writes an Uint32 to the buffer and advances the buffer. @@ -82,7 +82,7 @@ public: * * \sa Endian * \param val The value to write to the buffer - */ + */ void writeUInt32(Uint32); /*! \brief Writes an Int64 to the buffer and advances the buffer. @@ -90,7 +90,7 @@ public: * * \sa Endian * \param val The value to write to the buffer - */ + */ void writeInt64(Int64); /*! \brief Writes an Uint64 to the buffer and advances the buffer. @@ -98,7 +98,7 @@ public: * * \sa Endian * \param val The value to write to the buffer - */ + */ void writeUInt64(Uint64); /*! \brief Writes an float to the buffer and advances the buffer. @@ -106,7 +106,7 @@ public: * * \sa Endian * \param val The value to write to the buffer - */ + */ void writeFloat(float); /*! \brief Writes an double to the buffer and advances the buffer. @@ -114,7 +114,7 @@ public: * * \sa Endian * \param val The value to write to the buffer - */ + */ void writeDouble(double); /*! \brief Writes an bool to the buffer and advances the buffer. @@ -122,7 +122,7 @@ public: * * \sa Endian * \param val The value to write to the buffer - */ + */ void writeBool(bool); /*! \brief Writes an unicode string to the buffer and advances the buffer. @@ -130,13 +130,13 @@ public: * * \sa Endian * \param str The string to write to the buffer - */ - void writeUnicode(const std::string& str); + */ + void writeUnicode(const std::string& str); protected: - Int8 readByte(); + Int8 readByte(); Int8* readBytes(Int64); - bool isOpenForReading(); - std::string m_filename; -}; - -#endif + bool isOpenForReading(); + std::string m_filepath; +}; + +#endif diff --git a/include/WiiSave.h b/include/WiiSave.h index 713eef7..14950c9 100644 --- a/include/WiiSave.h +++ b/include/WiiSave.h @@ -18,11 +18,9 @@ public: WiiSave(); virtual ~WiiSave(); - bool saveToFile(const std::string& filepath, Uint8* macAddress, Uint32 ngId, Uint8* ngPriv, Uint8* ngSig, Uint32 ngKeyId); - void addFile(const std::string& filename, WiiFile* file); - WiiFile* getFile(const std::string& filename) const; - std::unordered_map& getFileList(); + WiiFile* file(const std::string& filename) const; + std::unordered_map& fileList(); void setBanner(WiiBanner* banner); WiiBanner* banner() const; diff --git a/src/BinaryWriter.cpp b/src/BinaryWriter.cpp index d6a44bd..7457d81 100644 --- a/src/BinaryWriter.cpp +++ b/src/BinaryWriter.cpp @@ -13,49 +13,49 @@ // You should have received a copy of the GNU General Public License // along with libZelda. If not, see -#include "BinaryWriter.hpp" -#include "IOException.hpp" +#include "BinaryWriter.hpp" +#include "IOException.hpp" #include "FileNotFoundException.hpp" -#include "utility.hpp" -#include "utf8.h" - -#include -#include -#include +#include "utility.hpp" +#include "utf8.h" + +#include +#include +#include #include - -BinaryWriter::BinaryWriter(const Uint8* data, Uint64 length) - : Stream(data, length) -{} - -BinaryWriter::BinaryWriter(const Stream& stream) : - Stream(stream) -{} - -BinaryWriter::BinaryWriter(const std::string& filename) - : m_filename(filename) -{ - m_length = 0x10; + +BinaryWriter::BinaryWriter(const Uint8* data, Uint64 length) + : Stream(data, length) +{} + +BinaryWriter::BinaryWriter(const Stream& stream) : + Stream(stream) +{} + +BinaryWriter::BinaryWriter(const std::string& filename) + : m_filepath(filename) +{ + m_length = 0x10; m_bitPosition = 0; - m_position = 0; - m_data = new Uint8[m_length]; - if (!m_data) - throw IOException("Could not allocate memory!"); - memset(m_data, 0, m_length); -} - -void BinaryWriter::save(const std::string& filename) -{ - if (filename.empty() && m_filename.empty()) - throw Exception("InvalidOperationException: BinaryWriter::Save() -> No file specified, cannot save."); - - if (!filename.empty()) - m_filename = filename; - - FILE* out = fopen(m_filename.c_str(), "wb"); - if (!out) - throw FileNotFoundException(m_filename); + m_position = 0; + m_data = new Uint8[m_length]; + if (!m_data) + throw IOException("Could not allocate memory!"); + memset(m_data, 0, m_length); +} + +void BinaryWriter::save(const std::string& filename) +{ + if (filename.empty() && m_filepath.empty()) + throw Exception("InvalidOperationException: BinaryWriter::Save() -> No file specified, cannot save."); + + if (!filename.empty()) + m_filepath = filename; + + FILE* out = fopen(m_filepath.c_str(), "wb"); + if (!out) + throw FileNotFoundException(m_filepath); Uint32 done = 0; Uint32 blocksize = BLOCKSZ; @@ -73,203 +73,203 @@ void BinaryWriter::save(const std::string& filename) done += blocksize; std::cout << "Wrote " << done << " bytes" << std::endl; - }while (done < m_length); - - fclose(out); -} - -Int8 BinaryWriter::readByte() -{ - throw IOException("Stream not open for reading"); -} - -Int8* BinaryWriter::readBytes(Int64) -{ - throw IOException("Stream not open for reading"); -} - -void BinaryWriter::writeInt16(Int16 val) -{ - if (m_bitPosition > 0) - { - m_bitPosition = 0; - m_position += sizeof(Uint8); - } - - if (m_position + sizeof(Int16) > m_length && m_autoResize) - resize(m_position + sizeof(Int16)); - else if (m_position > m_length) - throw IOException("BinaryWriter::WriteInt16() -> Position outside stream bounds"); + }while (done < m_length); + + fclose(out); +} + +Int8 BinaryWriter::readByte() +{ + throw IOException("Stream not open for reading"); +} + +Int8* BinaryWriter::readBytes(Int64) +{ + throw IOException("Stream not open for reading"); +} + +void BinaryWriter::writeInt16(Int16 val) +{ + if (m_bitPosition > 0) + { + m_bitPosition = 0; + m_position += sizeof(Uint8); + } + + if (m_position + sizeof(Int16) > m_length && m_autoResize) + resize(m_position + sizeof(Int16)); + else if (m_position > m_length) + throw IOException("BinaryWriter::WriteInt16() -> Position outside stream bounds"); if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) val = swap16(val); - - *(Int16*)(m_data + m_position) = val; - m_position += sizeof(Int16); -} - -void BinaryWriter::writeUInt16(Uint16 val) -{ - if (m_bitPosition > 0) - { - m_bitPosition = 0; - m_position += sizeof(Uint8); - } - - if (m_position + sizeof(Uint16) > m_length && m_autoResize) - resize(m_position + sizeof(Uint16)); - else if (m_position > m_length) - throw IOException("BinaryWriter::WriteUInt16() -> Position outside stream bounds"); - + + *(Int16*)(m_data + m_position) = val; + m_position += sizeof(Int16); +} + +void BinaryWriter::writeUInt16(Uint16 val) +{ + if (m_bitPosition > 0) + { + m_bitPosition = 0; + m_position += sizeof(Uint8); + } + + if (m_position + sizeof(Uint16) > m_length && m_autoResize) + resize(m_position + sizeof(Uint16)); + else if (m_position > m_length) + throw IOException("BinaryWriter::WriteUInt16() -> Position outside stream bounds"); + if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) val = swapU16(val); - - *(Uint16*)(m_data + m_position) = val; - m_position += sizeof(Uint16); -} - -void BinaryWriter::writeInt32(Int32 val) -{ - if (m_bitPosition > 0) - { - m_bitPosition = 0; - m_position += sizeof(Uint8); - } - - if (m_position + sizeof(Int32) > m_length && m_autoResize) - resize(m_position + sizeof(Int32)); - else if (m_position > m_length) - throw IOException("BinaryWriter::WriteInt32() -> Position outside stream bounds"); - if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) - val = swap32(val); - - *(Int32*)(m_data + m_position) = val; - m_position += sizeof(Int32); -} - -void BinaryWriter::writeUInt32(Uint32 val) -{ - if (m_bitPosition > 0) - { - m_bitPosition = 0; - m_position += sizeof(Uint8); - } - - if (m_position + sizeof(Uint32) > m_length && m_autoResize) - resize(m_position + sizeof(Uint32)); - else if (m_position > m_length) - throw IOException("BinaryWriter::WriteUInt32() -> Position outside stream bounds"); - - if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) - val = swap32(val); - - *(Uint32*)(m_data + m_position) = val; - m_position += sizeof(Uint32); -} - -void BinaryWriter::writeInt64(Int64 val) -{ - if (m_bitPosition > 0) - { - m_bitPosition = 0; - m_position += sizeof(Uint8); - } - - if (m_position + sizeof(Int64) > m_length && m_autoResize) - resize(m_position + sizeof(Int64)); - else if (m_position > m_length) - throw IOException("BinaryWriter::WriteInt64() -> Position outside stream bounds"); - + *(Uint16*)(m_data + m_position) = val; + m_position += sizeof(Uint16); +} - if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) - val = swap64(val); - - *(Int64*)(m_data + m_position) = val; - m_position += sizeof(Int64); -} - -void BinaryWriter::writeUInt64(Uint64 val) +void BinaryWriter::writeInt32(Int32 val) { - if (m_bitPosition > 0) - { - m_bitPosition = 0; - m_position += sizeof(Uint8); - } - - if (m_position + sizeof(Uint64) > m_length && m_autoResize) - resize(m_position + sizeof(Uint64)); - else if (m_position > m_length) - throw IOException("BinaryWriter::WriteUInt64() -> Position outside stream bounds"); + if (m_bitPosition > 0) + { + m_bitPosition = 0; + m_position += sizeof(Uint8); + } + + if (m_position + sizeof(Int32) > m_length && m_autoResize) + resize(m_position + sizeof(Int32)); + else if (m_position > m_length) + throw IOException("BinaryWriter::WriteInt32() -> Position outside stream bounds"); + + if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) + val = swap32(val); + + *(Int32*)(m_data + m_position) = val; + m_position += sizeof(Int32); +} + +void BinaryWriter::writeUInt32(Uint32 val) +{ + if (m_bitPosition > 0) + { + m_bitPosition = 0; + m_position += sizeof(Uint8); + } + + if (m_position + sizeof(Uint32) > m_length && m_autoResize) + resize(m_position + sizeof(Uint32)); + else if (m_position > m_length) + throw IOException("BinaryWriter::WriteUInt32() -> Position outside stream bounds"); + + if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) + val = swap32(val); + + *(Uint32*)(m_data + m_position) = val; + m_position += sizeof(Uint32); +} + +void BinaryWriter::writeInt64(Int64 val) +{ + if (m_bitPosition > 0) + { + m_bitPosition = 0; + m_position += sizeof(Uint8); + } + + if (m_position + sizeof(Int64) > m_length && m_autoResize) + resize(m_position + sizeof(Int64)); + else if (m_position > m_length) + throw IOException("BinaryWriter::WriteInt64() -> Position outside stream bounds"); + if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) val = swap64(val); - - *(Uint64*)(m_data + m_position) = val; - m_position += sizeof(Uint64); -} - -void BinaryWriter::writeFloat(float val) -{ - if (m_bitPosition > 0) - { - m_bitPosition = 0; - m_position += sizeof(Uint8); - } - - if (m_position + sizeof(float) > m_length && m_autoResize) - resize(m_position + sizeof(float)); - else if (m_position > m_length) - throw IOException("BinaryWriter::WriteFloat() -> Position outside stream bounds"); - if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) + *(Int64*)(m_data + m_position) = val; + m_position += sizeof(Int64); +} + +void BinaryWriter::writeUInt64(Uint64 val) +{ + if (m_bitPosition > 0) + { + m_bitPosition = 0; + m_position += sizeof(Uint8); + } + + if (m_position + sizeof(Uint64) > m_length && m_autoResize) + resize(m_position + sizeof(Uint64)); + else if (m_position > m_length) + throw IOException("BinaryWriter::WriteUInt64() -> Position outside stream bounds"); + + if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) + val = swap64(val); + + *(Uint64*)(m_data + m_position) = val; + m_position += sizeof(Uint64); +} + +void BinaryWriter::writeFloat(float val) +{ + if (m_bitPosition > 0) + { + m_bitPosition = 0; + m_position += sizeof(Uint8); + } + + if (m_position + sizeof(float) > m_length && m_autoResize) + resize(m_position + sizeof(float)); + else if (m_position > m_length) + throw IOException("BinaryWriter::WriteFloat() -> Position outside stream bounds"); + + if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) val = swapFloat(val); - - *(float*)(m_data + m_position) = val; - m_position += sizeof(float); -} - -void BinaryWriter::writeDouble(double val) -{ - if (m_bitPosition > 0) - { - m_bitPosition = 0; - m_position += sizeof(Uint8); - } - - if (m_position + sizeof(double) > m_length && m_autoResize) - resize(m_position + sizeof(double)); - else if (m_position > m_length) - throw IOException("BinaryWriter::WriteDouble() -> Position outside stream bounds"); - if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) - val = swapDouble(val); - - *(double*)(m_data + m_position)= val; - m_position += sizeof(double); -} - -void BinaryWriter::writeBool(bool val) + *(float*)(m_data + m_position) = val; + m_position += sizeof(float); +} + +void BinaryWriter::writeDouble(double val) { - if (m_bitPosition > 0) - { - m_bitPosition = 0; - m_position += sizeof(Uint8); - } - - if (m_position + sizeof(bool) > m_length && m_autoResize) - resize(m_position + sizeof(bool)); - else if (m_position > m_length) + if (m_bitPosition > 0) + { + m_bitPosition = 0; + m_position += sizeof(Uint8); + } + + if (m_position + sizeof(double) > m_length && m_autoResize) + resize(m_position + sizeof(double)); + else if (m_position > m_length) + throw IOException("BinaryWriter::WriteDouble() -> Position outside stream bounds"); + + if ((!isSystemBigEndian() && m_endian == Stream::BigEndian) || (isSystemBigEndian() && m_endian == Stream::LittleEndian)) + val = swapDouble(val); + + *(double*)(m_data + m_position)= val; + m_position += sizeof(double); +} + +void BinaryWriter::writeBool(bool val) +{ + if (m_bitPosition > 0) + { + m_bitPosition = 0; + m_position += sizeof(Uint8); + } + + if (m_position + sizeof(bool) > m_length && m_autoResize) + resize(m_position + sizeof(bool)); + else if (m_position > m_length) throw IOException("BinaryWriter::WriteBool() -> Position outside stream bounds"); - - - *(bool*)(m_data + m_position) = val; - m_position += sizeof(bool); -} - -void BinaryWriter::writeUnicode(const std::string& str) -{ + + + *(bool*)(m_data + m_position) = val; + m_position += sizeof(bool); +} + +void BinaryWriter::writeUnicode(const std::string& str) +{ std::string tmpStr = "\xEF\xBB\xBF" + str; std::vector tmp; @@ -280,11 +280,11 @@ void BinaryWriter::writeUnicode(const std::string& str) { if (chr != 0xFEFF) writeInt16(chr); - } -} - -bool BinaryWriter::isOpenForReading() -{ - return false; -} - + } +} + +bool BinaryWriter::isOpenForReading() +{ + return false; +} +