// File: GIOP.idl
// From CORBA 3.0: Chapter 15, General Inter-ORB Protocol

// To compiler this for

#ifndef _GIOP_IDL_
#define _GIOP_IDL_

#ifdef _PRE_3_0_COMPILER_
#include <IOP.idl>

#pragma prefix "omg.org"
#else
import ::IOP;
#endif // _PRE_3_0_COMPILER_

module GIOP {                   // IDL extended for version 1.1 and 1.2

#ifndef _PRE_3_0_COMPILER_
    typeprefix GIOP "omg.org";
#endif // _PRE_3_0_COMPILER_

#ifndef MAX_GIOP_MINOR_VERSION
#define MAX_GIOP_MINOR_VERSION 4
#endif


    struct Version {
        octet           major;
        octet           minor;
    };

    // Note: Principal is not used in V1.2 and beyond. However, it must
    //       be available for V1.0 and V1.1
    typedef sequence<octet> Principal;

// JacORB's lexer does not not support #if x == y
// #if MAX_GIOP_MINOR_VERSION == 0
#ifndef GIOP_1_1


    // GIOP 1.0
    enum MsgType_1_0{                       // rename from MsgType
        Request,            Reply,          CancelRequest,
        LocateRequest,      LocateReply,
        CloseConnection,    MessageError
    };
    typedef MsgType_1_0 MsgType;

#else
    // GIOP 1.1
    enum MsgType_1_1{
        Request,            Reply,          CancelRequest,
        LocateRequest,      LocateReply,
        CloseConnection,    MessageError,
        Fragment            // GIOP 1.1 addition
    };

    typedef MsgType_1_1 MsgType_1_2;
    typedef MsgType_1_1 MsgType_1_3;
    typedef MsgType_1_1 MsgType;
#endif

    // GIOP 1.0
    typedef char Magicn[4];
    struct MessageHeader_1_0 {// Renamed from MessageHeader
        Magicn                      magic;
        Version                     GIOP_version;
        boolean                     byte_order;
        octet                       message_type;
        unsigned long               message_size;
    };

    // GIOP 1.1
    struct MessageHeader_1_1 {
        Magicn                        magic;
        Version                     GIOP_version;
        octet                       flags;      // GIOP 1.1 change
        octet                       message_type;
        unsigned long               message_size;
    };

    // GIOP 1.2
    typedef MessageHeader_1_1 MessageHeader_1_2;

    // GIOP 1.3
    typedef MessageHeader_1_1 MessageHeader_1_3;

    // GIOP 1.0
    struct RequestHeader_1_0 {
        IOP::ServiceContextList     service_context;
        unsigned long               request_id;
        boolean                     response_expected;
        IOP::ObjectKey              object_key;
        string                      operation;
        Principal                   requesting_principal;
    };

    // GIOP 1.1
    typedef octet RequestReserved[3];
    struct RequestHeader_1_1 {
        IOP::ServiceContextList     service_context;
        unsigned long               request_id;
        boolean                     response_expected;
        RequestReserved             reserved; // Added in GIOP 1.1
        IOP::ObjectKey              object_key;
        string                      operation;
        Principal                   requesting_principal;
    };

    // GIOP 1.2
    typedef short                   AddressingDisposition;
    const short                     KeyAddr         = 0;
    const short                     ProfileAddr     = 1;
    const short                     ReferenceAddr   = 2;
    struct IORAddressingInfo {
        unsigned long               selected_profile_index;
        IOP::IOR                    ior;
    };
    union TargetAddress switch (AddressingDisposition) {
        case KeyAddr:               IOP::ObjectKey      object_key;
        case ProfileAddr:           IOP::TaggedProfile  profile;
        case ReferenceAddr:         IORAddressingInfo   ior;
    };
    struct RequestHeader_1_2 {
        unsigned long               request_id;
        octet                       response_flags;
        RequestReserved             reserved;
        TargetAddress               target;
        string                      operation;
        // Principal not in GIOP 1.2
        IOP::ServiceContextList     service_context;    // 1.2 change
    };

    // GIOP 1.3
    typedef RequestHeader_1_2 RequestHeader_1_3;

// JacORB's lexer does not not support #if x == y
// #if MAX_GIOP_MINOR_VERSION < 2
#ifndef GIOP_1_2

