CDROutputStream.java revision 608:7e06bf1dcb09
1/* 2 * Copyright (c) 2000, 2011, 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 27import java.io.IOException; 28import java.io.Serializable; 29import java.math.BigDecimal; 30import java.nio.ByteBuffer; 31 32import org.omg.CORBA.TypeCode; 33import org.omg.CORBA.Principal; 34import org.omg.CORBA.Any; 35 36import com.sun.corba.se.pept.protocol.MessageMediator; 37 38import com.sun.corba.se.spi.orb.ORB; 39import com.sun.corba.se.spi.logging.CORBALogDomains; 40import com.sun.corba.se.spi.ior.iiop.GIOPVersion; 41import com.sun.corba.se.spi.protocol.CorbaMessageMediator; 42 43import com.sun.corba.se.impl.encoding.CodeSetConversion; 44import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry; 45import com.sun.corba.se.impl.orbutil.ORBConstants; 46import com.sun.corba.se.impl.logging.ORBUtilSystemException; 47import com.sun.corba.se.impl.protocol.giopmsgheaders.Message; 48 49/** 50 * This is delegates to the real implementation. 51 */ 52public abstract class CDROutputStream 53 extends org.omg.CORBA_2_3.portable.OutputStream 54 implements com.sun.corba.se.impl.encoding.MarshalOutputStream, 55 org.omg.CORBA.DataOutputStream, org.omg.CORBA.portable.ValueOutputStream 56{ 57 private CDROutputStreamBase impl; 58 protected ORB orb ; 59 protected ORBUtilSystemException wrapper ; 60 protected CorbaMessageMediator corbaMessageMediator; 61 62 63 // We can move this out somewhere later. For now, it serves its purpose 64 // to create a concrete CDR delegate based on the GIOP version. 65 private static class OutputStreamFactory { 66 67 public static CDROutputStreamBase newOutputStream( 68 ORB orb, GIOPVersion version, byte encodingVersion) { 69 switch(version.intValue()) { 70 case GIOPVersion.VERSION_1_0: 71 return new CDROutputStream_1_0(); 72 case GIOPVersion.VERSION_1_1: 73 return new CDROutputStream_1_1(); 74 case GIOPVersion.VERSION_1_2: 75 if (encodingVersion != Message.CDR_ENC_VERSION) { 76 return 77 new IDLJavaSerializationOutputStream(encodingVersion); 78 } 79 return new CDROutputStream_1_2(); 80 default: 81 ORBUtilSystemException wrapper = ORBUtilSystemException.get( orb, 82 CORBALogDomains.RPC_ENCODING ) ; 83 // REVISIT - what is appropriate? INTERNAL exceptions 84 // are really hard to track later. 85 throw wrapper.unsupportedGiopVersion( version ) ; 86 } 87 } 88 } 89 90 // REVISIT - These two constructors should be re-factored to better hide 91 // the fact that someone extending this class 'can' construct a CDROutputStream 92 // that does not use pooled ByteBuffers. Right now, only EncapsOutputStream 93 // does _not_ use pooled ByteBuffers, see EncapsOutputStream. 94 95 // NOTE: When a stream is constructed for non-channel-backed sockets 96 // it notifies the constructor not to use pooled (i.e, direct) 97 // ByteBuffers. 98 99 public CDROutputStream(ORB orb, 100 GIOPVersion version, 101 byte encodingVersion, 102 boolean littleEndian, 103 BufferManagerWrite bufferManager, 104 byte streamFormatVersion, 105 boolean usePooledByteBuffers) 106 { 107 impl = OutputStreamFactory.newOutputStream(orb, version, 108 encodingVersion); 109 impl.init(orb, littleEndian, bufferManager, 110 streamFormatVersion, usePooledByteBuffers); 111 112 impl.setParent(this); 113 this.orb = orb ; 114 this.wrapper = ORBUtilSystemException.get( orb, 115 CORBALogDomains.RPC_ENCODING ) ; 116 } 117 118 public CDROutputStream(ORB orb, 119 GIOPVersion version, 120 byte encodingVersion, 121 boolean littleEndian, 122 BufferManagerWrite bufferManager, 123 byte streamFormatVersion) 124 { 125 this(orb, version, encodingVersion, littleEndian, 126 bufferManager, streamFormatVersion, true); 127 } 128 129 // org.omg.CORBA.portable.OutputStream 130 131 // Provided by IIOPOutputStream and EncapsOutputStream 132 public abstract org.omg.CORBA.portable.InputStream create_input_stream(); 133 134 public final void write_boolean(boolean value) { 135 impl.write_boolean(value); 136 } 137 public final void write_char(char value) { 138 impl.write_char(value); 139 } 140 public final void write_wchar(char value) { 141 impl.write_wchar(value); 142 } 143 public final void write_octet(byte value) { 144 impl.write_octet(value); 145 } 146 public final void write_short(short value) { 147 impl.write_short(value); 148 } 149 public final void write_ushort(short value) { 150 impl.write_ushort(value); 151 } 152 public final void write_long(int value) { 153 impl.write_long(value); 154 } 155 public final void write_ulong(int value) { 156 impl.write_ulong(value); 157 } 158 public final void write_longlong(long value) { 159 impl.write_longlong(value); 160 } 161 public final void write_ulonglong(long value) { 162 impl.write_ulonglong(value); 163 } 164 public final void write_float(float value) { 165 impl.write_float(value); 166 } 167 public final void write_double(double value) { 168 impl.write_double(value); 169 } 170 public final void write_string(String value) { 171 impl.write_string(value); 172 } 173 public final void write_wstring(String value) { 174 impl.write_wstring(value); 175 } 176 177 public final void write_boolean_array(boolean[] value, int offset, int length) { 178 impl.write_boolean_array(value, offset, length); 179 } 180 public final void write_char_array(char[] value, int offset, int length) { 181 impl.write_char_array(value, offset, length); 182 } 183 public final void write_wchar_array(char[] value, int offset, int length) { 184 impl.write_wchar_array(value, offset, length); 185 } 186 public final void write_octet_array(byte[] value, int offset, int length) { 187 impl.write_octet_array(value, offset, length); 188 } 189 public final void write_short_array(short[] value, int offset, int length) { 190 impl.write_short_array(value, offset, length); 191 } 192 public final void write_ushort_array(short[] value, int offset, int length){ 193 impl.write_ushort_array(value, offset, length); 194 } 195 public final void write_long_array(int[] value, int offset, int length) { 196 impl.write_long_array(value, offset, length); 197 } 198 public final void write_ulong_array(int[] value, int offset, int length) { 199 impl.write_ulong_array(value, offset, length); 200 } 201 public final void write_longlong_array(long[] value, int offset, int length) { 202 impl.write_longlong_array(value, offset, length); 203 } 204 public final void write_ulonglong_array(long[] value, int offset,int length) { 205 impl.write_ulonglong_array(value, offset, length); 206 } 207 public final void write_float_array(float[] value, int offset, int length) { 208 impl.write_float_array(value, offset, length); 209 } 210 public final void write_double_array(double[] value, int offset, int length) { 211 impl.write_double_array(value, offset, length); 212 } 213 public final void write_Object(org.omg.CORBA.Object value) { 214 impl.write_Object(value); 215 } 216 public final void write_TypeCode(TypeCode value) { 217 impl.write_TypeCode(value); 218 } 219 public final void write_any(Any value) { 220 impl.write_any(value); 221 } 222 223 public final void write_Principal(Principal value) { 224 impl.write_Principal(value); 225 } 226 227 public final void write(int b) throws java.io.IOException { 228 impl.write(b); 229 } 230 231 public final void write_fixed(java.math.BigDecimal value) { 232 impl.write_fixed(value); 233 } 234 235 public final void write_Context(org.omg.CORBA.Context ctx, 236 org.omg.CORBA.ContextList contexts) { 237 impl.write_Context(ctx, contexts); 238 } 239 240 public final org.omg.CORBA.ORB orb() { 241 return impl.orb(); 242 } 243 244 // org.omg.CORBA_2_3.portable.OutputStream 245 public final void write_value(java.io.Serializable value) { 246 impl.write_value(value); 247 } 248 249 public final void write_value(java.io.Serializable value, java.lang.Class clz) { 250 impl.write_value(value, clz); 251 } 252 253 public final void write_value(java.io.Serializable value, String repository_id) { 254 impl.write_value(value, repository_id); 255 } 256 257 public final void write_value(java.io.Serializable value, 258 org.omg.CORBA.portable.BoxedValueHelper factory) { 259 impl.write_value(value, factory); 260 } 261 262 public final void write_abstract_interface(java.lang.Object obj) { 263 impl.write_abstract_interface(obj); 264 } 265 266 // java.io.OutputStream 267 public final void write(byte b[]) throws IOException { 268 impl.write(b); 269 } 270 271 public final void write(byte b[], int off, int len) throws IOException { 272 impl.write(b, off, len); 273 } 274 275 public final void flush() throws IOException { 276 impl.flush(); 277 } 278 279 public final void close() throws IOException { 280 impl.close(); 281 } 282 283 // com.sun.corba.se.impl.encoding.MarshalOutputStream 284 public final void start_block() { 285 impl.start_block(); 286 } 287 288 public final void end_block() { 289 impl.end_block(); 290 } 291 292 public final void putEndian() { 293 impl.putEndian(); 294 } 295 296 public void writeTo(java.io.OutputStream s) 297 throws IOException 298 { 299 impl.writeTo(s); 300 } 301 302 public final byte[] toByteArray() { 303 return impl.toByteArray(); 304 } 305 306 // org.omg.CORBA.DataOutputStream 307 public final void write_Abstract (java.lang.Object value) { 308 impl.write_Abstract(value); 309 } 310 311 public final void write_Value (java.io.Serializable value) { 312 impl.write_Value(value); 313 } 314 315 public final void write_any_array(org.omg.CORBA.Any[] seq, int offset, int length) { 316 impl.write_any_array(seq, offset, length); 317 } 318 319 public void setMessageMediator(MessageMediator messageMediator) 320 { 321 this.corbaMessageMediator = (CorbaMessageMediator) messageMediator; 322 } 323 324 public MessageMediator getMessageMediator() 325 { 326 return corbaMessageMediator; 327 } 328 329 // org.omg.CORBA.portable.ValueBase 330 public final String[] _truncatable_ids() { 331 return impl._truncatable_ids(); 332 } 333 334 // Other 335 protected final int getSize() { 336 return impl.getSize(); 337 } 338 339 protected final int getIndex() { 340 return impl.getIndex(); 341 } 342 343 protected int getRealIndex(int index) { 344 // Used in indirections. Overridden by TypeCodeOutputStream. 345 return index; 346 } 347 348 protected final void setIndex(int value) { 349 impl.setIndex(value); 350 } 351 352 protected final ByteBuffer getByteBuffer() { 353 return impl.getByteBuffer(); 354 } 355 356 protected final void setByteBuffer(ByteBuffer byteBuffer) { 357 impl.setByteBuffer(byteBuffer); 358 } 359 360 /** 361 * return true if our ByteBuffer is sharing/equal to bb 362 */ 363 protected final boolean isSharing(ByteBuffer bb) { 364 return (getByteBuffer() == bb); 365 } 366 367 public final boolean isLittleEndian() { 368 return impl.isLittleEndian(); 369 } 370 371 // XREVISIT - return to final if possible 372 // REVISIT - was protected - need access from msgtypes test. 373 public ByteBufferWithInfo getByteBufferWithInfo() { 374 return impl.getByteBufferWithInfo(); 375 } 376 377 protected void setByteBufferWithInfo(ByteBufferWithInfo bbwi) { 378 impl.setByteBufferWithInfo(bbwi); 379 } 380 381 // REVISIT: was protected - but need to access from xgiop. 382 public final BufferManagerWrite getBufferManager() { 383 return impl.getBufferManager(); 384 } 385 386 public final void write_fixed(java.math.BigDecimal bigDecimal, short digits, short scale) { 387 impl.write_fixed(bigDecimal, digits, scale); 388 } 389 390 public final void writeOctetSequenceTo(org.omg.CORBA.portable.OutputStream s) { 391 impl.writeOctetSequenceTo(s); 392 } 393 394 public final GIOPVersion getGIOPVersion() { 395 return impl.getGIOPVersion(); 396 } 397 398 public final void writeIndirection(int tag, int posIndirectedTo) { 399 impl.writeIndirection(tag, posIndirectedTo); 400 } 401 402 // Use Latin-1 for GIOP 1.0 or when code set negotiation was not 403 // performed. 404 protected CodeSetConversion.CTBConverter createCharCTBConverter() { 405 return CodeSetConversion.impl().getCTBConverter(OSFCodeSetRegistry.ISO_8859_1); 406 } 407 408 // Subclasses must decide what to do here. It's inconvenient to 409 // make the class and this method abstract because of dup(). 410 protected abstract CodeSetConversion.CTBConverter createWCharCTBConverter(); 411 412 protected final void freeInternalCaches() { 413 impl.freeInternalCaches(); 414 } 415 416 void printBuffer() { 417 impl.printBuffer(); 418 } 419 420 public void alignOnBoundary(int octetBoundary) { 421 impl.alignOnBoundary(octetBoundary); 422 } 423 424 // Needed by request and reply messages for GIOP versions >= 1.2 only. 425 public void setHeaderPadding(boolean headerPadding) { 426 impl.setHeaderPadding(headerPadding); 427 } 428 429 // ValueOutputStream ----------------------------- 430 431 public void start_value(String rep_id) { 432 impl.start_value(rep_id); 433 } 434 435 public void end_value() { 436 impl.end_value(); 437 } 438} 439