EncapsOutputStream.java revision 608:7e06bf1dcb09
1/*
2 * Copyright (c) 2001, 2013, 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
26package com.sun.corba.se.impl.encoding;
27
28import org.omg.CORBA.CompletionStatus;
29
30import com.sun.corba.se.spi.orb.ORB;
31
32import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
33
34import com.sun.corba.se.impl.encoding.CodeSetConversion;
35import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry;
36import com.sun.corba.se.impl.encoding.CDROutputStream;
37import com.sun.corba.se.impl.encoding.BufferManagerWrite;
38import com.sun.corba.se.impl.encoding.BufferManagerFactory;
39import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
40import com.sun.corba.se.impl.orbutil.ORBConstants;
41
42import sun.corba.EncapsInputStreamFactory;
43
44/**
45 * Encapsulations are supposed to explicitly define their
46 * code sets and GIOP version.  The original resolution to issue 2784
47 * said that the defaults were UTF-8 and UTF-16, but that was not
48 * agreed upon.
49 *
50 * These streams currently use CDR 1.2 with ISO8859-1 for char/string and
51 * UTF16 for wchar/wstring.  If no byte order marker is available,
52 * the endianness of the encapsulation is used.
53 *
54 * When more encapsulations arise that have their own special code
55 * sets defined, we can make all constructors take such parameters.
56 */
57public class EncapsOutputStream extends CDROutputStream
58{
59
60    // REVISIT - Right now, EncapsOutputStream's do not use
61    // pooled byte buffers. This is controlled by the following
62    // static constant. This should be re-factored such that
63    // the EncapsOutputStream doesn't know it's using pooled
64    // byte buffers.
65    final static boolean usePooledByteBuffers = false;
66
67    // REVISIT - Right now, valuetypes in encapsulations will
68    // only use stream format version 1, which may create problems
69    // for service contexts or codecs (?).
70
71    // corba/ORB
72    // corba/ORBSingleton
73    // iiop/ORB
74    // iiop/GIOPImpl
75    // corba/AnyImpl
76    public EncapsOutputStream(ORB orb) {
77        // GIOP version 1.2 with no fragmentation, big endian,
78        // UTF8 for char data and UTF-16 for wide char data;
79        this(orb, GIOPVersion.V1_2);
80    }
81
82    // CDREncapsCodec
83    //
84    // REVISIT.  A UTF-16 encoding with GIOP 1.1 will not work
85    // with byte order markers.
86    public EncapsOutputStream(ORB orb, GIOPVersion version) {
87        this(orb, version, false);
88    }
89
90    // Used by IIOPProfileTemplate
91    //
92    public EncapsOutputStream(ORB orb, boolean isLittleEndian) {
93        this(orb, GIOPVersion.V1_2, isLittleEndian);
94    }
95
96    public EncapsOutputStream(ORB orb,
97                              GIOPVersion version,
98                              boolean isLittleEndian)
99    {
100        super(orb, version, Message.CDR_ENC_VERSION, isLittleEndian,
101              BufferManagerFactory.newBufferManagerWrite(
102                                        BufferManagerFactory.GROW,
103                                        Message.CDR_ENC_VERSION,
104                                        orb),
105              ORBConstants.STREAM_FORMAT_VERSION_1,
106              usePooledByteBuffers);
107    }
108
109    public org.omg.CORBA.portable.InputStream create_input_stream() {
110        freeInternalCaches();
111
112        return  EncapsInputStreamFactory.newEncapsInputStream(orb(),
113                getByteBuffer(),
114                getSize(),
115                isLittleEndian(),
116                getGIOPVersion());
117    }
118
119    protected CodeSetConversion.CTBConverter createCharCTBConverter() {
120        return CodeSetConversion.impl().getCTBConverter(OSFCodeSetRegistry.ISO_8859_1);
121    }
122
123    protected CodeSetConversion.CTBConverter createWCharCTBConverter() {
124        if (getGIOPVersion().equals(GIOPVersion.V1_0))
125            throw wrapper.wcharDataInGiop10(CompletionStatus.COMPLETED_MAYBE);
126
127        // In the case of GIOP 1.1, we take the byte order of the stream and don't
128        // use byte order markers since we're limited to a 2 byte fixed width encoding.
129        if (getGIOPVersion().equals(GIOPVersion.V1_1))
130            return CodeSetConversion.impl().getCTBConverter(OSFCodeSetRegistry.UTF_16,
131                                                            isLittleEndian(),
132                                                            false);
133
134        // Assume anything else meets GIOP 1.2 requirements
135        //
136        // Use byte order markers?  If not, use big endian in GIOP 1.2.
137        // (formal 00-11-03 15.3.16)
138
139        boolean useBOM = ((ORB)orb()).getORBData().useByteOrderMarkersInEncapsulations();
140
141        return CodeSetConversion.impl().getCTBConverter(OSFCodeSetRegistry.UTF_16,
142                                                        false,
143                                                        useBOM);
144    }
145}
146