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 }