package net.minecraft.server;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class NBTCompressedStreamTools {
public static NBTTagCompound a(InputStream inputstream) throws IOException {
DataInputStream datainputstream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(inputstream)));
NBTTagCompound nbttagcompound;
try {
nbttagcompound = a((DataInput) datainputstream, NBTReadLimiter.a);
} finally {
datainputstream.close();
}
return nbttagcompound;
}
public static void a(NBTTagCompound nbttagcompound, OutputStream outputstream) throws IOException {
DataOutputStream dataoutputstream = new DataOutputStream(new BufferedOutputStream(new GZIPOutputStream(outputstream)));
try {
a(nbttagcompound, (DataOutput) dataoutputstream);
} finally {
dataoutputstream.close();
}
}
public static NBTTagCompound a(DataInputStream datainputstream) throws IOException {
return a((DataInput) datainputstream, NBTReadLimiter.a);
}
public static NBTTagCompound a(DataInput datainput, NBTReadLimiter nbtreadlimiter) throws IOException {
// Spigot start
if ( datainput instanceof io.netty.buffer.ByteBufInputStream )
{
datainput = new DataInputStream(new org.spigotmc.LimitStream((InputStream) datainput, nbtreadlimiter));
}
// Spigot end
NBTBase nbtbase = a(datainput, 0, nbtreadlimiter);
if (nbtbase instanceof NBTTagCompound) {
return (NBTTagCompound) nbtbase;
} else {
throw new IOException("Root tag must be a named compound tag");
}
}
public static void a(NBTTagCompound nbttagcompound, DataOutput dataoutput) throws IOException {
a((NBTBase) nbttagcompound, dataoutput);
}
private static void a(NBTBase nbtbase, DataOutput dataoutput) throws IOException {
dataoutput.writeByte(nbtbase.getTypeId());
if (nbtbase.getTypeId() != 0) {
dataoutput.writeUTF("");
nbtbase.write(dataoutput);
}
}
private static NBTBase a(DataInput datainput, int i, NBTReadLimiter nbtreadlimiter) throws IOException {
byte b0 = datainput.readByte();
if (b0 == 0) {
return new NBTTagEnd();
} else {
datainput.readUTF();
NBTBase nbtbase = NBTBase.createTag(b0);
try {
nbtbase.load(datainput, i, nbtreadlimiter);
return nbtbase;
} catch (IOException ioexception) {
CrashReport crashreport = CrashReport.a(ioexception, "Loading NBT data");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("NBT Tag");
crashreportsystemdetails.a("Tag name", (Object) "[UNNAMED TAG]");
crashreportsystemdetails.a("Tag type", (Object) Byte.valueOf(b0));
throw new ReportedException(crashreport);
}
}
}
}