// File: Messaging.idl
// Messaging submission.

#ifndef _Messaging_IDL_
#define _Messaging_IDL_

#include <TimeBase.idl>
#include <orb.idl>

#pragma prefix "omg.org"

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

    // Synchronization Policy (default = SYNC_WITH_TRANSPORT)
    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;
    /* 
    // NOT IMPLEMENTED YET
    struct PriorityRange 
    {
        Priority min;
        Priority max;
    };
 
    local interface RequestPriorityPolicy : 
        CORBA::Policy 
    {
        readonly attribute PriorityRange priority_range;
    };
    */

    const CORBA::PolicyType REPLY_PRIORITY_POLICY_TYPE = 26;
    /*
    // NOT IMPLEMENTED YET
    interface ReplyPriorityPolicy : 
        CORBA::Policy 
    {
        readonly attribute PriorityRange priority_range;
    };
    */

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

    /*
    // NOT IMPLEMENTED YET
    local interface RoutingPolicy : 
        CORBA::Policy 
    {
        readonly attribute RoutingTypeRange routing_range;
    };
    */
    
    const CORBA::PolicyType MAX_HOPS_POLICY_TYPE = 34;
    /*
    // NOT IMPLEMENTED YET
    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;
    /*
    // NOT IMPLEMENTED YET
    local interface QueueOrderPolicy : 
        CORBA::Policy 
    {
        readonly attribute Ordering allowed_orders;
    };
    */
};

#endif // _Messaging_IDL_
