// **********************************************************************
//
// Copyright (c) 2002
// IONA Technologies, Inc.
// Waltham, MA, USA
//
// All Rights Reserved
//
// **********************************************************************

#ifndef MESSAGING_IDL
#define MESSAGING_IDL

#include <OB/Policy.idl>
#include <OB/IOP.idl>
#include <OB/TimeBase.idl>

#pragma prefix "omg.org"

module Messaging
{

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;

const CORBA::PolicyType REBIND_POLICY_TYPE = 23;
//
// Rebind Policy (default = TRANSPARENT)
//
local interface RebindPolicy : CORBA::Policy
{
    readonly attribute RebindMode rebind_mode;
};

const CORBA::PolicyType SYNC_SCOPE_POLICY_TYPE = 24;

//
// Synchronization Policy (default = SYNC_WITH_TRANSPORT)
//
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;
local 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;
};
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;
};

struct PolicyValue
{
    CORBA::PolicyType ptype;
    sequence<octet> pvalue;
};
typedef sequence<PolicyValue> PolicyValueSeq;

const IOP::ComponentId TAG_POLICIES      = 2;
const IOP::ServiceId INVOCATION_POLICIES = 7;

}; // End module Messaging

#endif
