iiopinputstream.java
来自「java jdk 1.4的源码」· Java 代码 · 共 260 行
JAVA
260 行
/* * @(#)IIOPInputStream.java 1.60 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.corba.se.internal.iiop;import java.io.IOException;import org.omg.CORBA.SystemException;import org.omg.CORBA.CompletionStatus;import org.omg.CORBA.INTERNAL;import org.omg.CORBA.MARSHAL;import org.omg.CORBA.DATA_CONVERSION;import org.omg.CORBA.BAD_PARAM;import org.omg.CORBA.INV_OBJREF;import org.omg.CORBA.Object;import org.omg.CORBA.Principal;import org.omg.CORBA.TypeCode;import org.omg.CORBA.Any;import org.omg.CORBA.CompletionStatus;import com.sun.org.omg.SendingContext.CodeBase;import com.sun.corba.se.internal.orbutil.MinorCodes;import com.sun.corba.se.internal.orbutil.ORBUtility;import com.sun.corba.se.internal.iiop.ByteBufferWithInfo;import com.sun.corba.se.internal.iiop.messages.Message;import com.sun.corba.se.internal.core.GIOPVersion;import com.sun.corba.se.internal.core.CodeSetConversion;import com.sun.corba.se.internal.core.OSFCodeSetRegistry;import com.sun.corba.se.internal.core.CodeSetComponentInfo;public class IIOPInputStream extends CDRInputStream{ protected Connection conn; protected Message msg = null; private boolean unmarshaledHeader; private void dprint( String msg ) { ORBUtility.dprint( this, msg ) ; } public IIOPInputStream() { } private IIOPInputStream(IIOPInputStream stream) { super(stream); this.conn = stream.conn; this.msg = stream.msg; this.unmarshaledHeader = stream.unmarshaledHeader; } public CDRInputStream dup() { return new IIOPInputStream(this); } // Used by // IIOPOutputStream public IIOPInputStream(ORB orb, byte[] msgbuf, int msgsize, boolean endian, Message msg, Connection conn) { super(orb, msgbuf, msgsize, endian, msg.getGIOPVersion(), false); getBufferManager().init(msg); unmarshaledHeader = true; this.msg = msg; this.conn = conn; } // Used by // IIOPConnection // ClientResponseImpl // ServerRequestImpl // ... public IIOPInputStream(Connection c, byte[] msgbuf, Message header) throws java.io.IOException { super(c.getORB(), msgbuf, header.getSize(), header.isLittleEndian(), header.getGIOPVersion()); getBufferManager().init(header); this.conn = c; com.sun.corba.se.internal.corba.ORB theORB = (com.sun.corba.se.internal.corba.ORB)(c.getORB()) ; if (theORB.transportDebugFlag) dprint( "Constructing IIOPInputStream object" ) ; this.msg = header; unmarshaledHeader = false; setIndex(Message.GIOPMessageHeaderLength); setBufferLength(msg.getSize()); if (theORB.transportDebugFlag) dprint( "Setting the time stamp" ) ; c.stampTime(); } /** * Unmarshal the extended GIOP header (may be fragmented, so * shouldn't be called by the ReaderThread) */ public void unmarshalHeader() { //if (theORB.transportDebugFlag) // dprint( "Unmarshalling the GIOP message" ) ; // Unmarshal the extended GIOP message from the buffer. if (!unmarshaledHeader) { msg.read(this); unmarshaledHeader= true; } } public final boolean unmarshaledHeader() { return unmarshaledHeader; } public final Connection getConnection() { return conn; } // once response stream is created, its connection should not be altered. /* public final void setConnection(Connection c) { this.conn = c; // to avoid null pointer exception for the local case if (c != null) { orb(c.getORB()); } } */ public final Message getMessage() { return msg; } /* This must not be allowed. The message should be the same regardless of fragmentation. public final void setMessage(Message msg) { this.msg = msg; } */ // // We ran out of things to read. We pre-read everything // off of the java.io.InputStream in IIOPConnection.createInputStream() // so this can't happen normally. // protected void grow(int align, int n) { throw new MARSHAL(MinorCodes.IIOPINPUTSTREAM_GROW, CompletionStatus.COMPLETED_MAYBE); } public CodeBase getCodeBase() { if (conn == null) return null; else return conn.getCodeBase(); } /** * Override the default CDR factory behavior to get the * negotiated code sets from the connection. * * These are only called once per message, the first time needed. * * In the local case, there is no Connection, so use the * local code sets. */ protected CodeSetConversion.BTCConverter createCharBTCConverter() { CodeSetComponentInfo.CodeSetContext codesets = getCodeSets(); // If the connection doesn't have its negotiated // code sets by now, fall back on the defaults defined // in CDRInputStream. if (codesets == null) return super.createCharBTCConverter(); OSFCodeSetRegistry.Entry charSet = OSFCodeSetRegistry.lookupEntry(codesets.getCharCodeSet()); if (charSet == null) throw new MARSHAL("Unknown char set: " + charSet, MinorCodes.UNKNOWN_CODESET, CompletionStatus.COMPLETED_NO); return CodeSetConversion.impl().getBTCConverter(charSet, isLittleEndian()); } protected CodeSetConversion.BTCConverter createWCharBTCConverter() { CodeSetComponentInfo.CodeSetContext codesets = getCodeSets(); // If the connection doesn't have its negotiated // code sets by now, we have to throw an exception. // See CORBA formal 00-11-03 13.9.2.6. if (codesets == null) { if (conn.isServer()) throw new BAD_PARAM(MinorCodes.NO_CLIENT_WCHAR_CODESET_CTX, CompletionStatus.COMPLETED_MAYBE); else throw new INV_OBJREF(MinorCodes.NO_SERVER_WCHAR_CODESET_CMP, CompletionStatus.COMPLETED_NO); } OSFCodeSetRegistry.Entry wcharSet = OSFCodeSetRegistry.lookupEntry(codesets.getWCharCodeSet()); if (wcharSet == null) throw new MARSHAL("Unknown wchar set: " + wcharSet, MinorCodes.UNKNOWN_CODESET, CompletionStatus.COMPLETED_NO); // For GIOP 1.2 and UTF-16, use big endian if there is no byte // order marker. (See issue 3405b) // // For GIOP 1.1 and UTF-16, use the byte order the stream if // there isn't (and there shouldn't be) a byte order marker. // // GIOP 1.0 doesn't have wchars. If we're talking to a legacy ORB, // we do what our old ORBs did. if (wcharSet == OSFCodeSetRegistry.UTF_16) { if (getGIOPVersion().equals(GIOPVersion.V1_2)) return CodeSetConversion.impl().getBTCConverter(wcharSet, false); } return CodeSetConversion.impl().getBTCConverter(wcharSet, isLittleEndian()); } // If we're local and don't have a Connection, use the // local code sets, otherwise get them from the connection. // If the connection doesn't have negotiated code sets // yet, then we use ISO8859-1 for char/string and wchar/wstring // are illegal. private CodeSetComponentInfo.CodeSetContext getCodeSets() { if (conn == null) return CodeSetComponentInfo.LOCAL_CODE_SETS; else return conn.getCodeSetContext(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?