/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. * Copyright 2004-2005 Cendio AB. * Copyright 2012 Brian P. Hinz * * 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. */ // // Configuration - class for dealing with configuration parameters. // package com.tigervnc.rfb; import java.io.FileInputStream; import java.io.PrintWriter; import java.lang.reflect.Field; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; import com.tigervnc.vncviewer.VncViewer; public class Configuration { static LogWriter vlog = new LogWriter("Configuration"); private static final String IDENTIFIER_STRING = "TigerVNC Configuration file Version 1.0"; public enum ConfigurationObject { ConfGlobal, ConfServer, ConfViewer }; // -=- The Global/server/viewer Configuration objects private static Configuration global_ = null; private static Configuration server_ = null; private static Configuration viewer_ = null; public static Configuration global() { if (global_ == null) global_ = new Configuration("Global"); return global_; } public static Configuration server() { if (server_ == null) server_ = new Configuration("Server"); return server_; } public static Configuration viewer() { if (viewer_ == null) viewer_ = new Configuration("Viewer"); return viewer_; } // Enable server/viewer specific parameters public static void enableServerParams() { global().appendConfiguration(server()); } public static void enableViewerParams() { global().appendConfiguration(viewer()); } // Append configuration object to this instance. // NOTE: conf instance can be only one configuration object public void appendConfiguration(Configuration conf) { conf._next = _next; _next = conf; } // -=- Configuration implementation public Configuration(String name_, Configuration attachToGroup) { name = name_; head = null; _next = null; if (attachToGroup != null) { _next = attachToGroup._next; attachToGroup._next = this; } } public Configuration(String name_) { this(name_, null); } // - Return the buffer containing the Configuration's name final public String getName() { return name; } // - Assignment operator. For every Parameter in this Configuration's // group, get()s the corresponding source parameter and copies its // content. public Configuration assign(Configuration src) { VoidParameter current = head; while (current != null) { VoidParameter srcParam = ((Configuration)src).get(current.getName()); if (srcParam != null) { current.immutable = false; String value = srcParam.getValueStr(); vlog.debug("operator=("+current.getName()+", "+value+")"); current.setParam(value); } current = current._next; } if (_next != null) _next = src; return this; } // - Set named parameter to value public boolean set(String n, String v, boolean immutable) { return set(n, n.length(), v, immutable); } public boolean set(String n, String v) { return set(n, n.length(), v, false); } // - Set parameter to value (separated by "=") public boolean set(String name, int len, String val, boolean immutable) { VoidParameter current = head; while (current != null) { if (current.getName().length() == len && current.getName().equalsIgnoreCase(name.substring(0, len))) { boolean b = current.setParam(val); current.setHasBeenSet(); if (b && immutable) current.setImmutable(); return b; } current = current._next; } return (_next != null) ? _next.set(name, len, val, immutable) : false; } // - Set named parameter to value, with name truncated at len boolean set(String config, boolean immutable) { boolean hyphen = false; if (config.charAt(0) == '-') { hyphen = true; config = config.substring(1); if (config.charAt(0) == '-') config = config.substring(1); // allow gnu-style --<option> } int equal = config.indexOf('='); if (equal > -1) { return set(config, equal, config.substring(equal+1), immutable); } else if (hyphen) { VoidParameter current = head; while (current != null) { if (current.getName().equalsIgnoreCase(config)) { boolean b = current.setParam(); current.setHasBeenSet(); if (b && immutable) current.setImmutable(); return b; } current = current._next; } } return (_next != null) ? _next.set(config, immutable) : false; } boolean set(String config) { return set(config, false); } // - Container for process-wide Global parameters public static boolean setParam(String param, String value, boolean immutable) { return global().set(param, value, immutable); } public static boolean setParam(String param, String value) { return setParam(param, value, false); } public static boolean setParam(String config, boolean immutable) { return global().set(config, immutable); } public static boolean setParam(String config) { return setParam(config, false); } public static boolean setParam(String name, int len, String val, boolean immutable) { return global().set(name, len, val, immutable); } // - Get named parameter public VoidParameter get(String param) { VoidParameter current = head; while (current != null) { if (current.getName().equalsIgnoreCase(param)) return current; current = current._next; } return (_next != null) ? _next.get(param) : null; } public static VoidParameter getParam(String param) { return global().get(param); } public static void listParams(int width, int nameWidth) { global().list(width, nameWidth); } public static void listParams() { listParams(79, 10); } public void list(int width, int nameWidth) { VoidParameter current = head; System.err.format("%s Parameters:%n", name); while (current != null) { String def_str = current.getDefaultStr(); String desc = current.getDescription().trim(); String format = " %-"+nameWidth+"s -"; System.err.format(format, current.getName()); int column = current.getName().length(); if (column < nameWidth) column = nameWidth; column += 4; while (true) { int s = desc.indexOf(' '); int wordLen; if (s > -1) wordLen = s; else wordLen = desc.length(); if (column + wordLen + 1 > width) { format = "%n%"+(nameWidth+4)+"s"; System.err.format(format, ""); column = nameWidth+4; } format = " %"+wordLen+"s"; System.err.format(format, desc.substring(0, wordLen)); column += wordLen + 1; if (s == -1) break; desc = desc.substring(wordLen+1); } if (def_str != null) { if (column + def_str.length() + 11 > width) System.err.format("%n%"+(nameWidth+4)+"s",""); System.err.format(" (default=%s)%n",def_str); def_str = null; } else { System.err.format("%n"); } current = current._next; } if (_next != null) _next.list(width, nameWidth); } public void list() { list(79, 10); } // Name for this Configuration private String name; // - Pointer to first Parameter in this group public VoidParameter head; // Pointer to next Configuration in this group public Configuration _next; }