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

📄 iiopoutputstream.java

📁 java jdk 1.4的源码
💻 JAVA
字号:
/* * @(#)IIOPOutputStream.java	1.69 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 java.util.Iterator;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.COMM_FAILURE;import org.omg.CORBA.TRANSIENT;import org.omg.CORBA.NO_RESOURCES;import org.omg.CORBA.Principal;import org.omg.CORBA.TypeCode;import org.omg.CORBA.Any;import org.omg.CORBA.portable.*;import com.sun.corba.se.internal.util.Utility; //d11638import com.sun.corba.se.internal.orbutil.MinorCodes; //d11638import com.sun.corba.se.internal.core.ClientResponse;import com.sun.corba.se.internal.core.IOR;import com.sun.corba.se.internal.core.GIOPVersion;import com.sun.corba.se.internal.iiop.messages.Message;import com.sun.corba.se.internal.iiop.messages.MessageBase;import com.sun.corba.se.internal.core.CodeSetConversion;import com.sun.corba.se.internal.core.OSFCodeSetRegistry;import com.sun.corba.se.internal.core.CodeSetComponentInfo;import com.sun.corba.se.internal.orbutil.ORBUtility;public class IIOPOutputStream extends CDROutputStream{    protected Connection conn;    protected Message msg;    /*     Extraneous constructor    Marked for removing    public IIOPOutputStream(ORB orb, Connection c) {        this(orb,             orb.getGIOPVersion(),             c);    }    */    public IIOPOutputStream(GIOPVersion version, ORB orb, Connection c)    {        super(orb, version);        getBufferManager().setIIOPOutputStream(this);        this.conn = c;    }    // this is called during locate msg creation to force no fragmentation    // for LocateRequest & LocateReply msgs for GIOP version 1.0 & 1.1.    public IIOPOutputStream(GIOPVersion version, ORB orb, Connection c,            boolean allowFragmentation) {        super(orb, version, allowFragmentation);        getBufferManager().setIIOPOutputStream(this);        this.conn = c;    }    public IIOPOutputStream(IIOPInputStream s) {        this(s.getGIOPVersion(),             (com.sun.corba.se.internal.iiop.ORB)s.orb(),              s.getConnection());    }    public final Connection getConnection() {	return conn;    }    // once request stream is created, its connection should not be altered.    /*    public final void setConnection(Connection c) {	this.conn = c;    }    */    public final Message getMessage() {	return msg;    }    public final void setMessage(Message msg) {	this.msg = msg;    }    // Removes the connection from the cache    private void deleteCurrentConnection()    {        GIOPImpl clientGIOP = (GIOPImpl)(((com.sun.corba.se.internal.core.ORB)orb()).getClientGIOP());        if (clientGIOP != null)            clientGIOP.deleteConnection(((IIOPConnection)conn).getEndpoint());    }    public IIOPInputStream invoke(boolean isOneway)    {        ClientResponse response = null;        SystemException systemEx = null;        try {            // Sends either the entire message or the last fragment            finishSendingMessage();            // Call getResponse here even if it's a oneway call in order            // to remove the out call descriptor            response = (ClientResponse)((IIOPConnection)conn).getResponse(isOneway,                                                                          MessageBase.getRequestId(getMessage()));            if (isOneway)                return null;            if (response.isSystemException()) {                systemEx = response.getSystemException();                if (systemEx == null)                    throw new INTERNAL("getSystemException returned null in IIOPOutputStream",                                       MinorCodes.GET_SYSTEM_EX_RETURNED_NULL,                                       CompletionStatus.COMPLETED_MAYBE);            } else                return (IIOPInputStream)response;        } catch (SystemException ex) {            systemEx = ex;        }        if (systemEx.completed == CompletionStatus.COMPLETED_NO &&	    systemEx.getClass() == COMM_FAILURE.class ) {            deleteCurrentConnection();        }        // Always return null even if we got a SystemException        // for oneways.         if (isOneway)            return null;        // A response from the server may have service contexts        if (response != null)            return (IIOPInputStream)response;        else            return new ClientResponseImpl(systemEx);    }    public final void finishSendingMessage() {        getBufferManager().sendMessage();    }    /**     * Write the contents of the CDROutputStream to the specified     * output stream.  Has the side-effect of pushing any current     * Message onto the Message list.     * @param s The output stream to write to.     */    public void writeTo(java.io.OutputStream s) throws java.io.IOException {        //        // Update the GIOP MessageHeader size field.        //        ByteBufferWithInfo bbwi = getByteBufferWithInfo();        msg.setSize(bbwi.buf, bbwi.getSize());        com.sun.corba.se.internal.corba.ORB ourORB =             (com.sun.corba.se.internal.corba.ORB)orb();        if (ourORB != null && ourORB.giopDebugFlag) {            ORBUtility.dprint(this, "Sending message:");            CDROutputStream_1_0.printBuffer(bbwi);        }        s.write(bbwi.buf, 0, bbwi.getSize());        // TimeStamp connection to indicate it has been used        // Note granularity of connection usage is assumed for        // now to be that of a IIOP packet.        conn.stampTime();    }    /** overrides create_input_stream from CDROutputStream */    public org.omg.CORBA.portable.InputStream create_input_stream()    {        return new IIOPInputStream((com.sun.corba.se.internal.iiop.ORB)orb(), getByteBuffer(), getIndex(), isLittleEndian(), msg, conn);    }    // static methods   /*    * This chooses the right buffering strategy for the locate msg.    * locate msgs 1.0 & 1.1 :=> grow, 1.2 :=> stream    */    public static IIOPOutputStream createIIOPOutputStreamForLocateMsg(            GIOPVersion giopVersion, ORB orb, Connection c) {        if (giopVersion.lessThan(GIOPVersion.V1_2)) { // no fragmentation            return new IIOPOutputStream(giopVersion, orb, c, false);        } else {            return new IIOPOutputStream(giopVersion, orb, c);        }    }        /**     * 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.CTBConverter createCharCTBConverter() {        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.createCharCTBConverter();                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().getCTBConverter(charSet,                                                         isLittleEndian(),                                                         false);    }    protected CodeSetConversion.CTBConverter createWCharCTBConverter() {        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);        boolean useByteOrderMarkers            = ((com.sun.corba.se.internal.corba.ORB)orb()).useByteOrderMarkers();        // With UTF-16:        //        // For GIOP 1.2, we can put byte order markers if we want to, and        // use the default of big endian otherwise.  (See issue 3405b)        //        // For GIOP 1.1, we don't use BOMs and use the endianness of        // the stream.        if (wcharSet == OSFCodeSetRegistry.UTF_16) {            if (getGIOPVersion().equals(GIOPVersion.V1_2)) {                return CodeSetConversion.impl().getCTBConverter(wcharSet,                                                                 false,                                                                 useByteOrderMarkers);            }            if (getGIOPVersion().equals(GIOPVersion.V1_1)) {                return CodeSetConversion.impl().getCTBConverter(wcharSet,                                                                isLittleEndian(),                                                                false);            }        }        // In the normal case, let the converter system handle it        return CodeSetConversion.impl().getCTBConverter(wcharSet,                                                         isLittleEndian(),                                                        useByteOrderMarkers);    }    // 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -