package com.limegroup.gnutella.gui; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.util.Random; import com.limegroup.gnutella.settings.SharingSettings; import com.limegroup.gnutella.util.FileUtils; /** * This class handles prompting the user to enter a valid save directory. */ public final class SaveDirectoryHandler { /** * Ensure that this class cannot be constructed from outside this class. */ private SaveDirectoryHandler() {} /** * Constructs a new window that prompts the user to enter a valid save * directory. * * This doesn't return until the user has chosen a valid directory. */ private static void showSaveDirectoryWindow() { File dir = null; while(!isSaveDirectoryValid(dir)) { GUIMediator.showError("ERROR_INVALID_SAVE_DIRECTORY_WINDOW"); dir = showChooser(); if(dir == null) continue; FileUtils.setWriteable(dir); } } /** * Shows the chooser & sets the save directory setting, adding the save * directory as shared, also. * * @return the selected <tt>File</tt>, or <tt>null</tt> if there were * any problems */ private static File showChooser() { File dir = FileChooserHandler.getInputDirectory(null); if(dir != null) { try { // updates Incomplete directory etc... SharingSettings.setSaveDirectory(dir); SharingSettings.DIRECTORIES_TO_SHARE.add(dir); return dir; } catch(IOException ignored) {} } return null; } /** * Utility method for checking whether or not the save directory is valid. * * @param saveDir the save directory to check for validity * @return <tt>true</tt> if the save directory is valid, otherwise * <tt>false</tt> */ public static boolean isSaveDirectoryValid(File saveDir) { if(saveDir == null || !saveDir.exists() || !saveDir.isDirectory()) return false; FileUtils.setWriteable(saveDir); Random generator = new Random(); File testFile = null; for(int i = 0; i < 10 && testFile == null; i++) { StringBuffer name = new StringBuffer(); for(int j = 0; j < 8; j++) { name.append((char)('a' + generator.nextInt('z'-'a'))); } name.append(".tmp"); testFile = new File(saveDir, name.toString()); if (testFile.exists()) { testFile = null; // try again! } } if (testFile == null) { return false; } RandomAccessFile testRAFile = null; try { testRAFile = new RandomAccessFile(testFile, "rw"); // Try to write something just to make extra sure we're OK. testRAFile.write(7); testRAFile.close(); } catch (FileNotFoundException e) { // If we could not open the file, then we can't write to that // directory. return false; } catch(IOException e) { // The directory is invalid if there was an error writing to it. return false; } finally { // Delete our test file. testFile.delete(); try { if(testRAFile != null) testRAFile.close(); } catch (IOException ignored) {} } return saveDir.canWrite(); } /** * Makes sure that the user has a valid save directory. */ public static void handleSaveDirectory() { File saveDir = SharingSettings.getSaveDirectory(); if(!isSaveDirectoryValid(saveDir)) showSaveDirectoryWindow(); } }