00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.faces;
00023
00024 import com.realtime.crossfire.jxclient.util.FilenameUtils;
00025 import com.realtime.crossfire.jxclient.util.Images;
00026 import java.io.File;
00027 import java.io.FileInputStream;
00028 import java.io.IOException;
00029 import javax.swing.Icon;
00030 import javax.swing.ImageIcon;
00031 import org.jetbrains.annotations.NotNull;
00032 import org.jetbrains.annotations.Nullable;
00033
00038 public class FileCache implements ImageCache {
00039
00043 @NotNull
00044 private final File cacheDir;
00045
00050 public FileCache(@NotNull final File cacheDir) {
00051 this.cacheDir = cacheDir;
00052 if (!cacheDir.isDirectory() && !cacheDir.mkdirs()) {
00053 System.err.println(cacheDir+": cannot create directory");
00054 }
00055 }
00056
00060 @Nullable
00061 @Override
00062 public ImageIcon load(@NotNull final Face face) {
00063 return load(face.getFaceName(), face.getFaceChecksum());
00064 }
00065
00073 @Nullable
00074 private ImageIcon load(@NotNull final String faceName, final int faceChecksum) {
00075 final File file = getImageFileName(faceName, faceChecksum);
00076 final long len = file.length();
00077 if (len >= 0x10000 || len <= 0) {
00078 return null;
00079 }
00080 final byte[] data = new byte[(int)len];
00081 try {
00082 final FileInputStream fis = new FileInputStream(file);
00083 try {
00084 if (fis.read(data) != data.length) {
00085 return null;
00086 }
00087 } finally {
00088 fis.close();
00089 }
00090 } catch (final IOException ignored) {
00091 return null;
00092 }
00093 final ImageIcon imageIcon = new ImageIcon(data);
00094 return imageIcon.getIconWidth() <= 0 && imageIcon.getIconHeight() <= 0 ? null : imageIcon;
00095 }
00096
00100 @Override
00101 public void save(@NotNull final Face face, @NotNull final ImageIcon imageIcon) {
00102 save(face.getFaceName(), face.getFaceChecksum(), imageIcon);
00103 }
00104
00111 public void save(@NotNull final String faceName, final int faceChecksum, @NotNull final Icon imageIcon) {
00112 Images.saveImageIcon(getImageFileName(faceName, faceChecksum), imageIcon);
00113 }
00114
00121 @NotNull
00122 private File getImageFileName(@NotNull final String faceName, final int faceChecksum) {
00123 final String quotedFaceName = FilenameUtils.quoteName(faceName);
00124 final String dirName = quotedFaceName.substring(0, Math.min(2, quotedFaceName.length()));
00125 final File dir = new File(new File(cacheDir, dirName), quotedFaceName);
00126 if (!dir.exists() && !dir.mkdirs()) {
00127 System.err.println("Cannot create directory: "+dir);
00128 }
00129 return new File(dir, Integer.toString(faceChecksum));
00130 }
00131
00132 }