/* Copyright (C) 2011 TigerVNC Team. All Rights Reserved. * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ package com.tigervnc.vncviewer; import java.util.Properties; import java.io.FileOutputStream; import javax.swing.filechooser.*; /** * Simple, generic class to load up or save properties for an application. * (eg user preferences) * * While reading in values, it will automatically convert from string format, * to your choice of int or boolean, if desired. * * We assume that you want properties stored in a file named * $HOME/.yourappname, where $HOME represents the users "home directory" * * Feel free to email comments or suggestions to the author * * @version 1.0, 09/16/1997 * @author Philip Brown phil@bolthole.com */ public class UserPrefs extends Properties { String userhome=null; //This will have fileseparator on end if it String prefFile; String appName; Properties systemprops; /** * We try to read in a preferences file, from the user's "HOME" * directory. We base the name of the file, on the name of the * application we are in. * Use the getHomeDir() call if you want to know what directory * this is in. * * @param appName_ name of application calling this class */ public UserPrefs(String appName_) { appName = appName_; try { systemprops=System.getProperties(); } catch(java.security.AccessControlException e) { System.out.println("Cannot access system properties"); } // This is guaranteed as always being some valid directory, // according to spec. prefFile= getHomeDir()+getFileSeparator()+ "."+appName; try { load(new java.io.FileInputStream(prefFile)); } catch(java.security.AccessControlException e) { System.out.println("Cannot access system properties"); } catch (Exception err) { if(err instanceof java.io.FileNotFoundException) { try { store(new FileOutputStream(prefFile), appName+" preferences"); } catch (Exception e) { /* FIXME */ } } else { // FIXME - should be a dialog System.out.println("Error opening prefs file:"+err.getMessage()); } } } // Strip off any comments String trimValue(String prop) { if(prop==null) return null; int lastpos; lastpos=prop.indexOf('#'); if(lastpos==-1) lastpos=prop.length()-1; while((prop.charAt(lastpos)==' ') || (prop.charAt(lastpos)=='\t')) { lastpos--; if(lastpos==0) break; } return prop.substring(0, lastpos+1); } /** * The java spec guarantees that a "home" directory be * specified. We look it up for our own uses at initialization * If you want to do other things in the user's home dir, * this routine is an easy way to find out where it is. * * This returns string that will have trailing fileseparator, eg "/") * so you can slap together a filename directly after it, and * not worry about that sort of junk. */ final public static String getHomeDir() { String homeDir = null; try { String os = System.getProperty("os.name"); try { if (os.startsWith("Windows")) { // JRE prior to 1.5 cannot reliably determine USERPROFILE // return user.home and hope it's right... if (Integer.parseInt(System.getProperty("java.version").split("\\.")[1]) < 5) { try { homeDir = System.getProperty("user.home"); } catch(java.security.AccessControlException e) { System.out.println("Cannot access user.home system property"); } } else { homeDir = System.getenv("USERPROFILE"); } } else { try { homeDir = FileSystemView.getFileSystemView(). getDefaultDirectory().getCanonicalPath(); } catch(java.security.AccessControlException e) { System.out.println("Cannot access system property"); } } } catch (Exception e) { e.printStackTrace(); } } catch(java.security.AccessControlException e) { System.out.println("Cannot access os.name system property"); } return homeDir; } final private String getUserName() { String userName = null; try { userName = (String) System.getProperties().get("user.name"); } catch(java.security.AccessControlException e) { System.out.println("Cannot access user.name system property"); } return userName; } final public static String getFileSeparator() { String separator = null; try { separator = Character.toString(java.io.File.separatorChar); } catch(java.security.AccessControlException e) { System.out.println("Cannot access file.separator system property"); } return separator; } /** * way to directly set a preference. You'll have to * do your own type conversion. * @param prefname name of property * @param value string value of property */ public void setPref(String prefname, String value) { setProperty(prefname, value); } public void setPref(String prefname, int value) { systemprops.put(prefname, java.lang.Integer.toString(value)); } public void setPref(String prefname, boolean value) { put(prefname, (value ? "true" : "false")); } /** * Gets named resource, as a string value. * returns null if no such resource defined. * @param name name of property */ public String getString(String name) { return trimValue(getProperty(name)); } /** * Gets named resource, as a string value. * * @param name name of property * @param defval default value to remember and return , if * no existing property name found. */ public String getString(String name, String defstr) { String val = trimValue(getProperty(name)); if(val==null) { setPref(name, defstr); return defstr; } return val; } /** * look up property that is an int value * @param name name of property */ public int getInt(String name) { String strint = trimValue(getProperty(name)); int val=0; try { val = Integer.parseInt(strint); } catch (NumberFormatException err) { //we dont care } return val; } /** * look up property that is an int value * @param name name of property * @param defval default value to remember and return , if * no existing property name found. */ public int getInt(String name, int defval) { String strint = trimValue(getProperty(name)); if(strint==null) { setPref(name, String.valueOf(defval)); return defval; } int val=0; try { val = Integer.parseInt(strint); } catch (NumberFormatException err) { //we dont care } return val; } /** * look up property that is a boolean value * @param name name of property * @param defval default value to remember and return , if * no existing property name found. */ public boolean getBool(String name) { String strval = trimValue(getProperty(name)); if(strval.equals("true")) return true; return false; } /** * @param name name of property * @param defval default value to remember and return , if * no existing property name found. */ public boolean getBool(String name, boolean defval) { String strval = trimValue(getProperty(name)); if(strval==null) { setPref(name, String.valueOf(defval)); return defval; } if(strval.equals("true")) return true; return false; } /** * save user preferences to default file. Duh. */ public void Save() throws java.io.IOException { store(new FileOutputStream(prefFile), appName+" preferences"); } }