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 }