//$Id$
// FT.idl
#ifndef _FT_IDL_
#define _FT_IDL_

// The OMG file has been devided into several portions:
//  FT_CORBA.idl
//  FT_CORBA_ORB.idl
//  FT_Detector.idl
//  FT_Notifier.idl
//  FT_Replica.idl

// The next include is TAO specific.
#include "orbsvcs/FT_CORBA_ORB.idl"

#define FT_USES_PORTABLE_GROUP

#ifdef FT_USES_PORTABLE_GROUP
# include "orbsvcs/PortableGroup.idl"
#else // FT_USES_PORTABLE_GROUP
#include "orbsvcs/CosNaming.idl" // 98-10-19.idl
#endif // FT_USES_PORTABLE_GROUP

#include "orbsvcs/CosNotification.idl" // from telecom/98-11-03.idl
#include "orbsvcs/CosNotifyFilter.idl"

#pragma prefix "omg.org"

module FT
{
  /// Forward declarations
  interface FaultNotifier;

  typedef long 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;
  const ReplicationStyleValue SEMI_ACTIVE = 5;

  typedef long ConsistencyStyleValue;
  const ConsistencyStyleValue CONS_APP_CTRL = 0;
  const ConsistencyStyleValue CONS_INF_CTRL = 1;

  typedef long FaultMonitoringStyleValue;
  const FaultMonitoringStyleValue PULL = 0;
  const FaultMonitoringStyleValue PUSH = 1;
  const FaultMonitoringStyleValue NOT_MONITORED = 2;

  typedef long FaultMonitoringGranularityValue;
  const FaultMonitoringGranularityValue MEMB = 0;
  const FaultMonitoringGranularityValue LOC = 1;
  const FaultMonitoringGranularityValue LOC_AND_TYPE = 2;

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

  exception BadReplicationStyle {};
  exception PrimaryNotSet {};

#ifdef FT_USES_PORTABLE_GROUP
  /////////////////////////////////////////
  // The following typedefs "import"
  // definitions from the PortableGroup module
  // definitions into the FT module.
  // This is an interim step during the process
  // of having FT depend on the commmon
  // of PortableGroup module rather than defining
  // everything itself.

  // this typedef trick doesn't work for exceptions, so they must
  // use the PortableGroup:: prefix
  typedef PortableGroup::_TypeId _TypeId;
  typedef PortableGroup::ObjectGroup ObjectGroup;
  typedef PortableGroup::Name Name;
  typedef PortableGroup::Value Value;
  typedef PortableGroup::Property Property;
  typedef PortableGroup::Properties Properties;
  typedef PortableGroup::Location Location;
  typedef PortableGroup::Locations Locations;
  typedef PortableGroup::Criteria Criteria;

  typedef PortableGroup::FactoryInfo FactoryInfo;
  typedef PortableGroup::FactoryInfos FactoryInfos;
  typedef PortableGroup::MembershipStyleValue MembershipStyleValue;

  typedef PortableGroup::FactoriesValue FactoriesValue;
  typedef PortableGroup::InitialNumberMembersValue InitialNumberMembersValue;
  typedef PortableGroup::MinimumNumberMembersValue MinimumNumberMembersValue;
  typedef PortableGroup::PropertyManager PropertyManager;
  typedef PortableGroup::ObjectGroupManager ObjectGroupManager;
  typedef PortableGroup::GenericFactory GenericFactory;

  // Specification of FTObjectGroupManager Interface
  // which ReplicationManager Inherits
  interface FTObjectGroupManager : PortableGroup::ObjectGroupManager {

    ::PortableGroup::ObjectGroup set_primary_member(in ::PortableGroup::ObjectGroup object_group,
                                   in ::PortableGroup::Location the_location)
      raises(PortableGroup::ObjectGroupNotFound,
             PortableGroup::MemberNotFound,
             PrimaryNotSet,
             BadReplicationStyle);
  };


  ///////////////////////////////////////////////////
  // names for properties used in Fault Tolerant CORBA

  /// FT::ReplicationStyle
  const string FT_REPLICATION_STYLE = "org.omg.ft.ReplicationStyle";

