001    package net.minecraft.src;
002    
003    import java.io.DataInputStream;
004    import java.io.DataOutputStream;
005    import java.io.File;
006    import java.io.IOException;
007    import java.util.HashMap;
008    import java.util.Iterator;
009    import java.util.Map;
010    
011    public class RegionFileCache
012    {
013        /** A map containing Files as keys and RegionFiles as values */
014        private static final Map regionsByFilename = new HashMap();
015    
016        public static synchronized RegionFile createOrLoadRegionFile(File par0File, int par1, int par2)
017        {
018            File var3 = new File(par0File, "region");
019            File var4 = new File(var3, "r." + (par1 >> 5) + "." + (par2 >> 5) + ".mca");
020            RegionFile var6 = (RegionFile) regionsByFilename.get(var4);
021    
022            if (var6 != null)
023            {
024                return var6;
025            }
026    
027            if (!var3.exists())
028            {
029                var3.mkdirs();
030            }
031    
032            if (regionsByFilename.size() >= 256)
033            {
034                clearRegionFileReferences();
035            }
036    
037            var6 = new RegionFile(var4);
038            regionsByFilename.put(var4, var6);
039            return var6;
040        }
041    
042        /**
043         * Saves the current Chunk Map Cache
044         */
045        public static synchronized void clearRegionFileReferences()
046        {
047            Iterator var0 = regionsByFilename.values().iterator();
048    
049            while (var0.hasNext())
050            {
051                try
052                {
053                    RegionFile var2 = (RegionFile)var0.next();
054    
055                    if (var2 != null)
056                    {
057                        var2.close();
058                    }
059                }
060                catch (IOException var3)
061                {
062                    var3.printStackTrace();
063                }
064            }
065    
066            regionsByFilename.clear();
067        }
068    
069        /**
070         * Returns an input stream for the specified chunk. Args: worldDir, chunkX, chunkZ
071         */
072        public static DataInputStream getChunkInputStream(File par0File, int par1, int par2)
073        {
074            RegionFile var3 = createOrLoadRegionFile(par0File, par1, par2);
075            return var3.getChunkDataInputStream(par1 & 31, par2 & 31);
076        }
077    
078        /**
079         * Returns an output stream for the specified chunk. Args: worldDir, chunkX, chunkZ
080         */
081        public static DataOutputStream getChunkOutputStream(File par0File, int par1, int par2)
082        {
083            RegionFile var3 = createOrLoadRegionFile(par0File, par1, par2);
084            return var3.getChunkDataOutputStream(par1 & 31, par2 & 31);
085        }
086    }