- /*
- * @(#)Message_1_1.java 1.12 04/06/21
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
- package com.sun.corba.se.impl.protocol.giopmsgheaders;
-
- import java.nio.ByteBuffer;
- import org.omg.CORBA.INTERNAL;
- import org.omg.CORBA.CompletionStatus;
-
- import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
-
- import com.sun.corba.se.spi.logging.CORBALogDomains ;
- import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
-
- /*
- * This implements the GIOP 1.1 & 1.2 Message header.
- *
- * @author Ram Jeyaraman 05/14/2000
- * @version 1.0
- */
-
- public class Message_1_1
- extends com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase {
-
- // Constants
- final static int UPPER_THREE_BYTES_OF_INT_MASK = 0xFF;
-
- private static ORBUtilSystemException wrapper =
- ORBUtilSystemException.get( CORBALogDomains.RPC_PROTOCOL ) ;
-
- // Instance variables
- int magic = (int) 0;
- GIOPVersion GIOP_version = null;
- byte flags = (byte) 0;
- byte message_type = (byte) 0;
- int message_size = (int) 0;
-
- // Constructor
-
- Message_1_1() {
- }
-
- Message_1_1(int _magic, GIOPVersion _GIOP_version, byte _flags,
- byte _message_type, int _message_size) {
- magic = _magic;
- GIOP_version = _GIOP_version;
- flags = _flags;
- message_type = _message_type;
- message_size = _message_size;
- }
-
- // Accessor methods
-
- public GIOPVersion getGIOPVersion() {
- return this.GIOP_version;
- }
-
- public int getType() {
- return this.message_type;
- }
-
- public int getSize() {
- return this.message_size;
- }
-
- public boolean isLittleEndian() {
- return ((this.flags & LITTLE_ENDIAN_BIT) == LITTLE_ENDIAN_BIT);
- }
-
- public boolean moreFragmentsToFollow() {
- return ( (this.flags & MORE_FRAGMENTS_BIT) == MORE_FRAGMENTS_BIT );
- }
-
- // Mutator methods
-
- // NOTE: This is a SUN PROPRIETARY EXTENSION
- // Add the poolToUse to the upper 6 bits of byte 6 of the GIOP header.
- // this.flags represents byte 6 here.
- public void setThreadPoolToUse(int poolToUse) {
- // IMPORTANT: Bitwise operations will promote
- // byte types to int before performing
- // bitwise operations. And, Java
- // types are signed.
- int tmpFlags = poolToUse << 2;
- tmpFlags &= UPPER_THREE_BYTES_OF_INT_MASK;
- tmpFlags |= flags;
- flags = (byte)tmpFlags;
- }
-
- public void setSize(ByteBuffer byteBuffer, int size) {
-
- this.message_size = size;
-
- //
- // Patch the size field in the header.
- //
-
- int patch = size - GIOPMessageHeaderLength;
- if (!isLittleEndian()) {
- byteBuffer.put(8, (byte)((patch >>> 24) & 0xFF));
- byteBuffer.put(9, (byte)((patch >>> 16) & 0xFF));
- byteBuffer.put(10, (byte)((patch >>> 8) & 0xFF));
- byteBuffer.put(11, (byte)((patch >>> 0) & 0xFF));
- } else {
- byteBuffer.put(8, (byte)((patch >>> 0) & 0xFF));
- byteBuffer.put(9, (byte)((patch >>> 8) & 0xFF));
- byteBuffer.put(10, (byte)((patch >>> 16) & 0xFF));
- byteBuffer.put(11, (byte)((patch >>> 24) & 0xFF));
- }
- }
-
- /**
- * Allows us to create a fragment message from any message type.
- */
- public FragmentMessage createFragmentMessage() {
-
- // check for message type validity
-
- switch (this.message_type) {
- case GIOPCancelRequest :
- case GIOPCloseConnection :
- case GIOPMessageError :
- throw wrapper.fragmentationDisallowed(
- CompletionStatus.COMPLETED_MAYBE);
- case GIOPLocateRequest :
- case GIOPLocateReply :
- if (this.GIOP_version.equals(GIOPVersion.V1_1)) {
- throw wrapper.fragmentationDisallowed(
- CompletionStatus.COMPLETED_MAYBE);
- }
- break;
- }
-
- /*
- // A fragmented mesg can be created only if the current mesg' fragment
- // bit is set. Otherwise, raise error
- // too stringent check
- if ( (this.flags & MORE_FRAGMENTS_BIT) != MORE_FRAGMENTS_BIT ) {
- throw wrapper.fragmentationDisallowed( CompletionStatus.COMPLETED_MAYBE);
- }
- */
- if (this.GIOP_version.equals(GIOPVersion.V1_1)) {
- return new FragmentMessage_1_1(this);
- } else if (this.GIOP_version.equals(GIOPVersion.V1_2)) {
- return new FragmentMessage_1_2(this);
- }
-
- throw wrapper.giopVersionError( CompletionStatus.COMPLETED_MAYBE);
- }
-
- // IO methods
-
- // This should do nothing even if it is called. The Message Header is read
- // off a java.io.InputStream (not a CDRInputStream) by IIOPConnection
- // in order to choose the correct CDR Version , msg_type, and msg_size.
- // So, we would never need to read the Message Header off a CDRInputStream.
- public void read(org.omg.CORBA.portable.InputStream istream) {
- /*
- this.magic = istream.read_long();
- this.GIOP_version = (new GIOPVersion()).read(istream);
- this.flags = istream.read_octet();
- this.message_type = istream.read_octet();
- this.message_size = istream.read_ulong();
- */
- }
-
- public void write(org.omg.CORBA.portable.OutputStream ostream) {
- ostream.write_long(this.magic);
- nullCheck(this.GIOP_version);
- this.GIOP_version.write(ostream);
- ostream.write_octet(this.flags);
- ostream.write_octet(this.message_type);
- ostream.write_ulong(this.message_size);
- }
- } // class Message_1_1