1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project******************************************************************************* 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Copyright (C) 1996-2005, International Business Machines Corporation and * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* others. All Rights Reserved. * 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project******************************************************************************* 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project******************************************************************************* 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/ 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.ibm.icu4jni.charset; 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.charset.Charset; 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.charset.spi.CharsetProvider; 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.*; 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Iterator; 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// BEGIN android-removed 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// import com.ibm.icu4jni.converters.NativeConverter; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// END android-removed 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class CharsetProviderICU extends CharsetProvider{ 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs a CharsetProviderICU object 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public CharsetProviderICU(){ 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs a charset for the given charset name 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param charsetName charset name 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return charset objet for the given charset name 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final Charset charsetForName(String charsetName) { 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // get the canonical name 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String icuCanonicalName = NativeConverter.getICUCanonicalName(charsetName); 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // create the converter object and return it 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if(icuCanonicalName==null || icuCanonicalName.length()==0){ 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // this would make the Charset API to throw 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // unsupported encoding exception 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // BEGIN android-added 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try{ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project long cn = NativeConverter.openConverter(icuCanonicalName); 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NativeConverter.closeConverter(cn); 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }catch (RuntimeException re) { 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // unsupported encoding. let the charset api throw an 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // UnsupportedEncodingException 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // END android-added 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getCharset(icuCanonicalName); 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final Charset getCharset(String icuCanonicalName){ 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String[] aliases = (String[])NativeConverter.getAliases(icuCanonicalName); 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String canonicalName = NativeConverter.getJavaCanonicalName(icuCanonicalName); 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (new CharsetICU(canonicalName,icuCanonicalName, aliases)); 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Adds an entry to the given map whose key is the charset's 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * canonical name and whose value is the charset itself. 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param map a map to receive charset objects and names 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final void putCharsets(Map map) { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Get the available converter canonical names and aliases 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String[] charsets = NativeConverter.getAvailable(); 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for(int i=0; i<charsets.length;i++){ 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // store the charsets and aliases in a Map 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!map.containsKey(charsets[i])){ 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project map.put(charsets[i], charsetForName(charsets[i])); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Class that implements the iterator for charsets 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected final class CharsetIterator implements Iterator{ 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private String[] names; 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private int currentIndex; 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected CharsetIterator(String[] strs){ 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project names = strs; 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project currentIndex=0; 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean hasNext(){ 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (currentIndex< names.length); 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Object next(){ 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if(currentIndex<names.length){ 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return charsetForName(names[currentIndex++]); 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }else{ 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NoSuchElementException(); 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void remove() { 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new UnsupportedOperationException(); 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns an iterator for the available charsets 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return Iterator the charset name iterator 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @stable ICU 2.4 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final Iterator charsets(){ 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String[] charsets = NativeConverter.getAvailable(); 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Iterator iter = new CharsetIterator(charsets); 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return iter; 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 119