package net.sf.freecol.common.io; import java.io.File; import java.io.IOException; import java.io.InputStream; import javax.swing.filechooser.FileSystemView; public class FreeColDirectories { public static final String COPYRIGHT = "Copyright (C) 2003-2012 The FreeCol Team"; public static final String LICENSE = "http://www.gnu.org/licenses/gpl.html"; public static final String REVISION = "$Revision: 2763 $"; private static File saveDirectory; /** Directory containing automatically created save games. * At program start, the path of this directory is based on the path * where to store regular save games. If the value of saveGame is * changed by the user during the game, then the value of * autoSaveDirectory will not be effected. */ private static File autoSaveDirectory; private static File mainUserDirectory = null; private static File tcUserDirectory; private static File userModsDirectory; private static String tc = FreeColDirectories.DEFAULT_TC; private static File savegameFile = null; public static final String DEFAULT_TC = "freecol"; private static String dataFolder = "data"; private static File clientOptionsFile = null; private static final String HIGH_SCORE_FILE = "HighScores.xml"; private static final String DIRECTORY = "rules"; private static final String STRINGS_DIRECTORY = "strings"; /** * Creates a freecol dir for the current user. * * The directory is created within the current user's * home directory. This directory will be called "freecol" * and underneath that directory a "save" directory will * be created. * * For MacOS X the Library/FreeCol is used * (which is the standard path for application related files). * * For os.name beginning with "Windows" JFileChooser() is used to * find the path to "My Documents" (or localized equivalent) */ public static void createAndSetDirectories() { // TODO: The location of the save directory should be determined by the installer.; String freeColDirectoryName = "/".equals(System.getProperty("file.separator")) ? ".freecol" : "freecol"; File userHome = FileSystemView.getFileSystemView().getDefaultDirectory(); // Checks for OS specific paths, however if the old {home}/.freecol exists // that overrides OS-specifics for backwards compatibility. // TODO: remove compatibility code if (System.getProperty("os.name").equals("Mac OS X")) { // We are running on a Mac and should use {home}/Library/FreeCol if (!new File(userHome, freeColDirectoryName).isDirectory()) { userHome = new File(userHome, "Library"); freeColDirectoryName = "FreeCol"; } } else if (System.getProperty("os.name").startsWith("Windows")) { // We are running on Windows and should use "My Documents" (or localized equivalent) if (!new File(userHome, freeColDirectoryName).isDirectory()) { freeColDirectoryName = "FreeCol"; } } if (FreeColDirectories.mainUserDirectory == null) { FreeColDirectories.setMainUserDirectory(new File(userHome, freeColDirectoryName)); } if (!FreeColDirectories.insistDirectory(FreeColDirectories.mainUserDirectory)) return; if (FreeColDirectories.saveDirectory == null) { FreeColDirectories.saveDirectory = new File(FreeColDirectories.getMainUserDirectory(), "save"); } if (!FreeColDirectories.insistDirectory(FreeColDirectories.saveDirectory)) FreeColDirectories.saveDirectory = null; FreeColDirectories.autoSaveDirectory = new File(FreeColDirectories.saveDirectory, "autosave"); if (!FreeColDirectories.insistDirectory(FreeColDirectories.autoSaveDirectory)) FreeColDirectories.autoSaveDirectory = null; FreeColDirectories.tcUserDirectory = new File(FreeColDirectories.getMainUserDirectory(), FreeColDirectories.getTc()); if (!FreeColDirectories.insistDirectory(FreeColDirectories.tcUserDirectory)) FreeColDirectories.tcUserDirectory = null; FreeColDirectories.userModsDirectory = new File(FreeColDirectories.getMainUserDirectory(), "mods"); if (!FreeColDirectories.insistDirectory(FreeColDirectories.userModsDirectory)) FreeColDirectories.userModsDirectory = null; if (FreeColDirectories.clientOptionsFile == null) { FreeColDirectories.clientOptionsFile = (FreeColDirectories.tcUserDirectory == null) ? null : new File(FreeColDirectories.tcUserDirectory, "options.xml"); } } /** * Returns the directory where the autogenerated savegames * should be put. * * @return The directory. */ public static File getAutosaveDirectory() { return autoSaveDirectory; } public static File getBaseDirectory() { return new File(getDataDirectory(), "base"); } /** * Returns the file containing the client options. * @return The file. */ public static File getClientOptionsFile() { return clientOptionsFile; } /** * Returns the data directory. * @return The directory where the data files are located. */ public static File getDataDirectory() { if (FreeColDirectories.dataFolder.equals("")) { return new File("data"); } else { return new File(FreeColDirectories.dataFolder); } } public static File getHighScoreFile() { return new File(getDataDirectory(), FreeColDirectories.HIGH_SCORE_FILE); } /** * Returns the directory containing language property files. * * @return a <code>File</code> value */ public static File getI18nDirectory() { return new File(getDataDirectory(), FreeColDirectories.STRINGS_DIRECTORY); } public static File getMainUserDirectory() { return mainUserDirectory; } public static File getMapsDirectory() { return new File(getDataDirectory(), "maps"); } /** * Returns the directory for saving options. * * @return The directory. */ public static File getOptionsDirectory() { return tcUserDirectory; } public static File getRulesClassicDirectory() { return new File(getDataDirectory(), "rules/classic"); } public static File getRulesDirectory() { return new File(getDataDirectory(), FreeColDirectories.DIRECTORY); } /** * Returns the directory where the savegames should be put. * @return The directory where the savegames should be put. */ public static File getSaveDirectory() { return saveDirectory; } public static File getSavegameFile() { return savegameFile; } public static InputStream getSpecificationInputStream() throws IOException { final FreeColTcFile tcData = new FreeColTcFile(getTc()); return tcData.getSpecificationInputStream(); } /** * Gets the mods directory. * * @return The directory where the standard mods are located. */ public static File getStandardModsDirectory() { return new File(FreeColDirectories.getDataDirectory(), "mods"); } public static String getTc() { return tc; } /** * Gets the user mods directory. * * @return The directory where user mods are located, or null if none. */ public static File getUserModsDirectory() { return userModsDirectory; } /** * Try to make a directory. * * @param file A <code>File</code> specifying where to make the directory. * @return True if the directory is there after the call. */ public static boolean insistDirectory(File file) { if (file.exists()) { if (file.isDirectory()) return true; System.out.println("Could not create directory " + file.getName() + " under " + file.getParentFile().getName() + " because a non-directory with that name is already there."); return false; } return file.mkdir(); } public static void setClientOptionsFile(File file) { FreeColDirectories.clientOptionsFile = file; } public static void setDataFolder(String dataFolder) { FreeColDirectories.dataFolder = dataFolder; } public static void setMainUserDirectory(File mainUserDirectory) { FreeColDirectories.mainUserDirectory = mainUserDirectory; } /** * Set the directory where the savegames should be put. * @param saveDirectory a <code>File</code> value for the savegame directory */ public static void setSaveDirectory(File saveDirectory) { FreeColDirectories.saveDirectory = saveDirectory; } public static void setSavegameFile(File savegameFile) { FreeColDirectories.savegameFile = savegameFile; } public static void setSaveGameFile(String name) { setSavegameFile(new File(name)); if (!getSavegameFile().exists() || !getSavegameFile().isFile()) { setSavegameFile(new File(getSaveDirectory(), name)); if (!getSavegameFile().exists() || !getSavegameFile().isFile()) { System.out.println("Could not find savegame file: " + name); System.exit(1); } } else { setSaveDirectory(getSavegameFile().getParentFile()); } } public static void setTc(String tc) { FreeColDirectories.tc = tc; } }