// File: Messaging.idl
// CORBA 3.0, Chapter 22

#ifndef _MESSAGING_IDL_
#define _MESSAGING_IDL_

#ifdef _PRE_3_0_COMPILER_
#pragma prefix "omg.org"
#include <orb.idl>
#include <Dynamic.idl>
#include <IOP.idl>
#include <TimeBase.idl>
#else
import ::CORBA;
import ::Dynamic;
import ::IOP;
import ::TimeBase;
#endif // _PRE_3_0_COMPILER_

// App developers should never have to use this IDL file. The ORB vendor
// should supply an implementation language version of this file, and
// that should be used by app developers if necessary.

// Most IDL compilers don't accept the "native" keyword in application IDL
//    files. In order to compile an IDL (really PIDL) file that has it, the
//    following trick can be used: change what the compiler sees. Instead
//    of letting the compiler see the keyword "native", use a preprocessor
//    definition that results in valid IDL, even if it doesn't yield
//    useful stubs and skeletons. Of course, PIDL never results in
//    the standard stubs so that's not a problem.
//
// Set the variable _MASK_NATIVE_ in the IDL compiler to enable it to
// parse this file.

#ifdef _MASK_NATIVE_
#define native typedef long
#endif // _MASK_NATIVE_

module Messaging {

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

   typedef short RebindMode;
   const RebindMode TRANSPARENT = 0;
   const RebindMode NO_REBIND = 1;
   const RebindMode NO_RECONNECT = 2;

   typedef short SyncScope;
   const SyncScope SYNC_NONE = 0;
   const SyncScope SYNC_WITH_TRANSPORT = 1;
   const SyncScope SYNC_WITH_SERVER = 2;
   const SyncScope SYNC_WITH_TARGET = 3;

   typedef short RoutingType;
   const RoutingType ROUTE_NONE = 0;
   const RoutingType ROUTE_FORWARD = 1;
   const RoutingType ROUTE_STORE_AND_FORWARD =2;

   typedef short Priority;

   typedef unsigned short Ordering;
   const Ordering ORDER_ANY = 0x01;
   const Ordering ORDER_TEMPORAL = 0x02;
   const Ordering ORDER_PRIORITY = 0x04;
   const Ordering ORDER_DEADLINE = 0x08;

   // Rebind Policy (default = TRANSPARENT)
   const CORBA::PolicyType REBIND_POLICY_TYPE = 23;

   local interface RebindPolicy : CORBA::Policy {
      readonly attribute RebindMode rebind_mode;
   };

   // Synchronization Policy (default = SYNC_WITH_TRANSPORT)
   const CORBA::PolicyType SYNC_SCOPE_POLICY_TYPE = 24;

   local interface SyncScopePolicy : CORBA::Policy {
      readonly attribute SyncScope synchronization;
   };

   // Priority Policies
   const CORBA::PolicyType REQUEST_PRIORITY_POLICY_TYPE = 25;

   struct PriorityRange {
      Priority min;
      Priority max;
   };

   local interface RequestPriorityPolicy : CORBA::Policy {
      readonly attribute PriorityRange priority_range;
   };

   const CORBA::PolicyType REPLY_PRIORITY_POLICY_TYPE = 26;

#ifdef JACORB
   local interface  ReplyPriorityPolicy : CORBA::Policy {
      readonly attribute PriorityRange priority_range;
   };
#else
   interface ReplyPriorityPolicy : CORBA::Policy {
      readonly attribute PriorityRange priority_range;
   };
#endif


   // Timeout Policies
   const CORBA::PolicyType REQUEST_START_TIME_POLICY_TYPE = 27;

   local interface RequestStartTimePolicy : CORBA::Policy {
      readonly attribute TimeBase::UtcT start_time;
   };

   const CORBA::PolicyType REQUEST_END_TIME_POLICY_TYPE = 28;

   local interface RequestEndTimePolicy : CORBA::Policy {
      readonly attribute TimeBase::UtcT end_time;
   };

   const CORBA::PolicyType REPLY_START_TIME_POLICY_TYPE = 29;

   local interface ReplyStartTimePolicy : CORBA::Policy {
      readonly attribute TimeBase::UtcT start_time;
   };

   const CORBA::PolicyType REPLY_END_TIME_POLICY_TYPE = 30;

   local interface ReplyEndTimePolicy : CORBA::Policy {
      readonly attribute TimeBase::UtcT end_time;
   };

   const CORBA::PolicyType RELATIVE_REQ_TIMEOUT_POLICY_TYPE = 31;

   local interface RelativeRequestTimeoutPolicy : CORBA::Policy {
      readonly attribute TimeBase::TimeT relative_expiry;
   };

   const CORBA::PolicyType RELATIVE_RT_TIMEOUT_POLICY_TYPE = 32;

   local interface RelativeRoundtripTimeoutPolicy : CORBA::Policy {
      readonly attribute TimeBase::TimeT relative_expiry;
   };

   const CORBA::PolicyType ROUTING_POLICY_TYPE = 33;

   struct RoutingTypeRange {
      RoutingType min;
      RoutingType max;
   };

   local interface RoutingPolicy : CORBA::Policy {
      readonly attribute RoutingTypeRange routing_range;
   };

   const CORBA::PolicyType MAX_HOPS_POLICY_TYPE = 34;

   local interface MaxHopsPolicy : CORBA::Policy {
      readonly attribute unsigned short max_hops;
   };

   // Router Delivery-ordering Policy (default = ORDER_TEMPORAL)
   const CORBA::PolicyType QUEUE_ORDER_POLICY_TYPE = 35;

   local interface QueueOrderPolicy : CORBA::Policy {
      readonly attribute Ordering allowed_orders;
   };

   // Profile components through which policy values are expressed in IORs

    typedef CORBA::OctetSeq PolicyData;
   struct PolicyValue {
      CORBA::PolicyType ptype;
        PolicyData pvalue;
   };

   typedef sequence<PolicyValue> PolicyValueSeq;

#ifdef JACORB
   valuetype ExceptionHolder {
      void raise_exception() raises (CORBA::UserException);
      void raise_exception_with_list(
         in Dynamic::ExceptionList exc_list)
         raises (CORBA::UserException);
      private boolean is_system_exception;
      private boolean byte_order;
      private sequence<octet> marshaled_exception;
   };
#else
   native UserExceptionBase;
   valuetype ExceptionHolder {
      void raise_exception() raises (UserExceptionBase);
      void raise_exception_with_list(
         in Dynamic::ExceptionList exc_list)
         raises (UserExceptionBase);
      private boolean is_system_exception;
      private boolean byte_order;
      private MarshaledException marshaled_exception;
   };
#endif

   // For handling Routing
   interface ReplyHandler { };

   // Generic Poller Valuetype

    abstract valuetype Poller : CORBA::Pollable {
#ifndef _PRE_3_0_COMPILER_
      typeid ::Messaging::Poller "IDL:omg.org/Messaging/Poller:3.1";
#else
#pragma version Messaging::Poller 3.1
#endif _PRE_3_0_COMPILER_
      readonly attribute Object operation_target;
      readonly attribute string operation_name;
      attribute ReplyHandler associated_handler;
      readonly attribute boolean is_from_poller;
   };

}; // module Messaging
#endif // _MESSAGING_IDL_
