//
// File: FT.idl
// CORBA 3.0 Chapter 23

#ifndef _FT_IDL_
#define _FT_IDL_

#ifdef _PRE_3_0_COMPILER_
#pragma prefix "omg.org"
#include <TimeBase.idl>
#include <CosNaming.idl>
#include <CosEventComm.idl>
#include <CosNotification.idl>
#include <IOP.idl>
#include <GIOP.idl>
#include <orb.idl>
#else
import ::TimeBase;
import ::CosNaming;
import ::CosEventComm;
import ::CosNotification;
import ::CosNotifyComm;
import ::IOP;
//PolyORB:IL:import ::GIOP;
import ::CORBA;
#endif // _PRE_3_0_COMPILER_

module FT {
#ifndef _PRE_3_0_COMPILER_
    typeprefix FT "omg.org";
#endif // _PRE_3_0_COMPILER_

    // Specification for Interoperable Object Group References
    typedef string FTDomainId;
    typedef unsigned long long ObjectGroupId;
    typedef unsigned long ObjectGroupRefVersion;

//PolyORB:IL:    struct TagFTGroupTaggedComponent { // tag = TAG_FT_GROUP;
//PolyORB:IL:	GIOP::Version		     version;
//PolyORB:IL:	FTDomainId		     ft_domain_id;
//PolyORB:IL:	ObjectGroupId		     object_group_id;
//PolyORB:IL:	ObjectGroupRefVersion	     object_group_ref_version;
//PolyORB:IL:    };

    struct TagFTPrimaryTaggedComponent { // tag = TAG_FT_PRIMARY;
	boolean			      primary;
    };

    // Specification for Most Recent Object Group Reference
    struct FTGroupVersionServiceContext { //context_id = FT_GROUP_VERSION;
	ObjectGroupRefVersion		object_group_ref_version;
    };

    // Specification for Transparent Reinvocation
    const CORBA::PolicyType REQUEST_DURATION_POLICY = 47;
					
    struct FTRequestServiceContext { // context_id = FT_REQUEST;
	string				client_id;
	long				retention_id;
	TimeBase::TimeT			expiration_time;
    };

//PolyORB:NI:    interface RequestDurationPolicy : CORBA::Policy {
//PolyORB:NI:	readonly attribute TimeBase::TimeT request_duration_value;
//PolyORB:NI:    };

    // Specification for Transport Heartbeats
    const CORBA::PolicyType HEARTBEAT_POLICY = 48;
    const CORBA::PolicyType HEARTBEAT_ENABLED_POLICY =  49;

    struct TagFTHeartbeatEnabledTaggedComponent { 
					// tag = TAG_FT_HEARTBEAT_ENABLED;
	boolean				heartbeat_enabled;
    };

    struct HeartbeatPolicyValue {
	boolean				heartbeat;
	TimeBase::TimeT			heartbeat_interval;
	TimeBase::TimeT			heartbeat_timeout;
    };

//PolyORB:NI:    interface HeartbeatPolicy : CORBA::Policy {
//PolyORB:NI:	readonly attribute HeartbeatPolicyValue heartbeat_policy_value;
//PolyORB:NI:    };

//PolyORB:NI:    interface HeartbeatEnabledPolicy : CORBA::Policy {
//PolyORB:NI:	readonly attribute boolean heartbeat_enabled_policy_value;
//PolyORB:NI:    };

    // Specification of Common Types and Exceptions for ReplicationManager
    interface GenericFactory;
    interface FaultNotifier;

    typedef CORBA::RepositoryId _TypeId;
    typedef Object ObjectGroup;

    typedef CosNaming::Name Name;
    typedef any Value;

    struct Property {
	Name	    nam;
	Value	    val;
    };

    typedef sequence<Property> Properties;

    typedef Name Location;
    typedef sequence<Location> Locations;
    typedef Properties Criteria;

    struct FactoryInfo {
	GenericFactory	the_factory;
	Location	the_location;
	Criteria	the_criteria;
    };

