forked from Kolyah35/minecraft-pe-0.6.1
140 lines
3.0 KiB
C++
Executable File
140 lines
3.0 KiB
C++
Executable File
#include "Tag.h"
|
|
|
|
#include "EndTag.h"
|
|
#include "ByteTag.h"
|
|
#include "ShortTag.h"
|
|
#include "IntTag.h"
|
|
#include "LongTag.h"
|
|
#include "FloatTag.h"
|
|
#include "DoubleTag.h"
|
|
#include "ByteArrayTag.h"
|
|
#include "StringTag.h"
|
|
#include "ListTag.h"
|
|
#include "CompoundTag.h"
|
|
|
|
|
|
/*static*/ const std::string Tag::NullString = "";
|
|
|
|
|
|
Tag::Tag(const std::string& name)
|
|
: name(name),
|
|
errorState(0)
|
|
{
|
|
}
|
|
|
|
/*virtual*/
|
|
bool Tag::equals(const Tag& rhs) const {
|
|
return getId() == rhs.getId()
|
|
&& name == rhs.name;
|
|
}
|
|
|
|
/*virtual*/
|
|
void Tag::print(PrintStream& out) const {
|
|
print("", out);
|
|
}
|
|
|
|
/*virtual*/
|
|
void Tag::print(const std::string& prefix, PrintStream& out) const {
|
|
std::string name = getName();
|
|
|
|
out.print(prefix);
|
|
out.print(getTagName(getId()));
|
|
if (name.length() > 0) {
|
|
out.print("(\"" + name + "\")");
|
|
}
|
|
out.print(": ");
|
|
out.println(toString());
|
|
}
|
|
|
|
/*virtual*/
|
|
Tag* Tag::setName(const std::string& name) {
|
|
this->name = name;
|
|
return this;
|
|
}
|
|
|
|
/*virtual*/
|
|
std::string Tag::getName() const {
|
|
return name;
|
|
}
|
|
|
|
/*static*/
|
|
Tag* Tag::readNamedTag(IDataInput* dis) /*throws IOException*/ {
|
|
char type = dis->readByte();
|
|
if (type == Tag::TAG_End) return new EndTag();
|
|
|
|
Tag* tag = newTag(type, dis->readString());
|
|
if (!tag)
|
|
return NULL;
|
|
|
|
tag->load(dis);
|
|
return tag;
|
|
}
|
|
|
|
/*static*/
|
|
void Tag::writeNamedTag(Tag* tag, IDataOutput* dos) /*throws IOException*/ {
|
|
dos->writeByte(tag->getId());
|
|
if (tag->getId() == Tag::TAG_End) return;
|
|
|
|
dos->writeString(tag->getName());
|
|
tag->write(dos);
|
|
}
|
|
|
|
/*static*/
|
|
Tag* Tag::newTag(char type, const std::string& name)
|
|
{
|
|
switch (type) {
|
|
case TAG_End:
|
|
return new EndTag();
|
|
case TAG_Byte:
|
|
return new ByteTag(name);
|
|
case TAG_Short:
|
|
return new ShortTag(name);
|
|
case TAG_Int:
|
|
return new IntTag(name);
|
|
case TAG_Long:
|
|
return new LongTag(name);
|
|
case TAG_Float:
|
|
return new FloatTag(name);
|
|
case TAG_Double:
|
|
return new DoubleTag(name);
|
|
case TAG_Byte_Array:
|
|
return new ByteArrayTag(name);
|
|
case TAG_String:
|
|
return new StringTag(name);
|
|
case TAG_List:
|
|
return new ListTag(name);
|
|
case TAG_Compound:
|
|
return new CompoundTag(name);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/*static*/
|
|
std::string Tag::getTagName(char type) {
|
|
switch (type) {
|
|
case TAG_End:
|
|
return "TAG_End";
|
|
case TAG_Byte:
|
|
return "TAG_Byte";
|
|
case TAG_Short:
|
|
return "TAG_Short";
|
|
case TAG_Int:
|
|
return "TAG_Int";
|
|
case TAG_Long:
|
|
return "TAG_Long";
|
|
case TAG_Float:
|
|
return "TAG_Float";
|
|
case TAG_Double:
|
|
return "TAG_Double";
|
|
case TAG_Byte_Array:
|
|
return "TAG_Byte_Array";
|
|
case TAG_String:
|
|
return "TAG_String";
|
|
case TAG_List:
|
|
return "TAG_List";
|
|
case TAG_Compound:
|
|
return "TAG_Compound";
|
|
}
|
|
return "UNKNOWN";
|
|
}
|