- /*
- * @(#)BufferManagerWrite.java 1.10 03/12/19
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
- package com.sun.corba.se.impl.encoding;
-
- import com.sun.corba.se.spi.logging.CORBALogDomains;
-
- import com.sun.corba.se.spi.orb.ORB;
-
- import com.sun.corba.se.impl.encoding.ByteBufferWithInfo;
-
- import com.sun.corba.se.impl.logging.ORBUtilSystemException;
-
- /**
- * Defines the contract between the BufferManager and
- * CDR stream on the writing side. The CDR stream
- * calls back to the BufferManagerWrite when it needs
- * more room in the output buffer to continue. The
- * BufferManager can then grow the output buffer or
- * use some kind of fragmentation technique.
- */
- public abstract class BufferManagerWrite
- {
- protected ORB orb ;
- protected ORBUtilSystemException wrapper ;
-
- BufferManagerWrite( ORB orb )
- {
- this.orb = orb ;
- this.wrapper = ORBUtilSystemException.get( orb,
- CORBALogDomains.RPC_ENCODING ) ;
- }
-
- /**
- * Has the stream sent out any fragments so far?
- */
- public abstract boolean sentFragment();
-
- /**
- * Has the entire message been sent? (Has
- * sendMessage been called?)
- */
- public boolean sentFullMessage() {
- return sentFullMessage;
- }
-
- /**
- * Returns the correct buffer size for this type of
- * buffer manager as set in the ORB.
- */
- public abstract int getBufferSize();
-
- /*
- * Called from CDROutputStream.grow.
- *
- * bbwi.buf contains a byte array which needs to grow by bbwi.needed bytes.
- *
- * This can be handled in several ways:
- *
- * 1. Resize the bbwi.buf like the current implementation of
- * CDROutputStream.grow.
- *
- * 2. Collect the buffer for a later send:
- * this.bufQ.put(bbwi);
- * return new ByteBufferWithInfo(bbwi.length);
- *
- * 3. Send buffer as fragment:
- * Backpatch fragment size field in bbwi.buf.
- * Set more fragments bit in bbwi.buf.
- * this.connection.send(bbwi);
- * return reinitialized bbwi.buf with fragment header
- *
- * All cases should adjust the returned bbwi.* appropriately.
- *
- * Should set the bbwi.fragmented flag to true only in cases 2 and 3.
- */
-
- public abstract void overflow (ByteBufferWithInfo bbwi);
-
- /**
- * Called after Stub._invoke (i.e., before complete message has been sent).
- *
- * IIOPOutputStream.writeTo called from IIOPOutputStream.invoke
- *
- * Case: overflow was never called (bbwi.buf contains complete message).
- * Backpatch size field.
- * If growing or collecting:
- * this.bufQ.put(bbwi).
- * this.bufQ.iterate // However, see comment in getBufferQ
- * this.connection.send(fragment)
- * If streaming:
- * this.connection.send(bbwi).
- *
- * Case: overflow was called N times (bbwi.buf contains last buffer).
- * If growing or collecting:
- * this.bufQ.put(bbwi).
- * backpatch size field in first buffer.
- * this.bufQ.iterate // However, see comment in getBufferQ
- * this.connection.send(fragment)
- * If streaming:
- * backpatch fragment size field in bbwi.buf.
- * Set no more fragments bit.
- * this.connection.send(bbwi).
- */
-
- public abstract void sendMessage ();
-
- /**
- * A reference to the connection level stream will be required when
- * sending fragments.
- */
- public void setOutputObject(Object outputObject) {
- this.outputObject = outputObject;
- }
-
- /**
- * Close the BufferManagerWrite and do any outstanding cleanup.
- */
- abstract public void close();
-
-
- // XREVISIT - Currently a java.lang.Object during
- // the rip-int-generic transition. Should eventually
- // become a GIOPOutputObject.
- protected Object outputObject;
-
- protected boolean sentFullMessage = false;
- }
-