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