/* This file contains OMG IDL from  CORBA V2.3.1
 *  $Id: GIOP.idl,v 1.1.1.1 2001/03/17 18:08:12 brose Exp $	
 */ 


#ifndef __GIOP_IDL
#define __GIOP_IDL

#include <IOP.idl>
#include <orb.idl>

#pragma prefix "omg.org"


module GIOP {
  // IDL extended for version 1.1

  struct Version {						 	
    octet		major;
    octet		minor;
  };

#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.0
  struct MessageHeader_1_0 {// Renamed from MessageHeader
    char magic [4];
    Version GIOP_version;
    boolean byte_order;
    octet message_type;
    unsigned long message_size;
  };

  // GIOP 1.1
  struct MessageHeader_1_1 {
    char magic [4];
    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.0
  struct RequestHeader_1_0 {
    IOP::ServiceContextList service_context;
    unsigned long request_id;
    boolean response_expected;
    sequence <octet> object_key;
    string operation;
    CORBA::Principal requesting_principal;
  };

  // GIOP 1.1
  struct RequestHeader_1_1 {
    IOP::ServiceContextList service_context;
    unsigned long request_id;
    boolean response_expected;
    octet reserved[3]; // Added in GIOP 1.1
    sequence <octet> object_key;
    string operation;
    CORBA::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: 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
  };


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

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

#endif // GIOP_1_2

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

};

#endif
