    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    }