    typedef sequence<FactoryInfo>  FactoryInfos;

    typedef unsigned short ReplicationStyleValue;
    const ReplicationStyleValue		STATELESS	= 0;
    const ReplicationStyleValue		COLD_PASSIVE	= 1;
    const ReplicationStyleValue		WARM_PASSIVE	= 2;
    const ReplicationStyleValue		ACTIVE		= 3;
    const ReplicationStyleValue		ACTIVE_WITH_VOTING = 4;

    typedef unsigned short MembershipStyleValue;
    const MembershipStyleValue		MEMB_APP_CTRL	= 0;
    const MembershipStyleValue		MEMB_INF_CTRL	= 1;

    typedef unsigned short ConsistencyStyleValue; 
    const ConsistencyStyleValue		CONS_APP_CTRL	= 0;
    const ConsistencyStyleValue		CONS_INF_CTRL	= 1;

    typedef unsigned short FaultMonitoringStyleValue;
    const FaultMonitoringStyleValue	PULL		= 0;
    const FaultMonitoringStyleValue	PUSH		= 1;
    const FaultMonitoringStyleValue	NOT_MONITORED	= 2;

    typedef unsigned short FaultMonitoringGranularityValue;
    const FaultMonitoringGranularityValue MEMB		= 0;
    const FaultMonitoringGranularityValue LOC		= 1;
    const FaultMonitoringGranularityValue LOC_AND_TYPE	= 2;

    typedef FactoryInfos FactoriesValue;

    typedef unsigned short InitialNumberReplicasValue;
    typedef unsigned short MinimumNumberReplicasValue;

    struct FaultMonitoringIntervalAndTimeoutValue {
	TimeBase::TimeT   monitoring_interval;
	TimeBase::TimeT   timeout;
    };

    typedef TimeBase::TimeT CheckpointIntervalValue;
					
    exception InterfaceNotFound {};
    exception ObjectGroupNotFound {};
    exception MemberNotFound {};
    exception ObjectNotFound {};
    exception MemberAlreadyPresent {};
    exception BadReplicationStyle {};
    exception ObjectNotCreated {};
    exception ObjectNotAdded {};
    exception PrimaryNotSet {};
    exception UnsupportedProperty {
	Name  nam;
	Value val;
    };
    exception InvalidProperty {
	Name  nam;
	Value val;
    };
    exception NoFactory {
	Location	the_location;
	_TypeId		type_id;
    };
    exception InvalidCriteria {
	Criteria invalid_criteria;
    };
    exception CannotMeetCriteria {
	Criteria unmet_criteria;
    };

    // Specification of PropertyManager Interface 
    // which ReplicationManager Inherits
    interface PropertyManager {
	void set_default_properties(in Properties props)
	     raises (InvalidProperty,
		    UnsupportedProperty);

	Properties get_default_properties();

	void remove_default_properties(in Properties props)
	     raises (InvalidProperty,
		    UnsupportedProperty);

	void set_type_properties(
	     in _TypeId type_id,
	     in Properties overrides)
	     raises (InvalidProperty,
		    UnsupportedProperty);

	Properties get_type_properties(in _TypeId type_id);

	void remove_type_properties(
	     in _TypeId type_id,
	     in Properties props)
	     raises (InvalidProperty,
		    UnsupportedProperty);

	void set_properties_dynamically(
	     in ObjectGroup object_group,
	     in Properties overrides)
	     raises(ObjectGroupNotFound,
		   InvalidProperty,
		   UnsupportedProperty);

	Properties get_properties(in ObjectGroup object_group)
	     raises(ObjectGroupNotFound);
    };


    // Specification of ObjectGroupManager Interface
    // which ReplicationManager Inherits
    interface ObjectGroupManager {
	ObjectGroup create_member(
	    in ObjectGroup object_group,
	    in Location the_location,
	    in _TypeId type_id, 
	    in Criteria the_criteria)
	raises(ObjectGroupNotFound,
		MemberAlreadyPresent,
		NoFactory,
		ObjectNotCreated,
		InvalidCriteria,
		CannotMeetCriteria);
						
