Switch to stream operators and TagByteArray

master
Julien Rosset 5 years ago
parent a987bbe0b9
commit c57d9e6405

@ -30,5 +30,5 @@ add_executable(
NBT/TagLong.cpp NBT/TagLong.h NBT/TagLong.cpp NBT/TagLong.h
NBT/TagFloat.cpp NBT/TagFloat.h NBT/TagFloat.cpp NBT/TagFloat.h
NBT/TagDouble.cpp NBT/TagDouble.h NBT/TagDouble.cpp NBT/TagDouble.h
) NBT/TagByteArray.cpp NBT/TagByteArray.h)
target_link_libraries(NBTModifier Qt5::Widgets Qt5::Svg) target_link_libraries(NBTModifier Qt5::Widgets Qt5::Svg)

@ -5,7 +5,7 @@
AbstractNamedTag::AbstractNamedTag(const quint8 id) : AbstractTag(id) {} AbstractNamedTag::AbstractNamedTag(const quint8 id) : AbstractTag(id) {}
const bool AbstractNamedTag::readFromData(QDataStream &data) { void AbstractNamedTag::readFromData(QDataStream &data) {
quint16 size; quint16 size;
data >> size; data >> size;
@ -13,17 +13,17 @@ const bool AbstractNamedTag::readFromData(QDataStream &data) {
char *rawName = new char[size]; char *rawName = new char[size];
if (data.readRawData(rawName, size) == -1) { if (data.readRawData(rawName, size) == -1) {
return false; return;
} }
m_name = QString::fromUtf8(rawName); 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(); const QByteArray rawName = m_name.toUtf8();
data << qToBigEndian(rawName.size()) << rawName.constData(); data << qToBigEndian(rawName.size()) << rawName.constData();
return writePayloadToData(data); writePayloadToData(data);
} }
const QString &AbstractNamedTag::name() const { const QString &AbstractNamedTag::name() const {

@ -23,8 +23,8 @@ public:
protected: protected:
explicit AbstractNamedTag(const quint8 id); explicit AbstractNamedTag(const quint8 id);
virtual const bool readFromData(QDataStream &data) override; virtual void readFromData(QDataStream &data) override;
virtual const bool writeToData(QDataStream &data) const override; virtual void writeToData(QDataStream &data) const override;
/** /**
* Read a tag payload from a data stream * Read a tag payload from a data stream
@ -33,7 +33,7 @@ protected:
* *
* @return True if read is success, otherwise false * @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 * Write a tag payload to a data stream
* *
@ -41,7 +41,7 @@ protected:
* *
* @return True if write is success, otherwise false * @return True if write is success, otherwise false
*/ */
virtual const bool writePayloadToData(QDataStream &data) const = 0; virtual void writePayloadToData(QDataStream &data) const = 0;
private: private:
/** /**

@ -16,53 +16,52 @@ const quint8 AbstractTag::id() const {
return m_id; return m_id;
} }
AbstractTag *AbstractTag::fromData(QDataStream &data, bool *ok) { const quint8 AbstractTag::extractId(const QByteArray &data) {
QDataStream stream(data);
quint8 id; quint8 id;
data >> id; stream >> id;
AbstractTag *tag = nullptr; return id;
switch (id) { }
AbstractTag *AbstractTag::extractEmptyTag(const QByteArray &data) {
switch (extractId(data)) {
case TagEnd::ID: case TagEnd::ID:
tag = new TagEnd(); return new TagEnd();
break;
case TagByte::ID: case TagByte::ID:
tag = new TagByte(); return new TagByte();
break;
case TagShort::ID: case TagShort::ID:
tag = new TagShort(); return new TagShort();
break;
case TagInt::ID: case TagInt::ID:
tag = new TagInt(); return new TagInt();
break;
case TagLong::ID: case TagLong::ID:
tag = new TagLong(); return new TagLong();
break;
case TagFloat::ID: case TagFloat::ID:
tag = new TagFloat(); return new TagFloat();
break;
case TagDouble::ID: case TagDouble::ID:
tag = new TagDouble(); return new TagDouble();
break;
} }
if (tag == nullptr) {
return nullptr; return nullptr;
} }
*ok = tag->readFromData(data); QDataStream &operator<<(QDataStream &data, const AbstractTag &tag) {
return tag; data << tag.id();
tag.writeToData(data);
return data;
} }
QByteArray AbstractTag::toData(bool *ok) { QDataStream &operator>>(QDataStream &data, AbstractTag &tag) {
QByteArray data; quint8 id;
QDataStream stream(data); data >> id;
stream << id(); tag.readFromData(data);
*ok = writeToData(stream);
return data; return data;
} }

@ -12,8 +12,11 @@ class AbstractTag {
public: public:
const quint8 id() const; const quint8 id() const;
static AbstractTag *fromData(QDataStream &data, bool *ok = nullptr); static const quint8 extractId(const QByteArray &data);
QByteArray toData(bool *ok = nullptr); static AbstractTag *extractEmptyTag(const QByteArray &data);
friend QDataStream &operator<<(QDataStream &data, const AbstractTag &tag);
friend QDataStream &operator>>(QDataStream &data, AbstractTag &tag);
protected: protected:
/** /**
@ -30,7 +33,7 @@ protected:
* *
* @return True if read is success, otherwise false * @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 * Write a tag to a data stream
* *
@ -38,7 +41,7 @@ protected:
* *
* @return True if write is success, otherwise false * @return True if write is success, otherwise false
*/ */
virtual const bool writeToData(QDataStream &data) const = 0; virtual void writeToData(QDataStream &data) const = 0;
private: private:
/** /**

@ -4,11 +4,9 @@
TagByte::TagByte(const qint8 value) : AbstractNamedTag(ID), m_value(value) {} TagByte::TagByte(const qint8 value) : AbstractNamedTag(ID), m_value(value) {}
bool const TagByte::readPayloadFromData(QDataStream &data) { void TagByte::readPayloadFromData(QDataStream &data) {
data >> m_value; data >> m_value;
return true;
} }
bool const TagByte::writePayloadToData(QDataStream &data) const { void TagByte::writePayloadToData(QDataStream &data) const {
data << m_value; data << m_value;
return true;
} }

@ -10,8 +10,8 @@ public:
TagByte(const qint8 value = 0); TagByte(const qint8 value = 0);
protected: protected:
virtual bool const readPayloadFromData(QDataStream &data) override; virtual void readPayloadFromData(QDataStream &data) override;
virtual bool const writePayloadToData(QDataStream &data) const override; virtual void writePayloadToData(QDataStream &data) const override;
private: private:
qint8 m_value; qint8 m_value;

@ -0,0 +1,28 @@
#include "TagByteArray.h"
#include "TagInt.h"
#include <QtCore/QDataStream>
TagByteArray::TagByteArray(const QList<TagByte> 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;
}
}

@ -0,0 +1,23 @@
#ifndef NBTMODIFIER_TAGBYTEARRAY_H
#define NBTMODIFIER_TAGBYTEARRAY_H
#include "AbstractNamedTag.h"
#include "TagByte.h"
#include <QtCore/QList>
class TagByteArray : public AbstractNamedTag {
public:
static constexpr quint8 ID = 7;
TagByteArray(const QList<TagByte> value = QList<TagByte>());
protected:
virtual void readPayloadFromData(QDataStream &data) override;
virtual void writePayloadToData(QDataStream &data) const override;
private:
QList<TagByte> m_value;
};
#endif //NBTMODIFIER_TAGBYTEARRAY_H

@ -5,12 +5,10 @@
TagDouble::TagDouble(const double value) : AbstractNamedTag(ID), m_value(value) {} TagDouble::TagDouble(const double value) : AbstractNamedTag(ID), m_value(value) {}
bool const TagDouble::readPayloadFromData(QDataStream &data) { void TagDouble::readPayloadFromData(QDataStream &data) {
data >> m_value; data >> m_value;
m_value = qFromBigEndian(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); data << qToBigEndian(m_value);
return true;
} }

@ -10,8 +10,8 @@ public:
TagDouble(const double value = 0); TagDouble(const double value = 0);
protected: protected:
virtual bool const readPayloadFromData(QDataStream &data) override; virtual void readPayloadFromData(QDataStream &data) override;
virtual bool const writePayloadToData(QDataStream &data) const override; virtual void writePayloadToData(QDataStream &data) const override;
private: private:
double m_value; double m_value;

@ -3,9 +3,9 @@
TagEnd::TagEnd() : AbstractTag(ID) { TagEnd::TagEnd() : AbstractTag(ID) {
} }
bool const TagEnd::readFromData(QDataStream &data) { void TagEnd::readFromData(QDataStream &data) {
return true;
} }
bool const TagEnd::writeToData(QDataStream &data) const { void TagEnd::writeToData(QDataStream &data) const {
return true;
} }

@ -10,8 +10,8 @@ public:
explicit TagEnd(); explicit TagEnd();
protected: protected:
virtual bool const readFromData(QDataStream &data) override; virtual void readFromData(QDataStream &data) override;
virtual bool const writeToData(QDataStream &data) const override; virtual void writeToData(QDataStream &data) const override;
}; };
#endif //NBTMODIFIER_TAGEND_H #endif //NBTMODIFIER_TAGEND_H

@ -5,12 +5,10 @@
TagFloat::TagFloat(const float value) : AbstractNamedTag(ID), m_value(value) {} TagFloat::TagFloat(const float value) : AbstractNamedTag(ID), m_value(value) {}
bool const TagFloat::readPayloadFromData(QDataStream &data) { void TagFloat::readPayloadFromData(QDataStream &data) {
data >> m_value; data >> m_value;
m_value = qFromBigEndian(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); data << qToBigEndian(m_value);
return true;
} }

@ -11,8 +11,8 @@ public:
TagFloat(const float value = 0); TagFloat(const float value = 0);
protected: protected:
virtual bool const readPayloadFromData(QDataStream &data) override; virtual void readPayloadFromData(QDataStream &data) override;
virtual bool const writePayloadToData(QDataStream &data) const override; virtual void writePayloadToData(QDataStream &data) const override;
private: private:
float m_value; float m_value;

@ -5,12 +5,14 @@
TagInt::TagInt(const qint32 value) : AbstractNamedTag(ID), m_value(value) {} 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; data >> m_value;
m_value = qFromBigEndian(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); data << qToBigEndian(m_value);
return true;
} }

@ -9,9 +9,11 @@ public:
TagInt(const qint32 value = 0); TagInt(const qint32 value = 0);
const qint32 value() const;
protected: protected:
virtual bool const readPayloadFromData(QDataStream &data) override; virtual void readPayloadFromData(QDataStream &data) override;
virtual bool const writePayloadToData(QDataStream &data) const override; virtual void writePayloadToData(QDataStream &data) const override;
private: private:
qint32 m_value; qint32 m_value;

@ -5,12 +5,10 @@
TagLong::TagLong(const qint64 value) : AbstractNamedTag(ID), m_value(value) {} TagLong::TagLong(const qint64 value) : AbstractNamedTag(ID), m_value(value) {}
bool const TagLong::readPayloadFromData(QDataStream &data) { void TagLong::readPayloadFromData(QDataStream &data) {
data >> m_value; data >> m_value;
m_value = qFromBigEndian(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); data << qToBigEndian(m_value);
return true;
} }

@ -10,8 +10,8 @@ public:
TagLong(const qint64 value = 0); TagLong(const qint64 value = 0);
protected: protected:
virtual bool const readPayloadFromData(QDataStream &data) override; virtual void readPayloadFromData(QDataStream &data) override;
virtual bool const writePayloadToData(QDataStream &data) const override; virtual void writePayloadToData(QDataStream &data) const override;
private: private:
qint64 m_value; qint64 m_value;

@ -5,12 +5,10 @@
TagShort::TagShort(const qint16 value) : AbstractNamedTag(ID), m_value(value) {} TagShort::TagShort(const qint16 value) : AbstractNamedTag(ID), m_value(value) {}
bool const TagShort::readPayloadFromData(QDataStream &data) { void TagShort::readPayloadFromData(QDataStream &data) {
data >> m_value; data >> m_value;
m_value = qFromBigEndian(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); data << qToBigEndian(m_value);
return true;
} }

@ -10,8 +10,8 @@ public:
TagShort(const qint16 value = 0); TagShort(const qint16 value = 0);
protected: protected:
virtual bool const readPayloadFromData(QDataStream &data) override; virtual void readPayloadFromData(QDataStream &data) override;
virtual bool const writePayloadToData(QDataStream &data) const override; virtual void writePayloadToData(QDataStream &data) const override;
private: private:
qint16 m_value; qint16 m_value;

Loading…
Cancel
Save