/*
 * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package com.sun.corba.se.impl.encoding;

import java.io.Serializable;
import java.io.ObjectInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.math.BigDecimal;
import java.util.LinkedList;

import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.ior.IOR;
import com.sun.corba.se.spi.ior.IORFactories;
import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
import com.sun.corba.se.spi.logging.CORBALogDomains;
import com.sun.corba.se.spi.presentation.rmi.StubAdapter;
import com.sun.corba.se.spi.presentation.rmi.PresentationManager;
import com.sun.corba.se.spi.presentation.rmi.PresentationDefaults;

import com.sun.corba.se.impl.util.Utility;
import com.sun.corba.se.impl.orbutil.ORBUtility;
import com.sun.corba.se.impl.corba.TypeCodeImpl;
import com.sun.corba.se.impl.util.RepositoryId;
import com.sun.corba.se.impl.orbutil.ORBConstants;
import com.sun.corba.se.impl.logging.ORBUtilSystemException;
import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;

import org.omg.CORBA.Any;
import org.omg.CORBA.TypeCode;
import org.omg.CORBA.Principal;
import org.omg.CORBA.portable.IDLEntity;

Implementation class that uses Java serialization for input streams. This assumes a GIOP version 1.2 message format. This class uses a ByteArrayInputStream as the underlying buffer. The first 16 bytes are directly read out of the underlying buffer. This allows [GIOPHeader (12 bytes) + requestID (4 bytes)] to be read as bytes. Subsequent write operations on this output stream object uses ObjectInputStream class to read into the buffer. This allows unmarshaling complex types and graphs using the ObjectInputStream implementation. Note, this class assumes a GIOP 1.2 style header. Further, the first 12 bytes, that is, the GIOPHeader is read directly from the received message, before this stream object is called. So, this class effectively reads only the requestID (4 bytes) directly, and uses the ObjectInputStream for further unmarshaling.
Author:Ram Jeyaraman
/** * Implementation class that uses Java serialization for input streams. * This assumes a GIOP version 1.2 message format. * * This class uses a ByteArrayInputStream as the underlying buffer. The * first 16 bytes are directly read out of the underlying buffer. This allows * [GIOPHeader (12 bytes) + requestID (4 bytes)] to be read as bytes. * Subsequent write operations on this output stream object uses * ObjectInputStream class to read into the buffer. This allows unmarshaling * complex types and graphs using the ObjectInputStream implementation. * * Note, this class assumes a GIOP 1.2 style header. Further, the first * 12 bytes, that is, the GIOPHeader is read directly from the received * message, before this stream object is called. So, this class effectively * reads only the requestID (4 bytes) directly, and uses the * ObjectInputStream for further unmarshaling. * * @author Ram Jeyaraman */
public class IDLJavaSerializationInputStream extends CDRInputStreamBase { private ORB orb; private int bufSize; private ByteBuffer buffer; private byte encodingVersion; private ObjectInputStream is; private _ByteArrayInputStream bis; private BufferManagerRead bufferManager; // [GIOPHeader(12) + requestID(4)] bytes private final int directReadLength = Message.GIOPMessageHeaderLength + 4; // Used for mark / reset operations. private boolean markOn; private int peekIndex, peekCount; private LinkedList markedItemQ = new LinkedList(); protected ORBUtilSystemException wrapper; class _ByteArrayInputStream extends ByteArrayInputStream { _ByteArrayInputStream(byte[] buf) { super(buf); } int getPosition() { return this.pos; } void setPosition(int value) { if (value < 0 || value > count) { throw new IndexOutOfBoundsException(); } this.pos = value; } } class MarshalObjectInputStream extends ObjectInputStream { ORB orb; MarshalObjectInputStream(java.io.InputStream out, ORB orb) throws IOException { super(out); this.orb = orb; java.security.AccessController.doPrivileged( new java.security.PrivilegedAction() { public Object run() { // needs SerializablePermission("enableSubstitution") enableResolveObject(true); return null; } } ); }
Connect the Stub to the ORB.
/** * Connect the Stub to the ORB. */
protected final Object resolveObject(Object obj) throws IOException { try { if (StubAdapter.isStub(obj)) { StubAdapter.connect(obj, orb); } } catch (java.rmi.RemoteException re) { IOException ie = new IOException("resolveObject failed"); ie.initCause(re); throw ie; } return obj; } } public IDLJavaSerializationInputStream(byte encodingVersion) { super(); this.encodingVersion = encodingVersion; } public void init(org.omg.CORBA.ORB orb, ByteBuffer byteBuffer, int bufSize, boolean littleEndian, BufferManagerRead bufferManager) { this.orb = (ORB) orb; this.bufSize = bufSize; this.bufferManager = bufferManager; buffer = byteBuffer; wrapper = ORBUtilSystemException.get((ORB)orb, CORBALogDomains.RPC_ENCODING); byte[] buf; if (buffer.hasArray()) { buf = buffer.array(); } else { buf = new byte[bufSize]; buffer.get(buf); } // Note: at this point, the buffer position is zero. The setIndex() // method call can be used to set a desired read index. bis = new _ByteArrayInputStream(buf); } // Called from read_octet or read_long or read_ulong method. private void initObjectInputStream() { //System.out.print(" is "); if (is != null) { throw wrapper.javaStreamInitFailed(); } try { is = new MarshalObjectInputStream(bis, orb); } catch (Exception e) { throw wrapper.javaStreamInitFailed(e); } } // org.omg.CORBA.portable.InputStream // Primitive types. public boolean read_boolean() { if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return ((Boolean)markedItemQ.removeFirst()).booleanValue(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return ((Boolean)markedItemQ.get(peekIndex++)).booleanValue(); } try { boolean value = is.readBoolean(); if (markOn) { // enqueue markedItemQ.addLast(Boolean.valueOf(value)); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_boolean"); } } public char read_char() { if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return ((Character)markedItemQ.removeFirst()).charValue(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return ((Character)markedItemQ.get(peekIndex++)).charValue(); } try { char value = is.readChar(); if (markOn) { // enqueue markedItemQ.addLast(new Character(value)); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_char"); } } public char read_wchar() { return this.read_char(); } public byte read_octet() { // check if size < [ GIOPHeader(12) + requestID(4)] bytes if (bis.getPosition() < directReadLength) { byte b = (byte) bis.read(); if (bis.getPosition() == directReadLength) { initObjectInputStream(); } return b; } if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return ((Byte)markedItemQ.removeFirst()).byteValue(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return ((Byte)markedItemQ.get(peekIndex++)).byteValue(); } try { byte value = is.readByte(); if (markOn) { // enqueue //markedItemQ.addLast(Byte.valueOf(value)); // only in JDK 1.5 markedItemQ.addLast(new Byte(value)); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_octet"); } } public short read_short() { if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return ((Short)markedItemQ.removeFirst()).shortValue(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return ((Short)markedItemQ.get(peekIndex++)).shortValue(); } try { short value = is.readShort(); if (markOn) { // enqueue markedItemQ.addLast(new Short(value)); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_short"); } } public short read_ushort() { return this.read_short(); } public int read_long() { // check if size < [ GIOPHeader(12) + requestID(4)] bytes if (bis.getPosition() < directReadLength) { // Use big endian (network byte order). This is fixed. // Both the writer and reader use the same byte order. int b1 = (bis.read() << 24) & 0xFF000000; int b2 = (bis.read() << 16) & 0x00FF0000; int b3 = (bis.read() << 8) & 0x0000FF00; int b4 = (bis.read() << 0) & 0x000000FF; if (bis.getPosition() == directReadLength) { initObjectInputStream(); } else if (bis.getPosition() > directReadLength) { // Cannot happen. All direct reads are contained // within the first 16 bytes. wrapper.javaSerializationException("read_long"); } return (b1 | b2 | b3 | b4); } if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return ((Integer)markedItemQ.removeFirst()).intValue(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return ((Integer)markedItemQ.get(peekIndex++)).intValue(); } try { int value = is.readInt(); if (markOn) { // enqueue markedItemQ.addLast(new Integer(value)); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_long"); } } public int read_ulong() { return this.read_long(); } public long read_longlong() { if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return ((Long)markedItemQ.removeFirst()).longValue(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return ((Long)markedItemQ.get(peekIndex++)).longValue(); } try { long value = is.readLong(); if (markOn) { // enqueue markedItemQ.addLast(new Long(value)); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_longlong"); } } public long read_ulonglong() { return read_longlong(); } public float read_float() { if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return ((Float)markedItemQ.removeFirst()).floatValue(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return ((Float)markedItemQ.get(peekIndex++)).floatValue(); } try { float value = is.readFloat(); if (markOn) { // enqueue markedItemQ.addLast(new Float(value)); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_float"); } } public double read_double() { if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return ((Double)markedItemQ.removeFirst()).doubleValue(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return ((Double)markedItemQ.get(peekIndex++)).doubleValue(); } try { double value = is.readDouble(); if (markOn) { // enqueue markedItemQ.addLast(new Double(value)); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_double"); } } // String types. public String read_string() { if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return (String) markedItemQ.removeFirst(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return (String) markedItemQ.get(peekIndex++); } try { String value = is.readUTF(); if (markOn) { // enqueue markedItemQ.addLast(value); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_string"); } } public String read_wstring() { if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return (String) markedItemQ.removeFirst(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return (String) markedItemQ.get(peekIndex++); } try { String value = (String) is.readObject(); if (markOn) { // enqueue markedItemQ.addLast(value); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_wstring"); } } // Array types. public void read_boolean_array(boolean[] value, int offset, int length){ for(int i = 0; i < length; i++) { value[i+offset] = read_boolean(); } } public void read_char_array(char[] value, int offset, int length) { for(int i=0; i < length; i++) { value[i+offset] = read_char(); } } public void read_wchar_array(char[] value, int offset, int length) { read_char_array(value, offset, length); } public void read_octet_array(byte[] value, int offset, int length) { for(int i=0; i < length; i++) { value[i+offset] = read_octet(); } /* // Cannot use this efficient read due to mark/reset support. try { while (length > 0) { int n = is.read(value, offset, length); offset += n; length -= n; } } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_octet_array"); } */ } public void read_short_array(short[] value, int offset, int length) { for(int i=0; i < length; i++) { value[i+offset] = read_short(); } } public void read_ushort_array(short[] value, int offset, int length) { read_short_array(value, offset, length); } public void read_long_array(int[] value, int offset, int length) { for(int i=0; i < length; i++) { value[i+offset] = read_long(); } } public void read_ulong_array(int[] value, int offset, int length) { read_long_array(value, offset, length); } public void read_longlong_array(long[] value, int offset, int length) { for(int i=0; i < length; i++) { value[i+offset] = read_longlong(); } } public void read_ulonglong_array(long[] value, int offset, int length) { read_longlong_array(value, offset, length); } public void read_float_array(float[] value, int offset, int length) { for(int i=0; i < length; i++) { value[i+offset] = read_float(); } } public void read_double_array(double[] value, int offset, int length) { for(int i=0; i < length; i++) { value[i+offset] = read_double(); } } // Complex types. public org.omg.CORBA.Object read_Object() { return read_Object(null); } public TypeCode read_TypeCode() { TypeCodeImpl tc = new TypeCodeImpl(orb); tc.read_value(parent); return tc; } public Any read_any() { Any any = orb.create_any(); TypeCodeImpl tc = new TypeCodeImpl(orb); // read off the typecode // REVISIT We could avoid this try-catch if we could peek the typecode // kind off this stream and see if it is a tk_value. // Looking at the code we know that for tk_value the Any.read_value() // below ignores the tc argument anyway (except for the kind field). // But still we would need to make sure that the whole typecode, // including encapsulations, is read off. try { tc.read_value(parent); } catch (org.omg.CORBA.MARSHAL ex) { if (tc.kind().value() != org.omg.CORBA.TCKind._tk_value) { throw ex; } // We can be sure that the whole typecode encapsulation has been // read off. ex.printStackTrace(); } // read off the value of the any. any.read_value(parent, tc); return any; } public Principal read_Principal() { // We don't need an implementation for this method, since principal // is absent in GIOP version 1.2 or above. int len = read_long(); byte[] pvalue = new byte[len]; read_octet_array(pvalue,0,len); Principal p = new com.sun.corba.se.impl.corba.PrincipalImpl(); p.name(pvalue); return p; } public BigDecimal read_fixed() { return new BigDecimal(read_fixed_buffer().toString()); } // Each octet contains (up to) two decimal digits. If the fixed type has // an odd number of decimal digits, then the representation // begins with the first (most significant) digit. // Otherwise, this first half-octet is all zero, and the first digit // is in the second half-octet. // The sign configuration, in the last half-octet of the representation, // is 0xD for negative numbers and 0xC for positive and zero values. private StringBuffer read_fixed_buffer() { StringBuffer buffer = new StringBuffer(64); byte doubleDigit; int firstDigit; int secondDigit; boolean wroteFirstDigit = false; boolean more = true; while (more) { doubleDigit = read_octet(); firstDigit = (int)((doubleDigit & 0xf0) >> 4); secondDigit = (int)(doubleDigit & 0x0f); if (wroteFirstDigit || firstDigit != 0) { buffer.append(Character.forDigit(firstDigit, 10)); wroteFirstDigit = true; } if (secondDigit == 12) { // positive number or zero if ( ! wroteFirstDigit) { // zero return new StringBuffer("0.0"); } else { // positive number // done } more = false; } else if (secondDigit == 13) { // negative number buffer.insert(0, '-'); more = false; } else { buffer.append(Character.forDigit(secondDigit, 10)); wroteFirstDigit = true; } } return buffer; } public org.omg.CORBA.Object read_Object(java.lang.Class clz) { // In any case, we must first read the IOR. IOR ior = IORFactories.makeIOR(parent) ; if (ior.isNil()) { return null; } PresentationManager.StubFactoryFactory sff = ORB.getStubFactoryFactory(); String codeBase = ior.getProfile().getCodebase(); PresentationManager.StubFactory stubFactory = null; if (clz == null) { RepositoryId rid = RepositoryId.cache.getId(ior.getTypeId() ); String className = rid.getClassName(); boolean isIDLInterface = rid.isIDLType(); if (className == null || className.equals( "" )) { stubFactory = null; } else { try { stubFactory = sff.createStubFactory(className, isIDLInterface, codeBase, (Class) null, (ClassLoader) null); } catch (Exception exc) { // Could not create stubFactory, so use null. // XXX stubFactory handling is still too complex: // Can we resolve the stubFactory question once in // a single place? stubFactory = null ; } } } else if (StubAdapter.isStubClass(clz)) { stubFactory = PresentationDefaults.makeStaticStubFactory(clz); } else { // clz is an interface class boolean isIDL = IDLEntity.class.isAssignableFrom(clz); stubFactory = sff.createStubFactory( clz.getName(), isIDL, codeBase, clz, clz.getClassLoader()); } return CDRInputStream_1_0.internalIORToObject(ior, stubFactory, orb); } public org.omg.CORBA.ORB orb() { return this.orb; } // org.omg.CORBA_2_3.portable.InputStream public java.io.Serializable read_value() { if (!markOn && !(markedItemQ.isEmpty())) { // dequeue return (Serializable) markedItemQ.removeFirst(); } if (markOn && !(markedItemQ.isEmpty()) && (peekIndex < peekCount)) { // peek return (Serializable) markedItemQ.get(peekIndex++); } try { Serializable value = (java.io.Serializable) is.readObject(); if (markOn) { // enqueue markedItemQ.addLast(value); } return value; } catch (Exception e) { throw wrapper.javaSerializationException(e, "read_value"); } } public java.io.Serializable read_value(java.lang.Class clz) { return read_value(); } public java.io.Serializable read_value( org.omg.CORBA.portable.BoxedValueHelper factory) { return read_value(); } public java.io.Serializable read_value(java.lang.String rep_id) { return read_value(); } public java.io.Serializable read_value(java.io.Serializable value) { return read_value(); } public java.lang.Object read_abstract_interface() { return read_abstract_interface(null); } public java.lang.Object read_abstract_interface(java.lang.Class clz) { boolean isObject = read_boolean(); if (isObject) { return read_Object(clz); } else { return read_value(); } } // com.sun.corba.se.impl.encoding.MarshalInputStream public void consumeEndian() { throw wrapper.giopVersionError(); } public int getPosition() { try { return bis.getPosition(); } catch (Exception e) { throw wrapper.javaSerializationException(e, "getPosition"); } } // org.omg.CORBA.DataInputStream public java.lang.Object read_Abstract() { return read_abstract_interface(); } public java.io.Serializable read_Value() { return read_value(); } public void read_any_array (org.omg.CORBA.AnySeqHolder seq, int offset, int length) { read_any_array(seq.value, offset, length); } private final void read_any_array(org.omg.CORBA.Any[] value, int offset, int length) { for(int i=0; i < length; i++) { value[i+offset] = read_any(); } } public void read_boolean_array (org.omg.CORBA.BooleanSeqHolder seq, int offset, int length){ read_boolean_array(seq.value, offset, length); } public void read_char_array (org.omg.CORBA.CharSeqHolder seq, int offset, int length){ read_char_array(seq.value, offset, length); } public void read_wchar_array (org.omg.CORBA.WCharSeqHolder seq, int offset, int length){ read_wchar_array(seq.value, offset, length); } public void read_octet_array (org.omg.CORBA.OctetSeqHolder seq, int offset, int length){ read_octet_array(seq.value, offset, length); } public void read_short_array (org.omg.CORBA.ShortSeqHolder seq, int offset, int length){ read_short_array(seq.value, offset, length); } public void read_ushort_array (org.omg.CORBA.UShortSeqHolder seq, int offset, int length){ read_ushort_array(seq.value, offset, length); } public void read_long_array (org.omg.CORBA.LongSeqHolder seq, int offset, int length){ read_long_array(seq.value, offset, length); } public void read_ulong_array (org.omg.CORBA.ULongSeqHolder seq, int offset, int length){ read_ulong_array(seq.value, offset, length); } public void read_ulonglong_array (org.omg.CORBA.ULongLongSeqHolder seq, int offset, int length){ read_ulonglong_array(seq.value, offset, length); } public void read_longlong_array (org.omg.CORBA.LongLongSeqHolder seq, int offset, int length){ read_longlong_array(seq.value, offset, length); } public void read_float_array (org.omg.CORBA.FloatSeqHolder seq, int offset, int length){ read_float_array(seq.value, offset, length); } public void read_double_array (org.omg.CORBA.DoubleSeqHolder seq, int offset, int length){ read_double_array(seq.value, offset, length); } // org.omg.CORBA.portable.ValueBase public String[] _truncatable_ids() { throw wrapper.giopVersionError(); } // java.io.InputStream // REVISIT - should we make these throw UnsupportedOperationExceptions? // Right now, they'll go up to the java.io versions! // public int read(byte b[]) throws IOException; // public int read(byte b[], int off, int len) throws IOException // public long skip(long n) throws IOException; // public int available() throws IOException; // public void close() throws IOException; public void mark(int readLimit) { // Nested mark disallowed. // Further, mark is not supported until first 16 bytes are read. if (markOn || is == null) { throw wrapper.javaSerializationException("mark"); } markOn = true; if (!(markedItemQ.isEmpty())) { peekIndex = 0; peekCount = markedItemQ.size(); } /* // Note: only ByteArrayInputStream supports mark/reset. if (is == null || is.markSupported() == false) { throw wrapper.javaSerializationException("mark"); } is.mark(readLimit); */ } public void reset() { markOn = false; peekIndex = 0; peekCount = 0; /* // Note: only ByteArrayInputStream supports mark/reset. if (is == null || is.markSupported() == false) { throw wrapper.javaSerializationException("mark"); } try { is.reset(); } catch (Exception e) { throw wrapper.javaSerializationException(e, "reset"); } */ } // This should return false so that outside users (people using the JDK) // don't have any guarantees that mark/reset will work in their // custom marshaling code. This is necessary since they could do things // like expect obj1a == obj1b in the following code: // // is.mark(10000); // Object obj1a = is.readObject(); // is.reset(); // Object obj1b = is.readObject(); // public boolean markSupported() { return true; } // Needed by AnyImpl and ServiceContexts public CDRInputStreamBase dup() { CDRInputStreamBase result = null ; try { result = (CDRInputStreamBase) this.getClass().newInstance(); } catch (Exception e) { throw wrapper.couldNotDuplicateCdrInputStream(e); } result.init(this.orb, this.buffer, this.bufSize, false, null); // Set the buffer position. ((IDLJavaSerializationInputStream)result).skipBytes(getPosition()); // Set mark related data. ((IDLJavaSerializationInputStream)result). setMarkData(markOn, peekIndex, peekCount, (LinkedList) markedItemQ.clone()); return result; } // Used exclusively by the dup() method. void skipBytes(int len) { try { is.skipBytes(len); } catch (Exception e) { throw wrapper.javaSerializationException(e, "skipBytes"); } } // Used exclusively by the dup() method. void setMarkData(boolean markOn, int peekIndex, int peekCount, LinkedList markedItemQ) { this.markOn = markOn; this.peekIndex = peekIndex; this.peekCount = peekCount; this.markedItemQ = markedItemQ; } // Needed by TCUtility public java.math.BigDecimal read_fixed(short digits, short scale) { // digits isn't really needed here StringBuffer buffer = read_fixed_buffer(); if (digits != buffer.length()) throw wrapper.badFixed( new Integer(digits), new Integer(buffer.length()) ) ; buffer.insert(digits - scale, '.'); return new BigDecimal(buffer.toString()); } // Needed by TypeCodeImpl public boolean isLittleEndian() { throw wrapper.giopVersionError(); } // Needed by request and reply messages for GIOP versions >= 1.2 only. void setHeaderPadding(boolean headerPadding) { // no-op. We don't care about body alignment while using // Java serialization. What the GIOP spec states does not apply here. } // Needed by IIOPInputStream and other subclasses public ByteBuffer getByteBuffer() { throw wrapper.giopVersionError(); } public void setByteBuffer(ByteBuffer byteBuffer) { throw wrapper.giopVersionError(); } public void setByteBufferWithInfo(ByteBufferWithInfo bbwi) { throw wrapper.giopVersionError(); } public int getBufferLength() { return bufSize; } public void setBufferLength(int value) { // this is redundant, since buffer size was already specified // as part of the init call. So, ignore. } public int getIndex() { return bis.getPosition(); } public void setIndex(int value) { try { bis.setPosition(value); } catch (IndexOutOfBoundsException e) { throw wrapper.javaSerializationException(e, "setIndex"); } } public void orb(org.omg.CORBA.ORB orb) { this.orb = (ORB) orb; } public BufferManagerRead getBufferManager() { return bufferManager; } public GIOPVersion getGIOPVersion() { return GIOPVersion.V1_2; } com.sun.org.omg.SendingContext.CodeBase getCodeBase() { return parent.getCodeBase(); } void printBuffer() { byte[] buf = this.buffer.array(); System.out.println("+++++++ Input Buffer ++++++++"); System.out.println(); System.out.println("Current position: " + getPosition()); System.out.println("Total length : " + this.bufSize); System.out.println(); char[] charBuf = new char[16]; try { for (int i = 0; i < buf.length; i += 16) { int j = 0; // For every 16 bytes, there is one line // of output. First, the hex output of // the 16 bytes with each byte separated // by a space. while (j < 16 && j + i < buf.length) { int k = buf[i + j]; if (k < 0) k = 256 + k; String hex = Integer.toHexString(k); if (hex.length() == 1) hex = "0" + hex; System.out.print(hex + " "); j++; } // Add any extra spaces to align the // text column in case we didn't end // at 16 while (j < 16) { System.out.print(" "); j++; } // Now output the ASCII equivalents. Non-ASCII // characters are shown as periods. int x = 0; while (x < 16 && x + i < buf.length) { if (ORBUtility.isPrintable((char)buf[i + x])) { charBuf[x] = (char) buf[i + x]; } else { charBuf[x] = '.'; } x++; } System.out.println(new String(charBuf, 0, x)); } } catch (Throwable t) { t.printStackTrace(); } System.out.println("++++++++++++++++++++++++++++++"); } void alignOnBoundary(int octetBoundary) { throw wrapper.giopVersionError(); } void performORBVersionSpecificInit() { // No-op. } public void resetCodeSetConverters() { // No-op. } // ValueInputStream ------------------------- public void start_value() { throw wrapper.giopVersionError(); } public void end_value() { throw wrapper.giopVersionError(); } }