  /// FT::ConsistencyStyle
  const string FT_CONSISTENCY_STYLE = "org.omg.ft.ConsistencyStyle";

  /// FT::MembershipStyle
  const string FT_MEMBERSHIP_STYLE = PortableGroup::PG_MEMBERSHIP_STYLE;
  const PortableGroup::MembershipStyleValue MEMB_APP_CTRL = PortableGroup::MEMB_APP_CTRL;
  const PortableGroup::MembershipStyleValue MEMB_INF_CTRL = PortableGroup::MEMB_INF_CTRL;

  /// FT::FaultMonitoringStyle
  const string FT_FAULT_MONITORING_STYLE = "org.omg.ft.FaultMonitoringStyle";

  /// FT::FaultMonitoringGranularity
  const string FT_FAULT_MONITORING_GRANULARITY = "org.omg.ft.FaultMonitoringGranularity";

  /// FT::InitialNumberMembers
  const string FT_INITIAL_NUMBER_MEMBERS = PortableGroup::PG_INITIAL_NUMBER_MEMBERS;

  /// FT::MinimumNumberMembers
  const string FT_MINIMUM_NUMBER_MEMBERS = PortableGroup::PG_MINIMUM_NUMBER_MEMBERS;

  /// Factories
  const string FT_FACTORIES = PortableGroup::PG_FACTORIES;

  /// FT::FaultMonitoringIntervalAndTimeou
  const string FT_FAULT_MONITORING_INTERVAL_AND_TIMEOUT = "org.omg.ft.FaultMonitoringIntervalAndTimeout";

  /// FT::CheckpointInterval
  const string FT_CHECKPOINT_INTERVAL = "org.omg.ft.CheckpointInterval";

  // end of property names from FT CORBA specification
  ///////////////////////////////////////////////////


#else // (not) FT_USES_PORTABLE_GROUP
  interface GenericFactory;

  /// Useful typedefs.
  typedef CORBA::RepositoryId _TypeId;
  typedef Object ObjectGroup;

  typedef CosNaming::Name Name;
  typedef any Value;

  /**
   * @struct Property
   *
   * @brief A property name and a value association.
   */
  struct Property {
    Name nam;
    Value val;
  };

  /// Some mor euseful typedefs.
  typedef sequence<Property> Properties;
  typedef Name Location;
  typedef sequence<Location> Locations;
  typedef Properties Criteria;


  /**
   * @struct FactoryInfo
   *
   * @brief <@todo>
   *
   */
  struct FactoryInfo {
    GenericFactory _factory;
    Location the_location;
    Criteria the_criteria;
  };

  typedef sequence<FactoryInfo> FactoryInfos;

  typedef long 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 long MembershipStyleValue;
  const MembershipStyleValue MEMB_APP_CTRL = 0;
  const MembershipStyleValue MEMB_INF_CTRL = 1;
  typedef long ConsistencyStyleValue;
  const ConsistencyStyleValue CONS_APP_CTRL = 0;
  const ConsistencyStyleValue CONS_INF_CTRL = 1;
  typedef long FaultMonitoringStyleValue;
  const FaultMonitoringStyleValue PULL = 0;
  const FaultMonitoringStyleValue PUSH = 1;
  const FaultMonitoringStyleValue NOT_MONITORED = 2;
  typedef long FaultMonitoringGranularityValue;
  const FaultMonitoringGranularityValue MEMB = 0;
  const FaultMonitoringGranularityValue LOC = 1;
  const FaultMonitoringGranularityValue LOC_AND_TYPE = 2;
  typedef FactoryInfos FactoriesValue;
  typedef unsigned short InitialNumberMembersValue;
  typedef unsigned short MinimumNumberMembersValue;

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

#endif // FT_USES_PORTABLE_GROUP

  // Specifications for Fault Management moved to FT_Replica.idl
  // Specification of FaultNotifier Interface: moved to FT_Notifier.idl
  // Specifications for Logging and Recovery: moved to FT_Replica.idl
  // Specifications for Replication Manager moved to FT_ReplicationManager.idl
};


#endif // for #ifndef _FT_IDL_
