4jcraft/Minecraft.World/IO/NBT/NbtIO.cpp
2026-03-13 17:06:56 -05:00

66 lines
2.2 KiB
C++

#include "../../Platform/stdafx.h"
#include "../Streams/InputOutputStream.h"
#include "NbtIO.h"
CompoundTag* NbtIo::readCompressed(InputStream* in) {
MemSect(26);
// 4J - this was using a try/finally block
DataInputStream dis =
DataInputStream(in); // 4J - was new GZIPInputStream as well
CompoundTag* ret = NbtIo::read((DataInput*)&dis);
dis.close();
MemSect(0);
return ret;
}
void NbtIo::writeCompressed(CompoundTag* tag, OutputStream* out) {
// 4J - this was using a try/finally block
// 4J Stu - Buffer output in 1024 byte chunks so that we can allocate
// properly in the save file
BufferedOutputStream bos = BufferedOutputStream(out, 1024);
DataOutputStream dos =
DataOutputStream(&bos); // 4J - was new GZIPOutputStream as well
NbtIo::write(tag, &dos);
dos.close();
}
// Reads tags from a stream created from the input buffer. Doesn't free the data
// in the source buffer.
CompoundTag* NbtIo::decompress(byteArray buffer) {
ByteArrayInputStream bais = ByteArrayInputStream(buffer);
// 4J - this was using a try/finally block
DataInputStream in =
DataInputStream(&bais); // 4J - was new GZIPInputStream as well
CompoundTag* ret = NbtIo::read((DataInput*)&in);
bais.reset(); // This stops the buffer referenced by the input stream from
// being freed when it goes out of context
in.close();
return ret;
}
byteArray NbtIo::compress(CompoundTag* tag) {
// 4J - this was using a try/finally block
ByteArrayOutputStream baos = ByteArrayOutputStream();
DataOutputStream dos =
DataOutputStream(&baos); // 4J - was new GZIPOutputStream as well
NbtIo::write(tag, &dos);
byteArray ret(baos.buf.length);
System::arraycopy(baos.buf, 0, &ret, 0, baos.buf.length);
dos.close();
return ret;
}
CompoundTag* NbtIo::read(DataInput* dis) {
Tag* tag = Tag::readNamedTag(dis);
if (tag->getId() == Tag::TAG_Compound) return (CompoundTag*)tag;
if (tag != NULL) delete tag;
// Root tag must be a named compound tag
return NULL;
}
void NbtIo::write(CompoundTag* tag, DataOutput* dos) {
Tag::writeNamedTag(tag, dos);
}