#ifndef TAO_FT_CORBA_ORB_IDL
#define TAO_FT_CORBA_ORB_IDL

// Including the $TAO_ROOT/tao one so that we dont depend on the
// Svc_Utils
#include "tao/TimeBase.pidl" // 98-10.47.idl
// Proprietary includes for TAO
#include "tao/IOP.pidl" // from 98-03-01.idl
#include "tao/GIOP.pidl" // from 98-03-01.idl
#include "tao/Policy.pidl"

#include "PortableGroup_Simple_DS.idl"


#pragma prefix "omg.org"


// These have been moved to the file IOP.pidl
module FT
{
  /// FTDomainId's are denoted as strings
  typedef PortableGroup::GroupDomainId FTDomainId;

    /// The objectgroup id
  typedef PortableGroup::ObjectGroupId ObjectGroupId;

  /// The reference version of the object group
  typedef PortableGroup::ObjectGroupRefVersion ObjectGroupRefVersion;

  /**
   * @struct TagFTGroupTaggedComponent
   *
   * @brief Contents of the Tagged_Component field with tag
   *  TAG_FT_GROUP
   */
  typedef PortableGroup::TagGroupTaggedComponent TagFTGroupTaggedComponent;

  /**
   * @struct TagFTPrinaryTaggedComponent
   *
   * @brief Contents of the Tagged_Component field with tag
   *  TAG_FT_PRIMARY
   */
  struct TagFTPrimaryTaggedComponent
  {
    boolean primary;
  };

  /**
   * @struct FTGroupVersionServiceContext
   *
   * @brief Service Context list info for FT_GROUP_VERSION.
   *
   *  It specifies the most recent Object Group Version
   */
  struct FTGroupVersionServiceContext
  {
    ObjectGroupRefVersion object_group_ref_version;
  };

  /**
   * @struct FTRequestServiceContext
   *
   * @brief Service Context List information for FT_REQUEST
   */

  struct FTRequestServiceContext
  {
    string client_id;
    long retention_id;
    TimeBase::TimeT expiration_time;
  };

  /// Policy type for holding a request
  const CORBA::PolicyType REQUEST_DURATION_POLICY = 47;

  /**
   * @interface RequestDurationPolicy
   *
   * @brief Policy specification for Request Duration policy
   */
  local interface RequestDurationPolicy : CORBA::Policy
    {
      readonly attribute TimeBase::TimeT request_duration_policy_value;
    };

  /// Policy types for HeartBeats
  const CORBA::PolicyType HEARTBEAT_POLICY = 48;

  /**
   * @struct HeartbeatPolicyValue
   *
   * @brief HeartbeatPolicy's  range for the client
   */
  struct HeartbeatPolicyValue {
    boolean heartbeat;
    TimeBase::TimeT heartbeat_interval;
    TimeBase::TimeT heartbeat_timeout;
  };

  /**
   * @interface HeartbeatPolicy
   *
   * @brief Policy specification for Heartbeats on the client side
   */
  local interface HeartbeatPolicy : CORBA::Policy {
    readonly attribute HeartbeatPolicyValue heartbeat_policy_value;
  };

  /// Policy type to enable heartbeating
  const CORBA::PolicyType HEARTBEAT_ENABLED_POLICY = 49;

  /**
   * @struct TagFTHeartbeatEnabledTaggedComponent
   *
   * @brief Tagged components for TAG_FT_HEARTBEAT_ENABLED
   *
   */
  struct TagFTHeartbeatEnabledTaggedComponent
  {
    boolean heartbeat_enabled;
  };

  /**
   * @interface HeartbeatEnabledPolicy
   *
   * @brief Policy values for heartbeatEnabledpolicy
   *
   */
  local interface HeartbeatEnabledPolicy : CORBA::Policy {
    readonly attribute boolean heartbeat_enabled_policy_value;
  };

};
#endif /*TAO_FT_CORBA_ORB_IDL*/
