diff --git a/CMakeLists.txt b/CMakeLists.txt index fc58679..0e24c2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,5 +30,5 @@ add_executable( NBT/TagLong.cpp NBT/TagLong.h NBT/TagFloat.cpp NBT/TagFloat.h NBT/TagDouble.cpp NBT/TagDouble.h -) + NBT/TagByteArray.cpp NBT/TagByteArray.h) target_link_libraries(NBTModifier Qt5::Widgets Qt5::Svg) \ No newline at end of file diff --git a/NBT/AbstractNamedTag.cpp b/NBT/AbstractNamedTag.cpp index d1d923d..15daea9 100644 --- a/NBT/AbstractNamedTag.cpp +++ b/NBT/AbstractNamedTag.cpp @@ -5,7 +5,7 @@ AbstractNamedTag::AbstractNamedTag(const quint8 id) : AbstractTag(id) {} -const bool AbstractNamedTag::readFromData(QDataStream &data) { +void AbstractNamedTag::readFromData(QDataStream &data) { quint16 size; data >> size; @@ -13,17 +13,17 @@ const bool AbstractNamedTag::readFromData(QDataStream &data) { char *rawName = new char[size]; if (data.readRawData(rawName, size) == -1) { - return false; + return; } m_name = QString::fromUtf8(rawName); - return readPayloadFromData(data); + readPayloadFromData(data); } -const bool AbstractNamedTag::writeToData(QDataStream &data) const { +void AbstractNamedTag::writeToData(QDataStream &data) const { const QByteArray rawName = m_name.toUtf8(); data << qToBigEndian(rawName.size()) << rawName.constData(); - return writePayloadToData(data); + writePayloadToData(data); } const QString &AbstractNamedTag::name() const { diff --git a/NBT/AbstractNamedTag.h b/NBT/AbstractNamedTag.h index 178b856..a03c4e7 100644 --- a/NBT/AbstractNamedTag.h +++ b/NBT/AbstractNamedTag.h @@ -23,8 +23,8 @@ public: protected: explicit AbstractNamedTag(const quint8 id); - virtual const bool readFromData(QDataStream &data) override; - virtual const bool writeToData(QDataStream &data) const override; + virtual void readFromData(QDataStream &data) override; + virtual void writeToData(QDataStream &data) const override; /** * Read a tag payload from a data stream @@ -33,7 +33,7 @@ protected: * * @return True if read is success, otherwise false */ - virtual const bool readPayloadFromData(QDataStream &data) = 0; + virtual void readPayloadFromData(QDataStream &data) = 0; /** * Write a tag payload to a data stream * @@ -41,7 +41,7 @@ protected: * * @return True if write is success, otherwise false */ - virtual const bool writePayloadToData(QDataStream &data) const = 0; + virtual void writePayloadToData(QDataStream &data) const = 0; private: /** diff --git a/NBT/AbstractTag.cpp b/NBT/AbstractTag.cpp index f700908..d0011d7 100644 --- a/NBT/AbstractTag.cpp +++ b/NBT/AbstractTag.cpp @@ -16,53 +16,52 @@ const quint8 AbstractTag::id() const { return m_id; } -AbstractTag *AbstractTag::fromData(QDataStream &data, bool *ok) { +const quint8 AbstractTag::extractId(const QByteArray &data) { + QDataStream stream(data); + quint8 id; - data >> id; + stream >> id; - AbstractTag *tag = nullptr; - switch (id) { + return id; +} +AbstractTag *AbstractTag::extractEmptyTag(const QByteArray &data) { + switch (extractId(data)) { case TagEnd::ID: - tag = new TagEnd(); - break; + return new TagEnd(); case TagByte::ID: - tag = new TagByte(); - break; + return new TagByte(); case TagShort::ID: - tag = new TagShort(); - break; + return new TagShort(); case TagInt::ID: - tag = new TagInt(); - break; + return new TagInt(); case TagLong::ID: - tag = new TagLong(); - break; + return new TagLong(); case TagFloat::ID: - tag = new TagFloat(); - break; + return new TagFloat(); case TagDouble::ID: - tag = new TagDouble(); - break; - } - if (tag == nullptr) { - return nullptr; + return new TagDouble(); } - *ok = tag->readFromData(data); - return tag; + return nullptr; } -QByteArray AbstractTag::toData(bool *ok) { - QByteArray data; - QDataStream stream(data); - stream << id(); - *ok = writeToData(stream); +QDataStream &operator<<(QDataStream &data, const AbstractTag &tag) { + data << tag.id(); + tag.writeToData(data); + + return data; +} +QDataStream &operator>>(QDataStream &data, AbstractTag &tag) { + quint8 id; + data >> id; + + tag.readFromData(data); return data; } \ No newline at end of file diff --git a/NBT/AbstractTag.h b/NBT/AbstractTag.h index 0836290..e57d1d8 100644 --- a/NBT/AbstractTag.h +++ b/NBT/AbstractTag.h @@ -12,8 +12,11 @@ class AbstractTag { public: const quint8 id() const; - static AbstractTag *fromData(QDataStream &data, bool *ok = nullptr); - QByteArray toData(bool *ok = nullptr); + static const quint8 extractId(const QByteArray &data); + static AbstractTag *extractEmptyTag(const QByteArray &data); + + friend QDataStream &operator<<(QDataStream &data, const AbstractTag &tag); + friend QDataStream &operator>>(QDataStream &data, AbstractTag &tag); protected: /** @@ -30,7 +33,7 @@ protected: * * @return True if read is success, otherwise false */ - virtual const bool readFromData(QDataStream &data) = 0; + virtual void readFromData(QDataStream &data) = 0; /** * Write a tag to a data stream * @@ -38,7 +41,7 @@ protected: * * @return True if write is success, otherwise false */ - virtual const bool writeToData(QDataStream &data) const = 0; + virtual void writeToData(QDataStream &data) const = 0; private: /** diff --git a/NBT/TagByte.cpp b/NBT/TagByte.cpp index aa1743f..1f81b04 100644 --- a/NBT/TagByte.cpp +++ b/NBT/TagByte.cpp @@ -4,11 +4,9 @@ TagByte::TagByte(const qint8 value) : AbstractNamedTag(ID), m_value(value) {} -bool const TagByte::readPayloadFromData(QDataStream &data) { +void TagByte::readPayloadFromData(QDataStream &data) { data >> m_value; - return true; } -bool const TagByte::writePayloadToData(QDataStream &data) const { +void TagByte::writePayloadToData(QDataStream &data) const { data << m_value; - return true; } diff --git a/NBT/TagByte.h b/NBT/TagByte.h index 1a4aa72..5b5e7f9 100644 --- a/NBT/TagByte.h +++ b/NBT/TagByte.h @@ -10,8 +10,8 @@ public: TagByte(const qint8 value = 0); protected: - virtual bool const readPayloadFromData(QDataStream &data) override; - virtual bool const writePayloadToData(QDataStream &data) const override; + virtual void readPayloadFromData(QDataStream &data) override; + virtual void writePayloadToData(QDataStream &data) const override; private: qint8 m_value; diff --git a/NBT/TagByteArray.cpp b/NBT/TagByteArray.cpp new file mode 100644 index 0000000..a8620fc --- /dev/null +++ b/NBT/TagByteArray.cpp @@ -0,0 +1,28 @@ +#include "TagByteArray.h" + +#include "TagInt.h" + +#include + +TagByteArray::TagByteArray(const QList value) : AbstractNamedTag(ID), m_value(value) {} + +void TagByteArray::readPayloadFromData(QDataStream &data) { + TagInt size; + data >> size; + + m_value.clear(); + for(qint32 elem = 0; elem < size.value(); elem++) { + TagByte tag; + data >> tag; + + m_value << tag; + } +} +void TagByteArray::writePayloadToData(QDataStream &data) const { + TagInt size(m_value.size()); + + data << size; + foreach(const TagByte tag, m_value) { + data << tag; + } +} \ No newline at end of file diff --git a/NBT/TagByteArray.h b/NBT/TagByteArray.h new file mode 100644 index 0000000..120b9d7 --- /dev/null +++ b/NBT/TagByteArray.h @@ -0,0 +1,23 @@ +#ifndef NBTMODIFIER_TAGBYTEARRAY_H +#define NBTMODIFIER_TAGBYTEARRAY_H + +#include "AbstractNamedTag.h" +#include "TagByte.h" + +#include + +class TagByteArray : public AbstractNamedTag { +public: + static constexpr quint8 ID = 7; + + TagByteArray(const QList value = QList()); + +protected: + virtual void readPayloadFromData(QDataStream &data) override; + virtual void writePayloadToData(QDataStream &data) const override; + +private: + QList m_value; +}; + +#endif //NBTMODIFIER_TAGBYTEARRAY_H diff --git a/NBT/TagDouble.cpp b/NBT/TagDouble.cpp index 2fb8514..c84ce7d 100644 --- a/NBT/TagDouble.cpp +++ b/NBT/TagDouble.cpp @@ -5,12 +5,10 @@ TagDouble::TagDouble(const double value) : AbstractNamedTag(ID), m_value(value) {} -bool const TagDouble::readPayloadFromData(QDataStream &data) { +void TagDouble::readPayloadFromData(QDataStream &data) { data >> m_value; m_value = qFromBigEndian(m_value); - return true; } -bool const TagDouble::writePayloadToData(QDataStream &data) const { +void TagDouble::writePayloadToData(QDataStream &data) const { data << qToBigEndian(m_value); - return true; } \ No newline at end of file diff --git a/NBT/TagDouble.h b/NBT/TagDouble.h index b95f749..a6a5182 100644 --- a/NBT/TagDouble.h +++ b/NBT/TagDouble.h @@ -10,8 +10,8 @@ public: TagDouble(const double value = 0); protected: - virtual bool const readPayloadFromData(QDataStream &data) override; - virtual bool const writePayloadToData(QDataStream &data) const override; + virtual void readPayloadFromData(QDataStream &data) override; + virtual void writePayloadToData(QDataStream &data) const override; private: double m_value; diff --git a/NBT/TagEnd.cpp b/NBT/TagEnd.cpp index 1d24e5d..1136a0a 100644 --- a/NBT/TagEnd.cpp +++ b/NBT/TagEnd.cpp @@ -3,9 +3,9 @@ TagEnd::TagEnd() : AbstractTag(ID) { } -bool const TagEnd::readFromData(QDataStream &data) { - return true; +void TagEnd::readFromData(QDataStream &data) { + } -bool const TagEnd::writeToData(QDataStream &data) const { - return true; +void TagEnd::writeToData(QDataStream &data) const { + } diff --git a/NBT/TagEnd.h b/NBT/TagEnd.h index 18fa538..6803549 100644 --- a/NBT/TagEnd.h +++ b/NBT/TagEnd.h @@ -10,8 +10,8 @@ public: explicit TagEnd(); protected: - virtual bool const readFromData(QDataStream &data) override; - virtual bool const writeToData(QDataStream &data) const override; + virtual void readFromData(QDataStream &data) override; + virtual void writeToData(QDataStream &data) const override; }; #endif //NBTMODIFIER_TAGEND_H diff --git a/NBT/TagFloat.cpp b/NBT/TagFloat.cpp index ddc2c9b..a672746 100644 --- a/NBT/TagFloat.cpp +++ b/NBT/TagFloat.cpp @@ -5,12 +5,10 @@ TagFloat::TagFloat(const float value) : AbstractNamedTag(ID), m_value(value) {} -bool const TagFloat::readPayloadFromData(QDataStream &data) { +void TagFloat::readPayloadFromData(QDataStream &data) { data >> m_value; m_value = qFromBigEndian(m_value); - return true; } -bool const TagFloat::writePayloadToData(QDataStream &data) const { +void TagFloat::writePayloadToData(QDataStream &data) const { data << qToBigEndian(m_value); - return true; } \ No newline at end of file diff --git a/NBT/TagFloat.h b/NBT/TagFloat.h index c38e655..f63ec8e 100644 --- a/NBT/TagFloat.h +++ b/NBT/TagFloat.h @@ -11,8 +11,8 @@ public: TagFloat(const float value = 0); protected: - virtual bool const readPayloadFromData(QDataStream &data) override; - virtual bool const writePayloadToData(QDataStream &data) const override; + virtual void readPayloadFromData(QDataStream &data) override; + virtual void writePayloadToData(QDataStream &data) const override; private: float m_value; diff --git a/NBT/TagInt.cpp b/NBT/TagInt.cpp index e3f1a67..cfc689f 100644 --- a/NBT/TagInt.cpp +++ b/NBT/TagInt.cpp @@ -5,12 +5,14 @@ TagInt::TagInt(const qint32 value) : AbstractNamedTag(ID), m_value(value) {} -bool const TagInt::readPayloadFromData(QDataStream &data) { +const qint32 TagInt::value() const { + return m_value; +} + +void TagInt::readPayloadFromData(QDataStream &data) { data >> m_value; m_value = qFromBigEndian(m_value); - return true; } -bool const TagInt::writePayloadToData(QDataStream &data) const { +void TagInt::writePayloadToData(QDataStream &data) const { data << qToBigEndian(m_value); - return true; } \ No newline at end of file diff --git a/NBT/TagInt.h b/NBT/TagInt.h index d524add..c204d4b 100644 --- a/NBT/TagInt.h +++ b/NBT/TagInt.h @@ -9,9 +9,11 @@ public: TagInt(const qint32 value = 0); + const qint32 value() const; + protected: - virtual bool const readPayloadFromData(QDataStream &data) override; - virtual bool const writePayloadToData(QDataStream &data) const override; + virtual void readPayloadFromData(QDataStream &data) override; + virtual void writePayloadToData(QDataStream &data) const override; private: qint32 m_value; diff --git a/NBT/TagLong.cpp b/NBT/TagLong.cpp index 36b7741..b262418 100644 --- a/NBT/TagLong.cpp +++ b/NBT/TagLong.cpp @@ -5,12 +5,10 @@ TagLong::TagLong(const qint64 value) : AbstractNamedTag(ID), m_value(value) {} -bool const TagLong::readPayloadFromData(QDataStream &data) { +void TagLong::readPayloadFromData(QDataStream &data) { data >> m_value; m_value = qFromBigEndian(m_value); - return true; } -bool const TagLong::writePayloadToData(QDataStream &data) const { +void TagLong::writePayloadToData(QDataStream &data) const { data << qToBigEndian(m_value); - return true; } \ No newline at end of file diff --git a/NBT/TagLong.h b/NBT/TagLong.h index c0b3b17..936b25a 100644 --- a/NBT/TagLong.h +++ b/NBT/TagLong.h @@ -10,8 +10,8 @@ public: TagLong(const qint64 value = 0); protected: - virtual bool const readPayloadFromData(QDataStream &data) override; - virtual bool const writePayloadToData(QDataStream &data) const override; + virtual void readPayloadFromData(QDataStream &data) override; + virtual void writePayloadToData(QDataStream &data) const override; private: qint64 m_value; diff --git a/NBT/TagShort.cpp b/NBT/TagShort.cpp index 1b85073..0f9e0ea 100644 --- a/NBT/TagShort.cpp +++ b/NBT/TagShort.cpp @@ -5,12 +5,10 @@ TagShort::TagShort(const qint16 value) : AbstractNamedTag(ID), m_value(value) {} -bool const TagShort::readPayloadFromData(QDataStream &data) { +void TagShort::readPayloadFromData(QDataStream &data) { data >> m_value; m_value = qFromBigEndian(m_value); - return true; } -bool const TagShort::writePayloadToData(QDataStream &data) const { +void TagShort::writePayloadToData(QDataStream &data) const { data << qToBigEndian(m_value); - return true; } \ No newline at end of file diff --git a/NBT/TagShort.h b/NBT/TagShort.h index 46b6627..7c1f023 100644 --- a/NBT/TagShort.h +++ b/NBT/TagShort.h @@ -10,8 +10,8 @@ public: TagShort(const qint16 value = 0); protected: - virtual bool const readPayloadFromData(QDataStream &data) override; - virtual bool const writePayloadToData(QDataStream &data) const override; + virtual void readPayloadFromData(QDataStream &data) override; + virtual void writePayloadToData(QDataStream &data) const override; private: qint16 m_value;