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