1/*
2 * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25package com.sun.corba.se.impl.encoding;
26
27/**
28 *
29 * Information from the OSF code set registry version 1.2g.
30 *
31 * Use the Entry corresponding to the desired code set.
32 *
33 * Consider rename to CodeSetRegistry since OSF is dead.
34 */
35public final class OSFCodeSetRegistry
36{
37    // Numbers from the OSF code set registry version 1.2g.
38    //
39    // Please see the individual Entry definitions for
40    // more details.
41    public static final int ISO_8859_1_VALUE = 0x00010001;
42    public static final int UTF_16_VALUE = 0x00010109;
43    public static final int UTF_8_VALUE = 0x05010001;
44    public static final int UCS_2_VALUE = 0x00010100;
45    public static final int ISO_646_VALUE = 0x00010020;
46
47    private OSFCodeSetRegistry() {}
48
49    /**
50     * An entry in the OSF registry which allows users
51     * to find out the equivalent Java character encoding
52     * name as well as some other facts from the registry.
53     */
54    public final static class Entry
55    {
56        private String javaName;
57        private int encodingNum;
58        private boolean isFixedWidth;
59        private int maxBytesPerChar;
60
61        private Entry(String javaName,
62                      int encodingNum,
63                      boolean isFixedWidth,
64                      int maxBytesPerChar) {
65            this.javaName = javaName;
66            this.encodingNum = encodingNum;
67            this.isFixedWidth = isFixedWidth;
68            this.maxBytesPerChar = maxBytesPerChar;
69        }
70
71        /**
72         * Returns the Java equivalent name.  If the encoding has
73         * an optional byte order marker, this name will map to the
74         * Java encoding that includes the marker.
75         */
76        public String getName() {
77            return javaName;
78        }
79
80        /**
81         * Get the OSF registry number for this code set.
82         */
83        public int getNumber() {
84            return encodingNum;
85        }
86
87        /**
88         * Is this a fixed or variable width code set?  (In CORBA
89         * terms, "non-byte-oriented" or a "byte-oriented"
90         * code set, respectively)
91         */
92        public boolean isFixedWidth() {
93            return isFixedWidth;
94        }
95
96        public int getMaxBytesPerChar() {
97            return maxBytesPerChar;
98        }
99
100        /**
101         * First checks reference equality since it's expected
102         * people will use the pre-defined constant Entries.
103         */
104        public boolean equals(Object obj) {
105            if (this == obj)
106                return true;
107
108            if (!(obj instanceof OSFCodeSetRegistry.Entry))
109                return false;
110
111            OSFCodeSetRegistry.Entry other
112                = (OSFCodeSetRegistry.Entry)obj;
113
114            return (javaName.equals(other.javaName) &&
115                    encodingNum == other.encodingNum &&
116                    isFixedWidth == other.isFixedWidth &&
117                    maxBytesPerChar == other.maxBytesPerChar);
118        }
119
120        /**
121         * Uses the registry number as the hash code.
122         */
123        public int hashCode() {
124            return encodingNum;
125        }
126    }
127
128    /**
129     * 8-bit encoding required for GIOP 1.0, and used as the char set
130     * when nothing else is specified.
131     */
132    public static final Entry ISO_8859_1
133        = new Entry("ISO-8859-1",
134                    ISO_8859_1_VALUE,
135                    true,
136                    1);
137
138    /**
139     * UTF-16 as specified in the OSF registry has an optional
140     * byte order marker.  UTF-16BE and UTF-16LE are not in the OSF
141     * registry since it is no longer being developed.  When the OMG
142     * switches to the IANA registry, these can be public.  Right
143     * now, they're used internally by CodeSetConversion.
144     */
145    static final Entry UTF_16BE
146        = new Entry("UTF-16BE",
147                    -1,
148                    true,
149                    2);
150
151    static final Entry UTF_16LE
152        = new Entry("UTF-16LE",
153                    -2,
154                    true,
155                    2);
156
157    /**
158     * Fallback wchar code set.
159     *
160     * In the resolution of issue 3405b, UTF-16 defaults to big endian, so
161     * doesn't have to have a byte order marker.  Unfortunately, this has to be
162     * a special case for compatibility.
163     */
164    public static final Entry UTF_16
165        = new Entry("UTF-16",
166                    UTF_16_VALUE,
167                    true,
168                    4);
169
170    /**
171     * Fallback char code set.  Also the code set for char data
172     * in encapsulations.  However, since CORBA says chars are
173     * only one octet, it is really the same as Latin-1.
174     */
175    public static final Entry UTF_8
176        = new Entry("UTF-8",
177                    UTF_8_VALUE,
178                    false,
179                    6);
180
181    /*
182     * At least in JDK 1.3, UCS-2 isn't one of the mandatory Java character
183     * encodings.  However, our old ORBs require what they call UCS2, even
184     * though they didn't necessarily do the correct encoding of it.
185     *
186     * This is a special case for our legacy ORBs, and put as the last thing
187     * in our conversion list for wchar data.
188     *
189     * If a foreign ORB actually tries to speak UCS2 with us, it probably
190     * won't work!  Beware!
191     */
192    public static final Entry UCS_2
193        = new Entry("UCS-2",
194                    UCS_2_VALUE,
195                    true,
196                    2);
197
198    /**
199     * This is the encoding older JavaSoft ORBs advertised as their
200     * CORBA char code set.  Actually, they took the lower byte of
201     * the Java char.  This is a 7-bit encoding, so they
202     * were really sending ISO8859-1.
203     */
204    public static final Entry ISO_646
205        = new Entry("US-ASCII",
206                    ISO_646_VALUE,
207                    true,
208                    1);
209
210    /**
211     * Given an OSF registry value, return the corresponding Entry.
212     * Returns null if an Entry for that value is unavailable.
213     */
214    public static Entry lookupEntry(int encodingValue) {
215        switch(encodingValue) {
216            case ISO_8859_1_VALUE:
217                return OSFCodeSetRegistry.ISO_8859_1;
218            case UTF_16_VALUE:
219                return OSFCodeSetRegistry.UTF_16;
220            case UTF_8_VALUE:
221                return OSFCodeSetRegistry.UTF_8;
222            case ISO_646_VALUE:
223                return OSFCodeSetRegistry.ISO_646;
224            case UCS_2_VALUE:
225                return OSFCodeSetRegistry.UCS_2;
226            default:
227                return null;
228        }
229    }
230}
231