196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/* ==================================================================== 296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Copyright (c) 2006 J.T. Beetstra 396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining 596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * a copy of this software and associated documentation files (the 696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * "Software"), to deal in the Software without restriction, including 796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * without limitation the rights to use, copy, modify, merge, publish, 896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distribute, sublicense, and/or sell copies of the Software, and to 996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * permit persons to whom the Software is furnished to do so, subject to 1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the following conditions: 1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The above copyright notice and this permission notice shall be 1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * included in all copies or substantial portions of the Software. 1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * ==================================================================== 2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage com.beetstra.jutf7; 2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.nio.charset.Charset; 2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.nio.charset.CharsetDecoder; 2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.nio.charset.CharsetEncoder; 3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.util.Arrays; 3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.util.List; 3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/** 3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Abstract base class for UTF-7 style encoding and decoding. 3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * </p> 3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author Jaap Beetstra 3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectabstract class UTF7StyleCharset extends Charset { 4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private static final List CONTAINED = Arrays.asList(new String[] { 4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "US-ASCII", "ISO-8859-1", "UTF-8", "UTF-16", "UTF-16LE", "UTF-16BE" 4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project }); 4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project final boolean strict; 4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project Base64Util base64; 4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Besides the name and aliases, two additional parameters are required. 5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * First the base 64 alphabet used; in modified UTF-7 a slightly different 5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * alphabet is used. Additionally, it should be specified if encoders and 5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * decoders should be strict about the interpretation of malformed encoded 5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * sequences. This is used since modified UTF-7 specifically disallows some 5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * constructs which are allowed (or not specifically disallowed) in UTF-7 5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (RFC 2152). 5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * </p> 5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param canonicalName The name as defined in java.nio.charset.Charset 5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param aliases The aliases as defined in java.nio.charset.Charset 6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param alphabet The base 64 alphabet used 6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param strict True if strict handling of sequences is requested 6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project protected UTF7StyleCharset(String canonicalName, String[] aliases, String alphabet, 6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project boolean strict) { 6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project super(canonicalName, aliases); 6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project this.base64 = new Base64Util(alphabet); 6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project this.strict = strict; 6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /* 7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (non-Javadoc) 7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @see java.nio.charset.Charset#contains(java.nio.charset.Charset) 7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public boolean contains(final Charset cs) { 7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return CONTAINED.contains(cs.name()); 7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /* 7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (non-Javadoc) 8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @see java.nio.charset.Charset#newDecoder() 8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public CharsetDecoder newDecoder() { 8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return new UTF7StyleCharsetDecoder(this, base64, strict); 8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /* 8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (non-Javadoc) 8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @see java.nio.charset.Charset#newEncoder() 8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public CharsetEncoder newEncoder() { 9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return new UTF7StyleCharsetEncoder(this, base64, strict); 9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 9396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Tells if a character can be encoded using simple (US-ASCII) encoding or 9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * requires base 64 encoding. 9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 9896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param ch The character 9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return True if the character can be encoded directly, false otherwise 10096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 10196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project abstract boolean canEncodeDirectly(char ch); 10296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Returns character used to switch to base 64 encoding. 10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return The shift character 10796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 10896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project abstract byte shift(); 10996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 11096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Returns character used to switch from base 64 encoding to simple 11296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * encoding. 11396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 11496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return The unshift character 11596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 11696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project abstract byte unshift(); 11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project} 118