Message_1_1.java revision 608:7e06bf1dcb09
1/* 2 * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package com.sun.corba.se.impl.protocol.giopmsgheaders; 27 28import java.nio.ByteBuffer; 29import org.omg.CORBA.INTERNAL; 30import org.omg.CORBA.CompletionStatus; 31 32import com.sun.corba.se.spi.ior.iiop.GIOPVersion; 33 34import com.sun.corba.se.spi.logging.CORBALogDomains ; 35import com.sun.corba.se.impl.logging.ORBUtilSystemException ; 36 37/* 38 * This implements the GIOP 1.1 & 1.2 Message header. 39 * 40 * @author Ram Jeyaraman 05/14/2000 41 */ 42 43public class Message_1_1 44 extends com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase { 45 46 // Constants 47 final static int UPPER_THREE_BYTES_OF_INT_MASK = 0xFF; 48 49 private static ORBUtilSystemException wrapper = 50 ORBUtilSystemException.get( CORBALogDomains.RPC_PROTOCOL ) ; 51 52 // Instance variables 53 int magic = (int) 0; 54 GIOPVersion GIOP_version = null; 55 byte flags = (byte) 0; 56 byte message_type = (byte) 0; 57 int message_size = (int) 0; 58 59 // Constructor 60 61 Message_1_1() { 62 } 63 64 Message_1_1(int _magic, GIOPVersion _GIOP_version, byte _flags, 65 byte _message_type, int _message_size) { 66 magic = _magic; 67 GIOP_version = _GIOP_version; 68 flags = _flags; 69 message_type = _message_type; 70 message_size = _message_size; 71 } 72 73 // Accessor methods 74 75 public GIOPVersion getGIOPVersion() { 76 return this.GIOP_version; 77 } 78 79 public int getType() { 80 return this.message_type; 81 } 82 83 public int getSize() { 84 return this.message_size; 85 } 86 87 public boolean isLittleEndian() { 88 return ((this.flags & LITTLE_ENDIAN_BIT) == LITTLE_ENDIAN_BIT); 89 } 90 91 public boolean moreFragmentsToFollow() { 92 return ( (this.flags & MORE_FRAGMENTS_BIT) == MORE_FRAGMENTS_BIT ); 93 } 94 95 // Mutator methods 96 97 // NOTE: This is a SUN PROPRIETARY EXTENSION 98 // Add the poolToUse to the upper 6 bits of byte 6 of the GIOP header. 99 // this.flags represents byte 6 here. 100 public void setThreadPoolToUse(int poolToUse) { 101 // IMPORTANT: Bitwise operations will promote 102 // byte types to int before performing 103 // bitwise operations. And, Java 104 // types are signed. 105 int tmpFlags = poolToUse << 2; 106 tmpFlags &= UPPER_THREE_BYTES_OF_INT_MASK; 107 tmpFlags |= flags; 108 flags = (byte)tmpFlags; 109 } 110 111 public void setSize(ByteBuffer byteBuffer, int size) { 112 113 this.message_size = size; 114 115 // 116 // Patch the size field in the header. 117 // 118 119 int patch = size - GIOPMessageHeaderLength; 120 if (!isLittleEndian()) { 121 byteBuffer.put(8, (byte)((patch >>> 24) & 0xFF)); 122 byteBuffer.put(9, (byte)((patch >>> 16) & 0xFF)); 123 byteBuffer.put(10, (byte)((patch >>> 8) & 0xFF)); 124 byteBuffer.put(11, (byte)((patch >>> 0) & 0xFF)); 125 } else { 126 byteBuffer.put(8, (byte)((patch >>> 0) & 0xFF)); 127 byteBuffer.put(9, (byte)((patch >>> 8) & 0xFF)); 128 byteBuffer.put(10, (byte)((patch >>> 16) & 0xFF)); 129 byteBuffer.put(11, (byte)((patch >>> 24) & 0xFF)); 130 } 131 } 132 133 /** 134 * Allows us to create a fragment message from any message type. 135 */ 136 public FragmentMessage createFragmentMessage() { 137 138 // check for message type validity 139 140 switch (this.message_type) { 141 case GIOPCancelRequest : 142 case GIOPCloseConnection : 143 case GIOPMessageError : 144 throw wrapper.fragmentationDisallowed( 145 CompletionStatus.COMPLETED_MAYBE); 146 case GIOPLocateRequest : 147 case GIOPLocateReply : 148 if (this.GIOP_version.equals(GIOPVersion.V1_1)) { 149 throw wrapper.fragmentationDisallowed( 150 CompletionStatus.COMPLETED_MAYBE); 151 } 152 break; 153 } 154 155 /* 156 // A fragmented mesg can be created only if the current mesg' fragment 157 // bit is set. Otherwise, raise error 158 // too stringent check 159 if ( (this.flags & MORE_FRAGMENTS_BIT) != MORE_FRAGMENTS_BIT ) { 160 throw wrapper.fragmentationDisallowed( CompletionStatus.COMPLETED_MAYBE); 161 } 162 */ 163 if (this.GIOP_version.equals(GIOPVersion.V1_1)) { 164 return new FragmentMessage_1_1(this); 165 } else if (this.GIOP_version.equals(GIOPVersion.V1_2)) { 166 return new FragmentMessage_1_2(this); 167 } 168 169 throw wrapper.giopVersionError( CompletionStatus.COMPLETED_MAYBE); 170 } 171 172 // IO methods 173 174 // This should do nothing even if it is called. The Message Header is read 175 // off a java.io.InputStream (not a CDRInputStream) by IIOPConnection 176 // in order to choose the correct CDR Version , msg_type, and msg_size. 177 // So, we would never need to read the Message Header off a CDRInputStream. 178 public void read(org.omg.CORBA.portable.InputStream istream) { 179 /* 180 this.magic = istream.read_long(); 181 this.GIOP_version = (new GIOPVersion()).read(istream); 182 this.flags = istream.read_octet(); 183 this.message_type = istream.read_octet(); 184 this.message_size = istream.read_ulong(); 185 */ 186 } 187 188 public void write(org.omg.CORBA.portable.OutputStream ostream) { 189 ostream.write_long(this.magic); 190 nullCheck(this.GIOP_version); 191 this.GIOP_version.write(ostream); 192 ostream.write_octet(this.flags); 193 ostream.write_octet(this.message_type); 194 ostream.write_ulong(this.message_size); 195 } 196} // class Message_1_1 197