	ObjectGroup add_member(
	    in ObjectGroup object_group,
	    in Location the_location,
	    in Object member)
	    raises(ObjectGroupNotFound,
		   MemberAlreadyPresent,
		   ObjectNotAdded);

	ObjectGroup remove_member(
	    in ObjectGroup object_group,
	    in Location the_location)
	    raises(ObjectGroupNotFound,
		   MemberNotFound);
						
	ObjectGroup set_primary_member(
            in ObjectGroup object_group,
	    in Location the_location)
	    raises(ObjectGroupNotFound,
		   MemberNotFound,
		   PrimaryNotSet,
		   BadReplicationStyle);
						
	Locations locations_of_members(
	    in ObjectGroup object_group)
	    raises(ObjectGroupNotFound);
						
	ObjectGroupId get_object_group_id(
	    in ObjectGroup object_group)
	    raises(ObjectGroupNotFound);

	ObjectGroup get_object_group_ref(
	    in ObjectGroup object_group)
	    raises(ObjectGroupNotFound);

	Object get_member_ref(
	    in ObjectGroup object_group,
	    in Location loc)
	raises(ObjectGroupNotFound,
	       MemberNotFound);
    };

    // Specification of GenericFactory Interface
    // which ReplicationManager Inherits and Application Objects Implement
    interface GenericFactory {
        typedef any FactoryCreationId; 
	Object create_object(in _TypeId type_id, 
	    in Criteria the_criteria,
	    out FactoryCreationId factory_creation_id)
	    raises (NoFactory,
		ObjectNotCreated,
		InvalidCriteria,
		InvalidProperty,
		CannotMeetCriteria);

	void delete_object(
	     in FactoryCreationId factory_creation_id)
	     raises (ObjectNotFound);
	};

    // Specification of ReplicationManager Interface
    interface ReplicationManager : PropertyManager, 
				   ObjectGroupManager,
				   GenericFactory {
	void register_fault_notifier(
	    in FaultNotifier fault_notifier);

	FaultNotifier get_fault_notifier()
	    raises (InterfaceNotFound);
    };

    // Specifications for Fault Management 
    // Specification of PullMonitorable Interface
    // which Application Objects Inherit
    interface PullMonitorable {
	boolean is_alive(); 
    };

    // Specification of FaultNotifier Interface
    interface FaultNotifier {
	typedef unsigned long long ConsumerId;

	void push_structured_fault(
	    in CosNotification::StructuredEvent event);

	void push_sequence_fault(
	    in CosNotification::EventBatch events);

	ConsumerId connect_structured_fault_consumer(
	    in CosNotifyComm::StructuredPushConsumer push_consumer);

	ConsumerId connect_sequence_fault_consumer(
	    in CosNotifyComm::SequencePushConsumer push_consumer);
  
	void disconnect_consumer( 
	    in ConsumerId connection)
	    raises(CosEventComm::Disconnected);

        void replace_constraint(
            in ConsumerId connection,
            in CosNotification::EventTypeSeq event_types,
            in string constr_expr);
    };


    // Specifications for Logging and Recovery
    typedef sequence<octet> State;

    exception NoStateAvailable {};
    exception InvalidState {};
    exception NoUpdateAvailable {};
    exception InvalidUpdate {};

    // Specification of Checkpointable Interface
    // which Updateable and Application Objects Inherit
    interface Checkpointable {
	State  get_state()
	    raises(NoStateAvailable);

	void set_state(in State s)
	    raises(InvalidState);
    };

    // Specification of Updateable Interface
    // which Application Objects Inherit
    interface Updateable : Checkpointable {
	State  get_update() 
	    raises(NoUpdateAvailable);

	void set_update(in State s)
	     raises(InvalidUpdate);
    };
};
#endif          // for #ifndef _FT_IDL_
