TCUtility.java revision 608:7e06bf1dcb09
1/*
2 * Copyright (c) 1998, 2004, 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 */
25/*
26 * Licensed Materials - Property of IBM
27 * RMI-IIOP v1.0
28 * Copyright IBM Corp. 1998 1999  All Rights Reserved
29 *
30 */
31
32package com.sun.corba.se.impl.corba;
33
34import org.omg.CORBA.SystemException;
35import org.omg.CORBA.CompletionStatus;
36import org.omg.CORBA.UserException;
37import org.omg.CORBA.TCKind;
38import org.omg.CORBA.UNKNOWN;
39import org.omg.CORBA.INTERNAL;
40import org.omg.CORBA.NO_IMPLEMENT;
41import org.omg.CORBA.Any;
42import org.omg.CORBA.TypeCode;
43import org.omg.CORBA.Principal;
44import org.omg.CORBA_2_3.portable.InputStream;
45import org.omg.CORBA_2_3.portable.OutputStream;
46import org.omg.CORBA.portable.Streamable;
47import org.omg.CORBA.TypeCodePackage.BadKind;
48import java.util.Hashtable;
49import java.util.Enumeration;
50import java.util.NoSuchElementException;
51
52import com.sun.corba.se.impl.encoding.CDRInputStream;
53import com.sun.corba.se.impl.encoding.CDROutputStream;
54import java.io.Serializable;
55import java.math.BigDecimal;
56import com.sun.corba.se.spi.logging.CORBALogDomains ;
57import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
58
59/**
60 *  Static functions for TypeCode interpretation.
61 */
62public final class TCUtility {
63
64    static void marshalIn(org.omg.CORBA.portable.OutputStream s, TypeCode typeCode, long l, Object o) {
65        switch (typeCode.kind().value()) {
66        case TCKind._tk_null:
67        case TCKind._tk_void:
68        case TCKind._tk_native:
69            // nothing to write
70            break;
71
72        case TCKind._tk_short:
73            s.write_short((short)(l & 0xFFFFL));
74            break;
75
76        case TCKind._tk_ushort:
77            s.write_ushort((short)(l & 0xFFFFL));
78            break;
79
80        case TCKind._tk_enum:
81        case TCKind._tk_long:
82            s.write_long((int)(l & 0xFFFFFFFFL));
83            break;
84
85        case TCKind._tk_ulong:
86            s.write_ulong((int)(l & 0xFFFFFFFFL));
87            break;
88
89        case TCKind._tk_float:
90            s.write_float(Float.intBitsToFloat((int)(l & 0xFFFFFFFFL)));
91            break;
92
93        case TCKind._tk_double:
94            s.write_double(Double.longBitsToDouble(l));
95            break;
96
97        case TCKind._tk_boolean:
98            if ( l == 0 )
99                s.write_boolean(false);
100            else
101                s.write_boolean(true);
102            break;
103
104        case TCKind._tk_char:
105            s.write_char((char)(l & 0xFFFFL));
106            break;
107
108        case TCKind._tk_octet:
109            s.write_octet((byte)(l & 0xFFL));
110            break;
111
112        case TCKind._tk_any:
113            s.write_any((Any)o);
114            break;
115
116        case TCKind._tk_TypeCode:
117            s.write_TypeCode((TypeCode)o);
118            break;
119
120        case TCKind._tk_Principal:
121            s.write_Principal((Principal)o);
122            break;
123
124        case TCKind._tk_objref:
125            s.write_Object((org.omg.CORBA.Object)o);
126            break;
127
128        case TCKind._tk_longlong:
129            s.write_longlong(l);
130            break;
131
132        case TCKind._tk_ulonglong:
133            s.write_ulonglong(l);
134            break;
135
136        case TCKind._tk_wchar:
137            s.write_wchar((char)(l & 0xFFFFL));
138            break;
139
140        case TCKind._tk_string:
141            s.write_string((String)o);
142            break;
143
144        case TCKind._tk_wstring:
145            s.write_wstring((String)o);
146            break;
147
148        case TCKind._tk_value:
149        case TCKind._tk_value_box:
150            ((org.omg.CORBA_2_3.portable.OutputStream)s).write_value((Serializable)o);
151            break;
152
153        case TCKind._tk_fixed:
154            // _REVISIT_ As soon as the java-rtf adds digits and scale parameters to
155            // OutputStream, this check will be unnecessary
156            if (s instanceof CDROutputStream) {
157                try {
158                    ((CDROutputStream)s).write_fixed((BigDecimal)o,
159                                                    typeCode.fixed_digits(),
160                                                    typeCode.fixed_scale());
161                } catch (BadKind badKind) { // impossible
162                }
163            } else {
164                s.write_fixed((BigDecimal)o);
165            }
166            break;
167
168        case TCKind._tk_struct:
169        case TCKind._tk_union:
170        case TCKind._tk_sequence:
171        case TCKind._tk_array:
172        case TCKind._tk_alias:
173        case TCKind._tk_except:
174            ((Streamable)o)._write(s);
175            break;
176
177        case TCKind._tk_abstract_interface:
178            ((org.omg.CORBA_2_3.portable.OutputStream)s).write_abstract_interface(o);
179            break;
180
181        case TCKind._tk_longdouble:
182            // Unspecified for Java
183        default:
184            ORBUtilSystemException wrapper = ORBUtilSystemException.get(
185                (com.sun.corba.se.spi.orb.ORB)s.orb(),
186                CORBALogDomains.RPC_PRESENTATION ) ;
187            throw wrapper.typecodeNotSupported() ;
188        }
189    }
190
191    static void unmarshalIn(org.omg.CORBA.portable.InputStream s, TypeCode typeCode, long[] la, Object[] oa)
192    {
193        int type = typeCode.kind().value();
194        long l=0;
195        Object o=oa[0];
196
197        switch (type) {
198        case TCKind._tk_null:
199        case TCKind._tk_void:
200        case TCKind._tk_native:
201            // Nothing to read
202            break;
203
204        case TCKind._tk_short:
205            l = s.read_short() & 0xFFFFL;
206            break;
207
208        case TCKind._tk_ushort:
209            l = s.read_ushort() & 0xFFFFL;
210            break;
211
212        case TCKind._tk_enum:
213        case TCKind._tk_long:
214            l = s.read_long() & 0xFFFFFFFFL;
215            break;
216
217        case TCKind._tk_ulong:
218            l = s.read_ulong() & 0xFFFFFFFFL;
219            break;
220
221        case TCKind._tk_float:
222            l = Float.floatToIntBits(s.read_float()) & 0xFFFFFFFFL;
223            break;
224
225        case TCKind._tk_double:
226            l = Double.doubleToLongBits(s.read_double());
227            break;
228
229        case TCKind._tk_char:
230            l = s.read_char() & 0xFFFFL;
231            break;
232
233        case TCKind._tk_octet:
234            l = s.read_octet() & 0xFFL;
235            break;
236
237        case TCKind._tk_boolean:
238            if ( s.read_boolean() )
239                l = 1;
240            else
241                l = 0;
242            break;
243
244        case TCKind._tk_any:
245            o = s.read_any();
246            break;
247
248        case TCKind._tk_TypeCode:
249            o = s.read_TypeCode();
250            break;
251
252        case TCKind._tk_Principal:
253            o = s.read_Principal();
254            break;
255
256        case TCKind._tk_objref:
257            if (o instanceof Streamable)
258                ((Streamable)o)._read(s);
259            else
260                o = s.read_Object();
261            break;
262
263        case TCKind._tk_longlong:
264            l = s.read_longlong();
265            break;
266
267        case TCKind._tk_ulonglong:
268            l = s.read_ulonglong();
269            break;
270
271        case TCKind._tk_wchar:
272            l = s.read_wchar() & 0xFFFFL;
273            break;
274
275        case TCKind._tk_string:
276            o = s.read_string();
277            break;
278
279        case TCKind._tk_wstring:
280            o = s.read_wstring();
281            break;
282
283        case TCKind._tk_value:
284        case TCKind._tk_value_box:
285            o = ((org.omg.CORBA_2_3.portable.InputStream)s).read_value ();
286            break;
287
288        case TCKind._tk_fixed:
289            try {
290                // _REVISIT_ As soon as the java-rtf adds digits and scale parameters to
291                // InputStream, this check will be unnecessary
292                if (s instanceof CDRInputStream) {
293                    o = ((CDRInputStream)s).read_fixed(typeCode.fixed_digits(),
294                                                                typeCode.fixed_scale());
295                } else {
296                    BigDecimal bigDecimal = s.read_fixed();
297                    o = bigDecimal.movePointLeft((int)typeCode.fixed_scale());
298                }
299            } catch (BadKind badKind) { // impossible
300            }
301            break;
302
303        case TCKind._tk_struct:
304        case TCKind._tk_union:
305        case TCKind._tk_sequence:
306        case TCKind._tk_array:
307        case TCKind._tk_alias:
308        case TCKind._tk_except:
309            ((Streamable)o)._read(s);
310            break;
311
312        case TCKind._tk_abstract_interface:
313            o = ((org.omg.CORBA_2_3.portable.InputStream)s).read_abstract_interface();
314            break;
315
316        case TCKind._tk_longdouble:
317            // Unspecified for Java
318        default:
319            ORBUtilSystemException wrapper = ORBUtilSystemException.get(
320                (com.sun.corba.se.spi.orb.ORB)s.orb(),
321                CORBALogDomains.RPC_PRESENTATION ) ;
322            throw wrapper.typecodeNotSupported() ;
323        }
324
325        oa[0] = o;
326        la[0] = l;
327    }
328
329}
330