    // GIOP 1.0 and 1.1
    enum ReplyStatusType_1_0 {// Renamed from ReplyStatusType
        NO_EXCEPTION,
        USER_EXCEPTION,
        SYSTEM_EXCEPTION,
        LOCATION_FORWARD
    };

    // GIOP 1.0
    struct ReplyHeader_1_0 {// Renamed from ReplyHeader
        IOP::ServiceContextList     service_context;
        unsigned long               request_id;
        ReplyStatusType_1_0         reply_status;
    };

    // GIOP 1.1
    typedef ReplyHeader_1_0 ReplyHeader_1_1;
    // Same Header contents for 1.0 and 1.1
    typedef ReplyStatusType_1_0 ReplyStatusType;
#else

// JacORB's lexer does not not support #if x == y
// #if MAX_GIOP_MINOR_VERSION >= 2

    // GIOP 1.2
    enum ReplyStatusType_1_2 {
        NO_EXCEPTION,
        USER_EXCEPTION,
        SYSTEM_EXCEPTION,
        LOCATION_FORWARD,
        LOCATION_FORWARD_PERM,              // new value for 1.2
        NEEDS_ADDRESSING_MODE               // new value for 1.2
    };
    typedef ReplyStatusType_1_2 ReplyStatusType;

    struct ReplyHeader_1_2 {
        unsigned long               request_id;
        ReplyStatusType_1_2         reply_status;
        IOP::ServiceContextList     service_context;    // 1.2 change
    };

    // GIOP 1.3
    typedef ReplyHeader_1_2 ReplyHeader_1_3;
#endif
    struct SystemExceptionReplyBody {
        string                      exception_id;
        unsigned long               minor_code_value;
        unsigned long               completion_status;
    };

    struct CancelRequestHeader {
        unsigned long               request_id;
    };

    // GIOP 1.0
    struct LocateRequestHeader_1_0 {// Renamed LocationRequestHeader
        unsigned long               request_id;
        IOP::ObjectKey              object_key;
    };

    // GIOP 1.1
    typedef LocateRequestHeader_1_0 LocateRequestHeader_1_1;
    // Same Header contents for 1.0 and 1.1

    // GIOP 1.2
    struct LocateRequestHeader_1_2 {
        unsigned long           request_id;
        TargetAddress           target;
    };

    // GIOP 1.3
    typedef LocateRequestHeader_1_2 LocateRequestHeader_1_3;

// JacORB's lexer does not not support #if x == y
// #if MAX_GIOP_MINOR_VERSION < 2
#ifndef GIOP_1_2
    // GIOP 1.0 and 1.1
    enum LocateStatusType_1_0 {// Renamed from LocateStatusType
            UNKNOWN_OBJECT,
            OBJECT_HERE,
            OBJECT_FORWARD
    };

    // GIOP 1.0
        struct LocateReplyHeader_1_0 {// Renamed from LocateReplyHeader
            unsigned long           request_id;
            LocateStatusType_1_0    locate_status;
    };

    // GIOP 1.1
    typedef LocateReplyHeader_1_0 LocateReplyHeader_1_1;
    // same Header contents for 1.0 and 1.1

#else
    // GIOP 1.2
    enum LocateStatusType_1_2 {
            UNKNOWN_OBJECT,
            OBJECT_HERE,
            OBJECT_FORWARD,
            OBJECT_FORWARD_PERM,        // new value for GIOP 1.2
            LOC_SYSTEM_EXCEPTION,       // new value for GIOP 1.2
            LOC_NEEDS_ADDRESSING_MODE   // new value for GIOP 1.2
    };
    struct LocateReplyHeader_1_2 {
        unsigned long               request_id;
        LocateStatusType_1_2        locate_status;
    };

    // GIOP 1.3
    typedef LocateReplyHeader_1_2 LocateReplyHeader_1_3;

#endif // MAX_GIOP_VERSION_NUMBER

    // GIOP 1.2
    struct FragmentHeader_1_2 {
        unsigned long               request_id;
    };

    // GIOP 1.3
    typedef FragmentHeader_1_2 FragmentHeader_1_3;

};
#endif // _GIOP_IDL_
