package com.limegroup.gnutella.util; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.Properties; import org.limewire.util.FileUtils; /** Holds runtime settings for Portable LimeWire. */ public class PortableImpl implements Portable { /** File name of portable settings next to where we're running. */ static final String PORTABLE_FILE = "portable.props"; /** File name of program settings in the settings folder. */ static final String PROGRAM_FILE = "limewire.props"; /** Property key for source to copy from a CD-R. */ static final String SOURCE_KEY = "SOURCE"; /** Property key for portable settings location. */ static final String SETTINGS_KEY = "SETTINGS"; /** Default property value for portable settings location. */ static final String DEFAULT_SETTINGS_VALUE = "Settings"; /** Property key prefix for portable paths to resolve and inject. */ static final String KEY_PREFIX = "PORTABLE_PATH_"; /** Absolute path to settings directory, or null if no portable settings. */ private File path; /** null if we loaded good portable settings without error. */ private IOException exception; /** Reads settings where we're running for Portable LimeWire. */ public PortableImpl() { try { // Read portable settings and find out where program settings should be File portablePath = new File(PORTABLE_FILE); if (!portablePath.exists()) return; // No portable settings, we're running normally Properties portableProperties = FileUtils.readProperties(portablePath); path = FileUtils.resolveSpecialPath(portableProperties.getProperty(SETTINGS_KEY)); // Copy in settings from a read-only location if (portableProperties.containsKey(SOURCE_KEY)) { File source = FileUtils.resolveSpecialPath(portableProperties.getProperty(SOURCE_KEY)); if (!path.exists()) FileUtils.copyDirectory(source, path); } // Open the program's settings file Properties programProperties = new Properties(); File programPath = new File(path, PROGRAM_FILE); if (programPath.exists()) programProperties = FileUtils.readProperties(programPath); // Loop through portable settings that we need to set in the program's settings boolean save = false; Iterator i = portableProperties.keySet().iterator(); while (i.hasNext()) { String portableKey = (String)i.next(); if (portableKey.startsWith(KEY_PREFIX)) { // Turn portable "PORTABLE_PATH_NAME=special path" into program "NAME=absolute path" String key = portableKey.substring(KEY_PREFIX.length(), portableKey.length()).trim(); if (key.length() != 0) { String value = FileUtils.resolveSpecialPath(portableProperties.getProperty(portableKey)).getPath(); programProperties.setProperty(key, value); save = true; } } } // Save the edits we made to the program's settings file if (save) { FileUtils.makeFolder(path); FileUtils.writeProperties(programPath, programProperties); } // Catch and save the exception to record that settings were bad or there was an error } catch (IOException e) { exception = e; } } /** true if there are portable settings, even if they're bad. */ public boolean isPortable() { return path != null || exception != null; } /** Absolute path to the settings directory as portable settings define, null if no settings or bad settings. */ public File getSettingsLocation() { return path; } /** Default absolute path to portable settings directory. */ public static File getDefaultSettingsLocation() throws IOException { return FileUtils.resolveSpecialPath(PortableImpl.DEFAULT_SETTINGS_VALUE); } }