buffermanagerwritestream.java

来自「java jdk 1.4的源码」· Java 代码 · 共 142 行

JAVA
142
字号
/* * @(#)BufferManagerWriteStream.java	1.13 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.util.Iterator;import java.util.NoSuchElementException;import com.sun.corba.se.internal.orbutil.ORBConstants;import com.sun.corba.se.internal.iiop.messages.Message;import com.sun.corba.se.internal.iiop.messages.MessageBase;import com.sun.corba.se.internal.iiop.messages.FragmentMessage;/** * Initial implementation of the streaming buffer manager. */public class BufferManagerWriteStream extends BufferManagerWrite{    private int initialFragmentSize = 0, fragmentCount = 0;    private ByteBufferWithInfo finalFragment = null;    public BufferManagerWriteStream(int initialFragmentSize) {        this.stream = null;        this.initialFragmentSize = initialFragmentSize;    }    public ByteBufferWithInfo getInitialBuffer(int size)    {	return new ByteBufferWithInfo(size);    }    public int getInitialBufferSize() {        return initialFragmentSize;    }    public void overflow (ByteBufferWithInfo bbwi)    {        // Set the fragment's moreFragments field to true        MessageBase.setFlag(bbwi.buf, Message.MORE_FRAGMENTS_BIT);        sendFragment(false);        // Reuse the old buffer        // REVISIT - need to account for case when needed > available        // even after fragmenting.  This is the large array case, so        // the caller should retry when it runs out of space.        bbwi.index = 0;        bbwi.buflen = bbwi.buf.length;        bbwi.fragmented = true;        // Now we must marshal in the fragment header/GIOP header        // REVISIT - we can optimize this by not creating the fragment message        // each time.          FragmentMessage header = stream.getMessage().createFragmentMessage();        // Is this necessary?        // stream.setMessage(header);        header.write(stream);    }    private void sendFragment(boolean isLastFragment)    {        IIOPConnection conn = (IIOPConnection) stream.getConnection();        conn.writeLock();        if (this.fragmentCount == 0) {	    int requestID = MessageBase.getRequestId(stream.getMessage());            // create OutCallDesc once before sending the first fragment            conn.createOutCallDescriptor(requestID);	    // Also, remember fragments in progress in case of errors.	    conn.createIdToFragmentedOutputStreamEntry(requestID, stream);        }        try {            // Send the fragment            conn.sendWithoutLock(stream);        } finally {	    if (isLastFragment) {		int requestID = MessageBase.getRequestId(stream.getMessage());		conn.removeIdToFragmentedOutputStreamEntry(requestID);	    }            conn.writeUnlock();	    // REVISIT: this should go after sendWithoutLock            this.fragmentCount++; // keeps count of # of fragments sent        }    }    // Sends the last fragment    public void sendMessage ()    {        sendFragment(true);    }    /*    private Iterator iterator ()    {	return new BufferManagerWriteStreamIterator();    }    // Only handles the very last fragment    private class BufferManagerWriteStreamIterator implements Iterator    {	private boolean _hasNext = true;	public boolean hasNext ()	{	    return _hasNext;	}	public Object next ()	{	    if (_hasNext) {		_hasNext = false;		return finalFragment;	    }	    throw new NoSuchElementException();	}	public void remove ()	{	    throw new UnsupportedOperationException();	}    }    */}

⌨️ 快捷键说明

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