#include <TimeBase.idl>
#include <IOP.idl>

#pragma prefix "omg.org"
module Messaging {
	//
	// Messaging Quality of Service
	//
	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 TimeBase::TimeT Timeout;
	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;
	//
	// Locally-Constrained Policy Objects
	//
	// Rebind Policy (default = TRANSPARENT)
	const CORBA::PolicyType REBIND_POLICY_TYPE = 23;
	interface RebindPolicy : CORBA::Policy {
		readonly attribute RebindMode rebind_mode;
	};
	// Synchronization Policy (default = SYNC_WITH_TRANSPORT)
	const CORBA::PolicyType SYNC_SCOPE_POLICY_TYPE = 24;
	interface SyncScopePolicy : CORBA::Policy {
		readonly attribute SyncScope synchronization;
	};
	// Priority Policies



	const CORBA::PolicyType REQUEST_PRIORITY_POLICY_TYPE = 25;
	struct PriorityRange {
		Priority min;
		Priority max;
	};
	interface RequestPriorityPolicy : CORBA::Policy {
		readonly attribute PriorityRange priority_range;
	};
	const CORBA::PolicyType REPLY_PRIORITY_POLICY_TYPE = 26;
	interface ReplyPriorityPolicy : CORBA::Policy {
		readonly attribute PriorityRange priority_range;
	};
	// Timeout Policies
	const CORBA::PolicyType REQUEST_START_TIME_POLICY_TYPE = 27;
	interface RequestStartTimePolicy : CORBA::Policy {
		readonly attribute TimeBase::UtcT start_time;
	};
	const CORBA::PolicyType REQUEST_END_TIME_POLICY_TYPE = 28;
	interface RequestEndTimePolicy : CORBA::Policy {
		readonly attribute TimeBase::UtcT end_time;
	};
	const CORBA::PolicyType REPLY_START_TIME_POLICY_TYPE = 29;
	interface ReplyStartTimePolicy : CORBA::Policy {
		readonly attribute TimeBase::UtcT start_time;
	};
	const CORBA::PolicyType REPLY_END_TIME_POLICY_TYPE = 30;
	interface ReplyEndTimePolicy : CORBA::Policy {
		readonly attribute TimeBase::UtcT end_time;
	};
	const CORBA::PolicyType RELATIVE_REQ_TIMEOUT_POLICY_TYPE =
		31;
	interface RelativeRequestTimeoutPolicy : CORBA::Policy {
		readonly attribute TimeBase::TimeT relative_expiry;
	};
	const CORBA::PolicyType RELATIVE_RT_TIMEOUT_POLICY_TYPE = 32;
	interface RelativeRoundtripTimeoutPolicy : CORBA::Policy {
		readonly attribute TimeBase::TimeT relative_expiry;
	};
	const CORBA::PolicyType ROUTING_POLICY_TYPE = 33;
	struct RoutingTypeRange {
		RoutingType min;
		RoutingType max;
	};
	interface RoutingPolicy : CORBA::Policy {
		readonly attribute RoutingTypeRange routing_range;
	};


	const CORBA::PolicyType MAX_HOPS_POLICY_TYPE = 34;
	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;
	interface QueueOrderPolicy : CORBA::Policy {
		readonly attribute Ordering allowed_orders;
	};
	//
	// Propagation of QoS Policies
	//
	struct PolicyValue {
		CORBA::PolicyType ptype;
		sequence<octet> pvalue;
	};
	typedef sequence<PolicyValue> PolicyValueSeq;
	const IOP::ComponentId TAG_POLICIES = 2;
	const IOP::ServiceId INVOCATION_POLICIES = 2;
	//
	// Exception Delivery in the Callback Model
	//
	/*
	value ExceptionHolder {
		boolean is_system_exception;
		boolean byte_order;
		sequence<octet> marshaled_exception;
	};
	*/
	//
	// Base interface for the Callback model
	//
	interface ReplyHandler { };
	//
	// Base value for the Polling model
	//
	/*
	value Poller supports CORBA::Pollable {
		readonly attribute Object operation_target;
		readonly attribute string operation_name;
		attribute ReplyHandler associated_handler;
		readonly attribute boolean is_from_poller;

		Object target;
		string op_name;
	};
	*/
};
