package com.limegroup.gnutella.settings; import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.Hashtable; import java.util.Set; import java.util.Iterator; import com.limegroup.gnutella.MediaType; import com.limegroup.gnutella.util.CommonUtils; import com.limegroup.gnutella.util.FileUtils; /** * Settings for sharing */ public class SharingSettings extends LimeProps { private SharingSettings() {} /** * Stores the download directory file settings for each media type by its * description key {@link MediaType#getDescriptionKey()}. The settings * are loaded lazily during the first request. */ private static final Hashtable downloadDirsByDescription = new Hashtable(); public static final File DEFAULT_SAVE_DIR = new File(CommonUtils.getUserHomeDir(), "Shared"); /** * Whether or not we're going to add an alternate for ourselves * to our shared files. Primarily set to false for testing. */ public static final BooleanSetting ADD_ALTERNATE_FOR_SELF = FACTORY.createBooleanSetting("ADD_ALTERNATE_FOR_SELF", true); /** * The directory for saving files. */ public static final FileSetting DIRECTORY_FOR_SAVING_FILES = (FileSetting)FACTORY.createFileSetting("DIRECTORY_FOR_SAVING_FILES", DEFAULT_SAVE_DIR).setAlwaysSave(true); /** * The directory where incomplete files are stored (downloads in progress). */ public static final FileSetting INCOMPLETE_DIRECTORY = FACTORY.createFileSetting("INCOMPLETE_DIRECTORY", (new File(DIRECTORY_FOR_SAVING_FILES.getValue().getParent(), "Incomplete"))); /** * A file with a snapshot of current downloading files. */ public static final FileSetting DOWNLOAD_SNAPSHOT_FILE = FACTORY.createFileSetting("DOWNLOAD_SNAPSHOT_FILE", (new File(INCOMPLETE_DIRECTORY.getValue(), "downloads.dat"))); /** * A file with a snapshot of current downloading files. */ public static final FileSetting DOWNLOAD_SNAPSHOT_BACKUP_FILE = FACTORY.createFileSetting("DOWNLOAD_SNAPSHOT_BACKUP_FILE", (new File(INCOMPLETE_DIRECTORY.getValue(), "downloads.bak"))); /** The minimum age in days for which incomplete files will be deleted. * This values may be zero or negative; doing so will cause LimeWire to * delete ALL incomplete files on startup. */ public static final IntSetting INCOMPLETE_PURGE_TIME = FACTORY.createIntSetting("INCOMPLETE_PURGE_TIME", 7); /** * Specifies whether or not completed downloads * should automatically be cleared from the download window. */ public static final BooleanSetting CLEAR_DOWNLOAD = FACTORY.createBooleanSetting("CLEAR_DOWNLOAD", false); /** * Helper method left from SettingsManager. * * Sets the directory for saving files. * * <p><b>Modifies:</b> DIRECTORY_FOR_SAVING_FILES, INCOMPLETE_DIRECTORY, * DOWNLOAD_SNAPSHOT_FILE</p> * * @param saveDir A <tt>File</tt> instance denoting the * abstract pathname of the directory for * saving files. * * @throws <tt>IOException</tt> * If the directory denoted by the directory pathname * String parameter did not exist prior to this method * call and could not be created, or if the canonical * path could not be retrieved from the file system. * * @throws <tt>NullPointerException</tt> * If the "dir" parameter is null. */ public static final void setSaveDirectory(File saveDir) throws IOException { if(saveDir == null) throw new NullPointerException(); if(!saveDir.isDirectory()) { if(!saveDir.mkdirs()) throw new IOException("could not create save dir"); } String parentDir = saveDir.getParent(); File incDir = new File(parentDir, "Incomplete"); if(!incDir.isDirectory()) { if(!incDir.mkdirs()) throw new IOException("could not create incomplete dir"); } FileUtils.setWriteable(saveDir); FileUtils.setWriteable(incDir); if(!saveDir.canRead() || !saveDir.canWrite() || !incDir.canRead() || !incDir.canWrite()) { throw new IOException("could not write to selected directory"); } // Canonicalize the files ... try { saveDir = FileUtils.getCanonicalFile(saveDir); } catch(IOException ignored) {} try { incDir = FileUtils.getCanonicalFile(incDir); } catch(IOException ignored) {} File snapFile = new File(incDir, "downloads.dat"); try { snapFile = FileUtils.getCanonicalFile(snapFile); } catch(IOException ignored) {} File snapBackup = new File(incDir, "downloads.bak"); try { snapBackup = FileUtils.getCanonicalFile(snapBackup); } catch(IOException ignored) {} DIRECTORY_FOR_SAVING_FILES.setValue(saveDir); INCOMPLETE_DIRECTORY.setValue(incDir); DOWNLOAD_SNAPSHOT_FILE.setValue(snapFile); DOWNLOAD_SNAPSHOT_BACKUP_FILE.setValue(snapBackup); } /** * Retrieves the save directory. */ public static final File getSaveDirectory() { return DIRECTORY_FOR_SAVING_FILES.getValue(); } /** * Gets all potential save directories. */ public static final Set getAllSaveDirectories() { Set set = new HashSet(7); set.add(getSaveDirectory()); synchronized(downloadDirsByDescription) { for(Iterator i = downloadDirsByDescription.values().iterator(); i.hasNext(); ) { FileSetting next = (FileSetting)i.next(); set.add(next.getValue()); } } return set; } /*********************************************************************/ /** * Default file extensions. */ private static final String DEFAULT_EXTENSIONS_TO_SHARE = "asx;html;htm;xml;txt;pdf;ps;rtf;doc;tex;mp3;mp4;wav;wax;au;aif;aiff;"+ "ra;ram;wma;wm;wmv;mp2v;mlv;mpa;mpv2;mid;midi;rmi;aifc;snd;flac;fla;"+ "mpg;mpeg;asf;qt;mov;avi;mpe;swf;dcr;gif;jpg;jpeg;jpe;png;tif;tiff;"+ "exe;zip;gz;gzip;hqx;tar;tgz;z;rmj;lqt;rar;ace;sit;smi;img;ogg;rm;"+ "bin;dmg;jve;nsv;med;mod;7z;iso;lwtp;pmf;m4a;idx;bz2;sea;pf;arc;arj;"+ "bz;tbz;mime;taz;ua;toast;lit;rpm;deb;pkg;sxw;l6t;srt;sub;idx;mkv;"+ "ogm;shn;flac;fla;dvi;rmvp;kar;cdg;ccd;cue;c;h;m;java;jar;pl;py;pyc;"+ "pyo;pyz"; /** * The shared directories. */ public static final FileSetSetting DIRECTORIES_TO_SHARE = FACTORY.createFileSetSetting("DIRECTORIES_TO_SEARCH_FOR_FILES", new File[0]); /** * Whether or not to auto-share files when using 'Download As'. */ public static final BooleanSetting SHARE_DOWNLOADED_FILES_IN_NON_SHARED_DIRECTORIES = FACTORY.createBooleanSetting("SHARE_DOWNLOADED_FILES_IN_NON_SHARED_DIRECTORIES", true); /** * File extensions that are shared. */ public static final StringSetting EXTENSIONS_TO_SHARE = FACTORY.createStringSetting("EXTENSIONS_TO_SEARCH_FOR", DEFAULT_EXTENSIONS_TO_SHARE); /** * Sets the probability (expressed as a percentage) that an incoming * freeloader will be accepted. For example, if allowed==50, an incoming * connection has a 50-50 chance being accepted. If allowed==100, all * incoming connections are accepted. */ public static final IntSetting FREELOADER_ALLOWED = FACTORY.createIntSetting("FREELOADER_ALLOWED", 100); /** * Minimum the number of files a host must share to not be considered * a freeloader. For example, if files==0, no host is considered a * freeloader. */ public static final IntSetting FREELOADER_FILES = FACTORY.createIntSetting("FREELOADER_FILES", 1); /** * The timeout value for persistent HTTP connections in milliseconds. */ public static final IntSetting PERSISTENT_HTTP_CONNECTION_TIMEOUT = FACTORY.createIntSetting("PERSISTENT_HTTP_CONNECTION_TIMEOUT", 15000); /** * Specifies whether or not completed uploads * should automatically be cleared from the upload window. */ public static final BooleanSetting CLEAR_UPLOAD = FACTORY.createBooleanSetting("CLEAR_UPLOAD", true); /** * Whether or not browsers should be allowed to perform uploads. */ public static final BooleanSetting ALLOW_BROWSER = FACTORY.createBooleanSetting("ALLOW_BROWSER", false); /** * Whether to throttle hashing of shared files. */ public static final BooleanSetting FRIENDLY_HASHING = FACTORY.createBooleanSetting("FRIENDLY_HASHING", true); /** * Returns the download directory file setting for a mediatype. The * settings are created lazily when they are requested for the first time. * The default download directory is a file called "invalidfile" the file * setting should not be used when its {@link Setting#isDefault()} returns * true. Use {@link #DIRECTORY_FOR_SAVING_FILES} instead then. * @param type the mediatype for which to look up the file setting * @return the filesetting for the media type */ public static final FileSetting getFileSettingForMediaType(MediaType type) { FileSetting setting = (FileSetting)downloadDirsByDescription.get (type.getMimeType()); if (setting == null) { setting = FACTORY.createProxyFileSetting ("DIRECTORY_FOR_SAVING_" + type.getMimeType() + "_FILES", DIRECTORY_FOR_SAVING_FILES); downloadDirsByDescription.put(type.getMimeType(), setting); } return setting; } /** * The Creative Commons explanation URL */ public static final StringSetting CREATIVE_COMMONS_INTRO_URL = FACTORY.createSettableStringSetting ("CREATIVE_COMMONS_URL","http://creativecommons.org/about/licenses/how1","creativeCommonsURL"); /** * The Creative Commons verification explanation URL */ public static final StringSetting CREATIVE_COMMONS_VERIFICATION_URL = FACTORY.createSettableStringSetting ("CREATIVE_COMMONS_VERIFICATION_URL","http://creativecommons.org/technology/embedding#2","creativeCommonsVerificationURL"); }