/*
 * @(#)Message_1_0.java	1.7 01/12/03
 *
 * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.sun.corba.se.internal.iiop.messages;

import org.omg.CORBA.INTERNAL;
import org.omg.CORBA.CompletionStatus;
import com.sun.corba.se.internal.core.GIOPVersion;
import com.sun.corba.se.internal.orbutil.MinorCodes;

/*
 * This implements the GIOP 1.0 Message header.
 *
 * @author Ram Jeyaraman 05/14/2000
 * @version 1.0
 */

public class Message_1_0
        extends com.sun.corba.se.internal.iiop.messages.MessageBase {

    // Instance variables

    int magic = (int) 0;
    GIOPVersion GIOP_version = null;
    boolean byte_order = false;
    byte message_type = (byte) 0;
    int message_size = (int) 0;

    // Constructor

    Message_1_0() {}
    
    Message_1_0(int _magic, boolean _byte_order, byte _message_type,
            int _message_size) {
        magic = _magic;
        GIOP_version = GIOPVersion.V1_0;
        byte_order = _byte_order;
        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.byte_order;
    }

    public boolean moreFragmentsToFollow() {
    	return false;
    }

    // Mutator methods

    public void	setSize(byte[] buf, int size) {
	    this.message_size = size;

	    //
    	// Patch the size field in the header.
    	//
	    int patch = size - GIOPMessageHeaderLength;
        if (!isLittleEndian()) {
            buf[8]  = (byte)((patch >>> 24) & 0xFF);
            buf[9]  = (byte)((patch >>> 16) & 0xFF);
            buf[10] = (byte)((patch >>> 8)  & 0xFF);
            buf[11] = (byte)((patch >>> 0)  & 0xFF);
        } else {
            buf[8]  = (byte)((patch >>> 0)  & 0xFF);
            buf[9]  = (byte)((patch >>> 8)  & 0xFF);
            buf[10] = (byte)((patch >>> 16) & 0xFF);
            buf[11] = (byte)((patch >>> 24) & 0xFF);
        }
    }

    public FragmentMessage createFragmentMessage() {
        throw new INTERNAL(MinorCodes.FRAGMENTATION_DISALLOWED,
                            CompletionStatus.COMPLETED_MAYBE);
    }
        
    // IO methods

    // This should do nothing even if it is called. The Message Header already
    // is read off 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.byte_order = istream.read_boolean();
        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_boolean(this.byte_order);
        ostream.write_octet(this.message_type);
        ostream.write_ulong(this.message_size);
    }

} // class Message_1_0
