1 /*
   2  * Copyright (c) 2000, 2003, 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 
  26 package com.sun.corba.se.impl.protocol.giopmsgheaders;
  27 
  28 import java.nio.ByteBuffer;
  29 import org.omg.CORBA.INTERNAL;
  30 import org.omg.CORBA.CompletionStatus;
  31 import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
  32 
  33 import com.sun.corba.se.spi.logging.CORBALogDomains ;
  34 import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
  35 
  36 /*
  37  * This implements the GIOP 1.0 Message header.
  38  *
  39  * @author Ram Jeyaraman 05/14/2000
  40  */
  41 
  42 public class Message_1_0
  43         extends com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase {
  44 
  45     private static ORBUtilSystemException wrapper =
  46         ORBUtilSystemException.get( CORBALogDomains.RPC_PROTOCOL ) ;
  47 
  48     // Instance variables
  49     int magic = (int) 0;
  50     GIOPVersion GIOP_version = null;
  51     boolean byte_order = false;
  52     byte message_type = (byte) 0;
  53     int message_size = (int) 0;
  54 
  55     // Constructor
  56 
  57     Message_1_0() {
  58     }
  59 
  60     Message_1_0(int _magic, boolean _byte_order, byte _message_type,
  61             int _message_size) {
  62         magic = _magic;
  63         GIOP_version = GIOPVersion.V1_0;
  64         byte_order = _byte_order;
  65         message_type = _message_type;
  66         message_size = _message_size;
  67     }
  68 
  69     // Accessor methods
  70 
  71     public GIOPVersion getGIOPVersion() {
  72         return this.GIOP_version;
  73     }
  74 
  75     public int getType() {
  76         return this.message_type;
  77     }
  78 
  79     public int getSize() {
  80             return this.message_size;
  81     }
  82 
  83     public boolean isLittleEndian() {
  84         return this.byte_order;
  85     }
  86 
  87     public boolean moreFragmentsToFollow() {
  88         return false;
  89     }
  90 
  91     // Mutator methods
  92 
  93     public void setSize(ByteBuffer byteBuffer, int size) {
  94             this.message_size = size;
  95 
  96         //
  97         // Patch the size field in the header.
  98         //
  99             int patch = size - GIOPMessageHeaderLength;
 100         if (!isLittleEndian()) {
 101             byteBuffer.put(8,  (byte)((patch >>> 24) & 0xFF));
 102             byteBuffer.put(9,  (byte)((patch >>> 16) & 0xFF));
 103             byteBuffer.put(10, (byte)((patch >>> 8)  & 0xFF));
 104             byteBuffer.put(11, (byte)((patch >>> 0)  & 0xFF));
 105         } else {
 106             byteBuffer.put(8,  (byte)((patch >>> 0)  & 0xFF));
 107             byteBuffer.put(9,  (byte)((patch >>> 8)  & 0xFF));
 108             byteBuffer.put(10, (byte)((patch >>> 16) & 0xFF));
 109             byteBuffer.put(11, (byte)((patch >>> 24) & 0xFF));
 110         }
 111     }
 112 
 113     public FragmentMessage createFragmentMessage() {
 114         throw wrapper.fragmentationDisallowed(
 115             CompletionStatus.COMPLETED_MAYBE);
 116     }
 117 
 118     // IO methods
 119 
 120     // This should do nothing even if it is called. The Message Header already
 121     // is read off java.io.InputStream (not a CDRInputStream) by IIOPConnection
 122     // in order to choose the correct CDR Version, msg_type, and msg_size.
 123     // So, we would never need to read the Message Header off a CDRInputStream.
 124     public void read(org.omg.CORBA.portable.InputStream istream) {
 125         /*
 126         this.magic = istream.read_long();
 127         this.GIOP_version = (new GIOPVersion()).read(istream);
 128         this.byte_order = istream.read_boolean();
 129         this.message_type = istream.read_octet();
 130         this.message_size = istream.read_ulong();
 131         */
 132     }
 133 
 134     public void write(org.omg.CORBA.portable.OutputStream ostream) {
 135         ostream.write_long(this.magic);
 136         nullCheck(this.GIOP_version);
 137         this.GIOP_version.write(ostream);
 138         ostream.write_boolean(this.byte_order);
 139         ostream.write_octet(this.message_type);
 140         ostream.write_ulong(this.message_size);
 141     }
 142 
 143 } // class Message_1_0