/**
  * File: SetMemberInfo.idl
  * Content: CORBA specification of a set containing MemberInfo structures
  * Author: LuisM Pena
  * Date: 17th November 2001
  * Version: 0.29.00
  * Last changes:
  *
  **/

#ifndef SET_MEMBER_INFO
#define SET_MEMBER_INFO

#include "DomainGroupHandler.idl"
#include "MemberInfo.idl"

module sensei
{

  module middleware
  {

    module gmns
    {

      //bringing some declarations into scope ...
      typedef sensei::middleware::domains::DomainMessage DomainMessage;
      typedef sensei::middleware::domains::ExtendedCheckpointable ExtendedCheckpointable;
      typedef sensei::middleware::domains::State State;


      /***********************************************************************/
      /************************* SET MEMBERINFO OBSERVER *********************/
      /***********************************************************************/

      interface SetMemberInfoObservable;

      /**
       * Interface to be implemented by observers of the state of the SetMemberInfo
       */
      interface SetMemberInfoObserver
      {
        void addDone(in SetMemberInfoObservable observable, in MemberInfo member);
        void removeDone(in SetMemberInfoObservable observable, in MemberInfo member);
      };

      /***********************************************************************/
      /************************* SET MEMBERINFO OBSERVABLE *******************/
      /***********************************************************************/

      interface SetMemberInfoObservable
      {
        void addObserver(in SetMemberInfoObserver observer);
        boolean removeObserver(in SetMemberInfoObserver observer);
      };

      /***********************************************************************/
      /************************* SET MEMBERINFO ****************************/
      /***********************************************************************/

      /**
        * This interfaces defines a set with reduced operations.
        * And it is mean to contain just GroupHandlers
        **/
      interface SetMemberInfo : ExtendedCheckpointable, SetMemberInfoObservable
      {
        /**
         * Adds the specified element to this set if it is not already present
         */
        boolean add(in MemberInfo member) raises (sensei::middleware::domains::MemberStateException);

        /**
          * Removes the specified element from this set if it is present
          **/
        boolean remove(in MemberInfo handler) raises (sensei::middleware::domains::MemberStateException);

        /**
          * Specific operation, not existing in a normal Set, to avoid the use of an iterator
          * Returns an element of the set
          **/
        MemberInfo get() raises (sensei::middleware::domains::MemberStateException);

        /**
         * Returns the contents of the set
         */
        MemberInfoList toArray() raises (sensei::middleware::domains::MemberStateException);
      };

      /***********************************************************************/
      /************************* SET GROUP HANDLER CHANGED MESSAGE ***********/
      /***********************************************************************/

      /**
       * Message sent after an update on the set
       */
      valuetype SetMemberInfoChangedMessage : DomainMessage
      {
        public MemberInfo info;
        public boolean add;
      };

      /***********************************************************************/
      /************************* SET STATE **********************************/
      /***********************************************************************/

      valuetype SetMemberInfoState : State
      {
        public sequence<MemberInfo> members;
      };

    };
  };
};

#endif