mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-24 06:43:35 +00:00
66 lines
2.2 KiB
C++
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);
|
|
} |