001 package net.minecraft.nbt;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import java.io.BufferedInputStream;
006 import java.io.ByteArrayInputStream;
007 import java.io.ByteArrayOutputStream;
008 import java.io.DataInput;
009 import java.io.DataInputStream;
010 import java.io.DataOutput;
011 import java.io.DataOutputStream;
012 import java.io.File;
013 import java.io.FileInputStream;
014 import java.io.FileOutputStream;
015 import java.io.IOException;
016 import java.io.InputStream;
017 import java.io.OutputStream;
018 import java.util.zip.GZIPInputStream;
019 import java.util.zip.GZIPOutputStream;
020
021 public 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 var1 = new DataInputStream(new BufferedInputStream(new GZIPInputStream(par0InputStream)));
029 NBTTagCompound var2;
030
031 try
032 {
033 var2 = read(var1);
034 }
035 finally
036 {
037 var1.close();
038 }
039
040 return var2;
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 var2 = new DataOutputStream(new GZIPOutputStream(par1OutputStream));
049
050 try
051 {
052 write(par0NBTTagCompound, var2);
053 }
054 finally
055 {
056 var2.close();
057 }
058 }
059
060 public static NBTTagCompound decompress(byte[] par0ArrayOfByte) throws IOException
061 {
062 DataInputStream var1 = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(par0ArrayOfByte))));
063 NBTTagCompound var2;
064
065 try
066 {
067 var2 = read(var1);
068 }
069 finally
070 {
071 var1.close();
072 }
073
074 return var2;
075 }
076
077 public static byte[] compress(NBTTagCompound par0NBTTagCompound) throws IOException
078 {
079 ByteArrayOutputStream var1 = new ByteArrayOutputStream();
080 DataOutputStream var2 = new DataOutputStream(new GZIPOutputStream(var1));
081
082 try
083 {
084 write(par0NBTTagCompound, var2);
085 }
086 finally
087 {
088 var2.close();
089 }
090
091 return var1.toByteArray();
092 }
093
094 @SideOnly(Side.CLIENT)
095 public static void safeWrite(NBTTagCompound par0NBTTagCompound, File par1File) throws IOException
096 {
097 File var2 = new File(par1File.getAbsolutePath() + "_tmp");
098
099 if (var2.exists())
100 {
101 var2.delete();
102 }
103
104 write(par0NBTTagCompound, var2);
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 var2.renameTo(par1File);
118 }
119 }
120
121 /**
122 * Reads from a CompressedStream.
123 */
124 public static NBTTagCompound read(DataInput par0DataInput) throws IOException
125 {
126 NBTBase var1 = NBTBase.readNamedTag(par0DataInput);
127
128 if (var1 instanceof NBTTagCompound)
129 {
130 return (NBTTagCompound)var1;
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 var2 = new DataOutputStream(new FileOutputStream(par1File));
146
147 try
148 {
149 write(par0NBTTagCompound, var2);
150 }
151 finally
152 {
153 var2.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 var1 = new DataInputStream(new FileInputStream(par0File));
166 NBTTagCompound var2;
167
168 try
169 {
170 var2 = read(var1);
171 }
172 finally
173 {
174 var1.close();
175 }
176
177 return var2;
178 }
179 }
180 }