diff options
Diffstat (limited to 'plugin/icedteanp/java/sun/applet/PluginParameterParser.java')
-rw-r--r-- | plugin/icedteanp/java/sun/applet/PluginParameterParser.java | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/plugin/icedteanp/java/sun/applet/PluginParameterParser.java b/plugin/icedteanp/java/sun/applet/PluginParameterParser.java new file mode 100644 index 0000000..9ce578f --- /dev/null +++ b/plugin/icedteanp/java/sun/applet/PluginParameterParser.java @@ -0,0 +1,90 @@ +package sun.applet; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import net.sourceforge.jnlp.PluginParameters; + +class PluginParameterParser { + static private final char DELIMITER_ESCAPE = ':'; + static private final String KEY_VALUE_DELIMITER = ";"; + + /** + * Unescape characters passed from C++. + * Specifically, "\n" -> new line, "\\" -> "\", "\:" -> ";" + * + * @param str The string to unescape + * @return The unescaped string + */ + static String unescapeString(String str) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < str.length(); i++) { + char chr = str.charAt(i); + if (chr != '\\') { + sb.append(chr); + } else { + i++; // Skip ahead one + chr = str.charAt(i); + if (chr == 'n') { + sb.append('\n'); + } else if (chr == '\\') { + sb.append('\\'); + } else if (chr == DELIMITER_ESCAPE) { + sb.append(KEY_VALUE_DELIMITER); + } + } + } + return sb.toString(); + } + + /** + * Parse semi-colon delimited key-value pairs. + * @param keyvalString the escaped, semicolon-delimited, string + * @return a map of the keys to the values + */ + static Map<String, String> parseEscapedKeyValuePairs(String keyvalString) { + // Split on ';', ensuring empty strings at end are kept + String[] strs = keyvalString.split(KEY_VALUE_DELIMITER, -1 /* Keep empty strings */); + System.out.println("Split array: " + Arrays.toString(strs)); + + Map<String, String> attributes = new HashMap<String, String>(); + + /* Note that we will typically have one empty string at end */ + for (int i = 0; i < strs.length - 1; i += 2) { + String key = unescapeString(strs[i]).toLowerCase(); + String value = unescapeString(strs[i + 1]); + attributes.put(key, value); + } + + return attributes; + } + + static boolean isInt(String s) { + return s.matches("^-?\\d+$"); + } + + /** + * Parsers parameters given a string containing + * parameters in quotes. + * + * @param width default applet width + * @param height default applet height + * @param parameterString the parameters + * @return the attributes in a hash table + */ + public PluginParameters parse(String width, + String height, String parameterString) { + Map<String, String> params = parseEscapedKeyValuePairs(parameterString); + + if (params.get("width") == null || !isInt(params.get("width"))) { + params.put("width", width); + } + + if (params.get("height") == null || !isInt(params.get("height"))) { + params.put("height", height); + } + + return new PluginParameters(params); + } +} |