/**
  * File: StateTransfer.idl
  * Content: Definition of the State Transfer interface
  * Author: LuisM Pena
  * Date: 11th April 2001
  * Version: 0.51.00
  * Last change:
  *
  **/

#ifndef STATE_TRANSFER_IDL
#define STATE_TRANSFER_IDL

#include "GroupMembershipService.idl"

module sensei
{

  module middleware
  {

    module domains
    {

      //bringing some declarations into scope ...
      typedef sensei::middleware::gms::GroupMember   GroupMember;
      typedef sensei::middleware::gms::GroupMemberId GroupMemberId;

      //taking some definitions from the CORBA specification, applying changes when required
      abstract valuetype State {}; //instead of the basic ANY definition

      typedef GroupMemberId Location;  //instead of CosNaming::Name

      typedef sequence <Location> Locations;

      interface Checkpointable : GroupMember//does not use underscore, i.e,  get_state!
      {
        State getState();
        void setState (in State s);
      };

      typedef string Name;
      typedef string Value; //simplified approach, using string instead of any
      struct Property
      {
        Name nam;
        Value val;
      };
      typedef sequence <Property> Properties;

      /***********************************************************************/
      /************************* PHASE COORDINATION **************************/
      /***********************************************************************/

      valuetype PhaseCoordination
      {
        public boolean transferFinished;
      };

      /***********************************************************************/
      /************************* EXTENDED CHECKPOINTABLE *********************/
      /***********************************************************************/

      interface ExtendedCheckpointable : Checkpointable
      {
        void assumeState ();
      };

      /***********************************************************************/
      /************************* BASIC STATE HANDLER *************************/
      /***********************************************************************/

      interface BasicStateHandler : GroupMember
      {
        void assumeState ();
        void startTransfer (in Locations joiningMembers, inout PhaseCoordination phase);
        State getState (inout PhaseCoordination phase);
        void setState (in State s, in PhaseCoordination phase);
        void stopTransfer (in Locations joiningMembers, in boolean transferFinished);
      };

      /***********************************************************************/
      /************************* STATE HANDLER *******************************/
      /***********************************************************************/

      interface StateHandler : BasicStateHandler
      {
        void syncTransfer (in Location coordinator, inout PhaseCoordination phase);
        void interruptTransfer (inout PhaseCoordination phase);
        void continueTransfer (in Locations joiningMembers,
                                inout PhaseCoordination coordinator,
                                in PhaseCoordination joining);
      };

      /***********************************************************************/
      /************************* COORDINATOR ELECTOR *************************/
      /***********************************************************************/

      struct CoordinatorInformation
      {
        Location statusMember;
        Locations currentCoordinations;
      };

      typedef sequence <CoordinatorInformation> CoordinatorInformationList;

      interface CoordinatorElector
      {
        Location getCoordinator (in Location loc, in CoordinatorInformationList info);
      };

      /***********************************************************************/
      /************************* BEHAVIOUR ON VIEW CHANGES *******************/
      /***********************************************************************/

      enum BehaviourOnViewChanges
      {
        MembersOnTransferExcludedFromGroup,
        StatelessMembersDoNotBelongToGroup,
        StatelessMembersBelongToGroup
      };

    };
  };
};

#endif