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/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)

@ -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 {

@ -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:
/**

@ -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;
return new TagDouble();
}
if (tag == nullptr) {
return nullptr;
}
*ok = tag->readFromData(data);
return tag;
QDataStream &operator<<(QDataStream &data, const AbstractTag &tag) {
data << tag.id();
tag.writeToData(data);
return data;
}
QByteArray AbstractTag::toData(bool *ok) {
QByteArray data;
QDataStream stream(data);
QDataStream &operator>>(QDataStream &data, AbstractTag &tag) {
quint8 id;
data >> id;
stream << id();
*ok = writeToData(stream);
tag.readFromData(data);
return data;
}

@ -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:
/**

@ -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;
}

@ -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;

@ -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) {}
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;
}

@ -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;

@ -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 {
}

@ -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

@ -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;
}

@ -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;

@ -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;
}

@ -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;

@ -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;
}

@ -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;

@ -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;
}

@ -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;

Loading…
Cancel
Save