001 package net.minecraft.stats;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import java.io.BufferedReader;
006 import java.io.File;
007 import java.io.FileReader;
008 import java.io.FileWriter;
009 import java.io.IOException;
010 import java.io.PrintWriter;
011 import java.util.Map;
012 import net.minecraft.util.Session;
013
014 @SideOnly(Side.CLIENT)
015 public class StatsSyncher
016 {
017 private volatile boolean isBusy = false;
018 private volatile Map field_77430_b = null;
019 private volatile Map field_77431_c = null;
020
021 /**
022 * The StatFileWriter object, presumably used to write to the statistics files
023 */
024 private StatFileWriter statFileWriter;
025
026 /** A file named 'stats_' [lower case username] '_unsent.dat' */
027 private File unsentDataFile;
028
029 /** A file named 'stats_' [lower case username] '.dat' */
030 private File dataFile;
031
032 /** A file named 'stats_' [lower case username] '_unsent.tmp' */
033 private File unsentTempFile;
034
035 /** A file named 'stats_' [lower case username] '.tmp' */
036 private File tempFile;
037
038 /** A file named 'stats_' [lower case username] '_unsent.old' */
039 private File unsentOldFile;
040
041 /** A file named 'stats_' [lower case username] '.old' */
042 private File oldFile;
043
044 /** The Session object */
045 private Session theSession;
046 private int field_77433_l = 0;
047 private int field_77434_m = 0;
048
049 public StatsSyncher(Session par1Session, StatFileWriter par2StatFileWriter, File par3File)
050 {
051 this.unsentDataFile = new File(par3File, "stats_" + par1Session.username.toLowerCase() + "_unsent.dat");
052 this.dataFile = new File(par3File, "stats_" + par1Session.username.toLowerCase() + ".dat");
053 this.unsentOldFile = new File(par3File, "stats_" + par1Session.username.toLowerCase() + "_unsent.old");
054 this.oldFile = new File(par3File, "stats_" + par1Session.username.toLowerCase() + ".old");
055 this.unsentTempFile = new File(par3File, "stats_" + par1Session.username.toLowerCase() + "_unsent.tmp");
056 this.tempFile = new File(par3File, "stats_" + par1Session.username.toLowerCase() + ".tmp");
057
058 if (!par1Session.username.toLowerCase().equals(par1Session.username))
059 {
060 this.func_77412_a(par3File, "stats_" + par1Session.username + "_unsent.dat", this.unsentDataFile);
061 this.func_77412_a(par3File, "stats_" + par1Session.username + ".dat", this.dataFile);
062 this.func_77412_a(par3File, "stats_" + par1Session.username + "_unsent.old", this.unsentOldFile);
063 this.func_77412_a(par3File, "stats_" + par1Session.username + ".old", this.oldFile);
064 this.func_77412_a(par3File, "stats_" + par1Session.username + "_unsent.tmp", this.unsentTempFile);
065 this.func_77412_a(par3File, "stats_" + par1Session.username + ".tmp", this.tempFile);
066 }
067
068 this.statFileWriter = par2StatFileWriter;
069 this.theSession = par1Session;
070
071 if (this.unsentDataFile.exists())
072 {
073 par2StatFileWriter.writeStats(this.func_77417_a(this.unsentDataFile, this.unsentTempFile, this.unsentOldFile));
074 }
075
076 this.beginReceiveStats();
077 }
078
079 private void func_77412_a(File par1File, String par2Str, File par3File)
080 {
081 File var4 = new File(par1File, par2Str);
082
083 if (var4.exists() && !var4.isDirectory() && !par3File.exists())
084 {
085 var4.renameTo(par3File);
086 }
087 }
088
089 private Map func_77417_a(File par1File, File par2File, File par3File)
090 {
091 return par1File.exists() ? this.func_77413_a(par1File) : (par3File.exists() ? this.func_77413_a(par3File) : (par2File.exists() ? this.func_77413_a(par2File) : null));
092 }
093
094 private Map func_77413_a(File par1File)
095 {
096 BufferedReader var2 = null;
097
098 try
099 {
100 var2 = new BufferedReader(new FileReader(par1File));
101 String var3 = "";
102 StringBuilder var4 = new StringBuilder();
103
104 while ((var3 = var2.readLine()) != null)
105 {
106 var4.append(var3);
107 }
108
109 Map var5 = StatFileWriter.func_77453_b(var4.toString());
110 return var5;
111 }
112 catch (Exception var15)
113 {
114 var15.printStackTrace();
115 }
116 finally
117 {
118 if (var2 != null)
119 {
120 try
121 {
122 var2.close();
123 }
124 catch (Exception var14)
125 {
126 var14.printStackTrace();
127 }
128 }
129 }
130
131 return null;
132 }
133
134 private void func_77421_a(Map par1Map, File par2File, File par3File, File par4File) throws IOException
135 {
136 PrintWriter var5 = new PrintWriter(new FileWriter(par3File, false));
137
138 try
139 {
140 var5.print(StatFileWriter.func_77441_a(this.theSession.username, "local", par1Map));
141 }
142 finally
143 {
144 var5.close();
145 }
146
147 if (par4File.exists())
148 {
149 par4File.delete();
150 }
151
152 if (par2File.exists())
153 {
154 par2File.renameTo(par4File);
155 }
156
157 par3File.renameTo(par2File);
158 }
159
160 /**
161 * Attempts to begin receiving stats from the server. Will throw an IllegalStateException if the syncher is already
162 * busy.
163 */
164 public void beginReceiveStats()
165 {
166 if (this.isBusy)
167 {
168 throw new IllegalStateException("Can\'t get stats from server while StatsSyncher is busy!");
169 }
170 else
171 {
172 this.field_77433_l = 100;
173 this.isBusy = true;
174 (new ThreadStatSyncherReceive(this)).start();
175 }
176 }
177
178 /**
179 * Attempts to begin sending stats to the server. Will throw an IllegalStateException if the syncher is already
180 * busy.
181 */
182 public void beginSendStats(Map par1Map)
183 {
184 if (this.isBusy)
185 {
186 throw new IllegalStateException("Can\'t save stats while StatsSyncher is busy!");
187 }
188 else
189 {
190 this.field_77433_l = 100;
191 this.isBusy = true;
192 (new ThreadStatSyncherSend(this, par1Map)).start();
193 }
194 }
195
196 public void syncStatsFileWithMap(Map par1Map)
197 {
198 int var2 = 30;
199
200 while (this.isBusy)
201 {
202 --var2;
203
204 if (var2 <= 0)
205 {
206 break;
207 }
208
209 try
210 {
211 Thread.sleep(100L);
212 }
213 catch (InterruptedException var10)
214 {
215 var10.printStackTrace();
216 }
217 }
218
219 this.isBusy = true;
220
221 try
222 {
223 this.func_77421_a(par1Map, this.unsentDataFile, this.unsentTempFile, this.unsentOldFile);
224 }
225 catch (Exception var8)
226 {
227 var8.printStackTrace();
228 }
229 finally
230 {
231 this.isBusy = false;
232 }
233 }
234
235 public boolean func_77425_c()
236 {
237 return this.field_77433_l <= 0 && !this.isBusy && this.field_77431_c == null;
238 }
239
240 public void func_77422_e()
241 {
242 if (this.field_77433_l > 0)
243 {
244 --this.field_77433_l;
245 }
246
247 if (this.field_77434_m > 0)
248 {
249 --this.field_77434_m;
250 }
251
252 if (this.field_77431_c != null)
253 {
254 this.statFileWriter.func_77448_c(this.field_77431_c);
255 this.field_77431_c = null;
256 }
257
258 if (this.field_77430_b != null)
259 {
260 this.statFileWriter.func_77452_b(this.field_77430_b);
261 this.field_77430_b = null;
262 }
263 }
264
265 static Map func_77419_a(StatsSyncher par0StatsSyncher)
266 {
267 return par0StatsSyncher.field_77430_b;
268 }
269
270 static File func_77408_b(StatsSyncher par0StatsSyncher)
271 {
272 return par0StatsSyncher.dataFile;
273 }
274
275 static File func_77407_c(StatsSyncher par0StatsSyncher)
276 {
277 return par0StatsSyncher.tempFile;
278 }
279
280 static File func_77411_d(StatsSyncher par0StatsSyncher)
281 {
282 return par0StatsSyncher.oldFile;
283 }
284
285 static void func_77414_a(StatsSyncher par0StatsSyncher, Map par1Map, File par2File, File par3File, File par4File) throws IOException
286 {
287 par0StatsSyncher.func_77421_a(par1Map, par2File, par3File, par4File);
288 }
289
290 static Map func_77416_a(StatsSyncher par0StatsSyncher, Map par1Map)
291 {
292 return par0StatsSyncher.field_77430_b = par1Map;
293 }
294
295 static Map func_77410_a(StatsSyncher par0StatsSyncher, File par1File, File par2File, File par3File)
296 {
297 return par0StatsSyncher.func_77417_a(par1File, par2File, par3File);
298 }
299
300 static boolean setBusy(StatsSyncher par0StatsSyncher, boolean par1)
301 {
302 return par0StatsSyncher.isBusy = par1;
303 }
304
305 static File getUnsentDataFile(StatsSyncher par0StatsSyncher)
306 {
307 return par0StatsSyncher.unsentDataFile;
308 }
309
310 static File getUnsentTempFile(StatsSyncher par0StatsSyncher)
311 {
312 return par0StatsSyncher.unsentTempFile;
313 }
314
315 static File getUnsentOldFile(StatsSyncher par0StatsSyncher)
316 {
317 return par0StatsSyncher.unsentOldFile;
318 }
319 }