// 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_

    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;

#ifndef GIOP_1_1
    // GIOP 1.0
    enum MsgType_1_0{                       // rename from MsgType
        Request,            Reply,          CancelRequest,
        LocateRequest,      LocateReply,
        CloseConnection,    MessageError
        };
#else
    // GIOP 1.1
    enum MsgType_1_1{
        Request,            Reply,          CancelRequest,
        LocateRequest,      LocateReply,
        CloseConnection,    MessageError,                  
        Fragment            // GIOP 1.1 addition
    };
#endif // GIOP_1_1
    typedef MsgType_1_1 MsgType_1_2;
    typedef MsgType_1_1 MsgType_1_3;

    
    // GIOP 1.0 
//PolyORB:IL:    struct MessageHeader_1_0 {// Renamed from MessageHeader
//PolyORB:IL:        char                        magic [4];
//PolyORB:IL:        Version                     GIOP_version;
//PolyORB:IL:        boolean                     byte_order;         
//PolyORB:IL:        octet                       message_type;
//PolyORB:IL:        unsigned long               message_size;
//PolyORB:IL:    };
//PolyORB:IL:
//PolyORB:IL:    // GIOP 1.1
//PolyORB:IL:    struct MessageHeader_1_1 {
//PolyORB:IL:        char                        magic [4];
//PolyORB:IL:        Version                     GIOP_version;
//PolyORB:IL:        octet                       flags;      // GIOP 1.1 change
//PolyORB:IL:        octet                       message_type;
//PolyORB:IL:        unsigned long               message_size;
//PolyORB:IL:    };
//PolyORB:IL:
//PolyORB:IL:    // GIOP 1.2
//PolyORB:IL:    typedef MessageHeader_1_1 MessageHeader_1_2;
//PolyORB:IL:
//PolyORB:IL:    // GIOP 1.3
//PolyORB:IL:    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;
        sequence <octet>            object_key;
        string                      operation;
        Principal                   requesting_principal;
    };

    // GIOP 1.1
//PolyORB:IL:    struct RequestHeader_1_1 {
//PolyORB:IL:        IOP::ServiceContextList     service_context;
//PolyORB:IL:        unsigned long               request_id;
//PolyORB:IL:        boolean                     response_expected;
//PolyORB:IL:        octet                       reserved[3]; // Added in GIOP 1.1
//PolyORB:IL:        sequence <octet>            object_key;
//PolyORB:IL:        string                      operation;
//PolyORB:IL:        Principal                   requesting_principal;
//PolyORB:IL:    };

    // 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:               sequence <octet>    object_key;
        case ProfileAddr:           IOP::TaggedProfile  profile;
        case ReferenceAddr:         IORAddressingInfo   ior;
    };
    struct RequestHeader_1_2 {
        unsigned long               request_id;
        octet                       response_flags;             
        octet                       reserved[3];
        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;

#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
#else
    // 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
    };                  

    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 // GIOP_1_2

    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;
        sequence <octet>            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;

#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 // GIOP_1_2

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

    // GIOP 1.3
    typedef FragmentHeader_1_2 FragmentHeader_1_3;

};
#endif // _GIOP_IDL_
