    001package net.minecraft.nbt;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.io.BufferedInputStream;
    006import java.io.ByteArrayInputStream;
    007import java.io.ByteArrayOutputStream;
    008import java.io.DataInput;
    009import java.io.DataInputStream;
    010import java.io.DataOutput;
    011import java.io.DataOutputStream;
    012import java.io.File;
    013import java.io.FileInputStream;
    014import java.io.FileOutputStream;
    015import java.io.IOException;
    016import java.io.InputStream;
    017import java.io.OutputStream;
    018import java.util.zip.GZIPInputStream;
    019import java.util.zip.GZIPOutputStream;
    020
    021public class CompressedStreamTools
    022{
    023    /**
    024     * Load the gzipped compound from the inputstream.
    025     */
    026    public static NBTTagCompound readCompressed(InputStream par0InputStream) throws IOException
    027    {
    028        DataInputStream datainputstream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(par0InputStream)));
    029        NBTTagCompound nbttagcompound;
    030
    031        try
    032        {
    033            nbttagcompound = read(datainputstream);
    034        }
    035        finally
    036        {
    037            datainputstream.close();
    038        }
    039
    040        return nbttagcompound;
    041    }
    042
    043    /**
    044     * Write the compound, gzipped, to the outputstream.
    045     */
    046    public static void writeCompressed(NBTTagCompound par0NBTTagCompound, OutputStream par1OutputStream) throws IOException
    047    {
    048        DataOutputStream dataoutputstream = new DataOutputStream(new GZIPOutputStream(par1OutputStream));
    049
    050        try
    051        {
    052            write(par0NBTTagCompound, dataoutputstream);
    053        }
    054        finally
    055        {
    056            dataoutputstream.close();
    057        }
    058    }
    059
    060    public static NBTTagCompound decompress(byte[] par0ArrayOfByte) throws IOException
    061    {
    062        DataInputStream datainputstream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(par0ArrayOfByte))));
    063        NBTTagCompound nbttagcompound;
    064
    065        try
    066        {
    067            nbttagcompound = read(datainputstream);
    068        }
    069        finally
    070        {
    071            datainputstream.close();
    072        }
    073
    074        return nbttagcompound;
    075    }
    076
    077    public static byte[] compress(NBTTagCompound par0NBTTagCompound) throws IOException
    078    {
    079        ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();
    080        DataOutputStream dataoutputstream = new DataOutputStream(new GZIPOutputStream(bytearrayoutputstream));
    081
    082        try
    083        {
    084            write(par0NBTTagCompound, dataoutputstream);
    085        }
    086        finally
    087        {
    088            dataoutputstream.close();
    089        }
    090
    091        return bytearrayoutputstream.toByteArray();
    092    }
    093
    094    @SideOnly(Side.CLIENT)
    095    public static void safeWrite(NBTTagCompound par0NBTTagCompound, File par1File) throws IOException
    096    {
    097        File file2 = new File(par1File.getAbsolutePath() + "_tmp");
    098
    099        if (file2.exists())
    100        {
    101            file2.delete();
    102        }
    103
    104        write(par0NBTTagCompound, file2);
    105
    106        if (par1File.exists())
    107        {
    108            par1File.delete();
    109        }
    110
    111        if (par1File.exists())
    112        {
    113            throw new IOException("Failed to delete " + par1File);
    114        }
    115        else
    116        {
    117            file2.renameTo(par1File);
    118        }
    119    }
    120
    121    /**
    122     * Reads from a CompressedStream.
    123     */
    124    public static NBTTagCompound read(DataInput par0DataInput) throws IOException
    125    {
    126        NBTBase nbtbase = NBTBase.readNamedTag(par0DataInput);
    127
    128        if (nbtbase instanceof NBTTagCompound)
    129        {
    130            return (NBTTagCompound)nbtbase;
    131        }
    132        else
    133        {
    134            throw new IOException("Root tag must be a named compound tag");
    135        }
    136    }
    137
    138    public static void write(NBTTagCompound par0NBTTagCompound, DataOutput par1DataOutput) throws IOException
    139    {
    140        NBTBase.writeNamedTag(par0NBTTagCompound, par1DataOutput);
    141    }
    142
    143    public static void write(NBTTagCompound par0NBTTagCompound, File par1File) throws IOException
    144    {
    145        DataOutputStream dataoutputstream = new DataOutputStream(new FileOutputStream(par1File));
    146
    147        try
    148        {
    149            write(par0NBTTagCompound, dataoutputstream);
    150        }
    151        finally
    152        {
    153            dataoutputstream.close();
    154        }
    155    }
    156
    157    public static NBTTagCompound read(File par0File) throws IOException
    158    {
    159        if (!par0File.exists())
    160        {
    161            return null;
    162        }
    163        else
    164        {
    165            DataInputStream datainputstream = new DataInputStream(new FileInputStream(par0File));
    166            NBTTagCompound nbttagcompound;
    167
    168            try
    169            {
    170                nbttagcompound = read(datainputstream);
    171            }
    172            finally
    173            {
    174                datainputstream.close();
    175            }
    176
    177            return nbttagcompound;
    178        }
    179    }
    180}