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