⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdrinputobject.java

📁 JAVA 所有包
💻 JAVA
字号:
/* * @(#)CDRInputObject.java	1.39 05/11/17 *  * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.corba.se.impl.encoding;import java.nio.ByteBuffer;import com.sun.org.omg.SendingContext.CodeBase;import com.sun.corba.se.pept.encoding.InputObject;import com.sun.corba.se.spi.logging.CORBALogDomains;import com.sun.corba.se.spi.orb.ORB;import com.sun.corba.se.spi.transport.CorbaConnection;import com.sun.corba.se.spi.ior.iiop.GIOPVersion;import com.sun.corba.se.impl.encoding.BufferManagerFactory;import com.sun.corba.se.impl.encoding.CodeSetComponentInfo;import com.sun.corba.se.impl.encoding.CodeSetConversion;import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry;import com.sun.corba.se.impl.encoding.CDRInputStream;import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;import com.sun.corba.se.impl.logging.ORBUtilSystemException;import com.sun.corba.se.impl.logging.OMGSystemException;import com.sun.corba.se.impl.orbutil.ORBUtility;/** * @author Harold Carr */public class CDRInputObject extends CDRInputStream    implements 	InputObject{    private CorbaConnection corbaConnection;    private Message header;    private boolean unmarshaledHeader;    private ORB orb ;    private ORBUtilSystemException wrapper ;    private OMGSystemException omgWrapper ;    public CDRInputObject(ORB orb,			  CorbaConnection corbaConnection,			  ByteBuffer byteBuffer,			  Message header)    {        super(orb, byteBuffer, header.getSize(), header.isLittleEndian(),              header.getGIOPVersion(), header.getEncodingVersion(),              BufferManagerFactory.newBufferManagerRead(					  header.getGIOPVersion(),					  header.getEncodingVersion(),					  orb));	this.corbaConnection = corbaConnection;	this.orb = orb ;	this.wrapper = ORBUtilSystemException.get( orb, 	    CORBALogDomains.RPC_ENCODING ) ;	this.omgWrapper = OMGSystemException.get( orb, 	    CORBALogDomains.RPC_ENCODING ) ;	if (orb.transportDebugFlag) {	    dprint(".CDRInputObject constructor:");	}        getBufferManager().init(header);        this.header = header;        unmarshaledHeader = false;        setIndex(Message.GIOPMessageHeaderLength);        setBufferLength(header.getSize());    }    // REVISIT - think about this some more.    // This connection normally is accessed from the message mediator.    // However, giop input needs to get code set info from the connetion    // *before* the message mediator is available.    public final CorbaConnection getConnection()     {        return corbaConnection;    }    // XREVISIT - Should the header be kept in the stream or the    // message mediator?  Or should we not have a header and    // have the information stored in the message mediator    // directly?    public Message getMessageHeader()     {        return header;    }    /**     * Unmarshal the extended GIOP header     * NOTE: May be fragmented, so should not be called by the ReaderThread.     * See CorbaResponseWaitingRoomImpl.waitForResponse.  It is done     * there in the client thread.     */    public void unmarshalHeader()    {        // Unmarshal the extended GIOP message from the buffer.        if (!unmarshaledHeader) {	    try {		if (((ORB)orb()).transportDebugFlag) {		    dprint(".unmarshalHeader->: " + getMessageHeader());		}		getMessageHeader().read(this);		unmarshaledHeader= true;	    } catch (RuntimeException e) {		if (((ORB)orb()).transportDebugFlag) {		    dprint(".unmarshalHeader: !!ERROR!!: " 			   + getMessageHeader()			   + ": " + e);		}		throw e;	    } finally {		if (((ORB)orb()).transportDebugFlag) {		    dprint(".unmarshalHeader<-: " + getMessageHeader());		}	    }        }    }    public final boolean unmarshaledHeader()     {        return unmarshaledHeader;    }    /**     * 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 wrapper.unknownCodeset( charSet ) ;        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 (getConnection().isServer())		throw omgWrapper.noClientWcharCodesetCtx() ;            else		throw omgWrapper.noServerWcharCodesetCmp() ;        }        OSFCodeSetRegistry.Entry wcharSet            = OSFCodeSetRegistry.lookupEntry(codesets.getWCharCodeSet());        if (wcharSet == null)	    throw wrapper.unknownCodeset( wcharSet ) ;        // 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 (getConnection() == null)            return CodeSetComponentInfo.LOCAL_CODE_SETS;        else            return getConnection().getCodeSetContext();    }        public final CodeBase getCodeBase() {        if (getConnection() == null)            return null;        else            return getConnection().getCodeBase();    }    // -----------------------------------------------------------    // Below this point are commented out methods with features    // from the old stream.  We must find ways to address    // these issues in the future.    // -----------------------------------------------------------    // XREVISIT//     private XIIOPInputStream(XIIOPInputStream stream) {//         super(stream);//         this.conn = stream.conn;//         this.msg = stream.msg;//         this.unmarshaledHeader = stream.unmarshaledHeader;//     }    public CDRInputStream dup() {        // XREVISIT        return null;        // return new XIIOPInputStream(this);    }    protected void dprint(String msg)     {	ORBUtility.dprint("CDRInputObject", msg);    }}// End of file.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -