/** * File: SubgroupsHandler.idl * Content: UMA corba definition for the Domain Group Handler's subgroup operations * Author: LuisM Pena * Date: 28th November 2000 * Version: 0.51.00 * Last change: * 12th April 2001: state transfer inclusion * * **/ #ifndef SUBGROUPS_HANDLER_IDL #define SUBGROUPS_HANDLER_IDL #include "DomainExceptions.idl" #include "StateTransfer.idl" module sensei { module middleware { module domains { /***********************************************************************/ /************************* SUBGROUP ************************************/ /***********************************************************************/ typedef long SubgroupId; typedef sequence<SubgroupId> SubgroupIdsList; const long EVERY_SUBGROUP = 0; const long MAX_STATIC_SUBGROUP_ID = 65535; //static subgroups cannot have a bigger group id /***********************************************************************/ /************************* SUBGROUPS HANDLER EXCEPTION *****************/ /***********************************************************************/ enum SubgroupsHandlerExceptionReason { SubgroupIdAlreadyInUse, //Subgroup ID already in use InvalidStaticSubgroupId, //Subgroup ID given to register an static subgroup is not valid InvalidDynamicSubgroupId, //Subgroup ID given to register an static subgroup is not valid DynamicBehaviourNotRegistered //Dynamic behaviour not registered }; exception SubgroupsHandlerException { SubgroupsHandlerExceptionReason reason; }; /***********************************************************************/ /************************* DYNAMIC SUBGROUP INFO ***********************/ /***********************************************************************/ /** * Defines the information associated to a dynamic subgroup, supplied by the application */ valuetype DynamicSubgroupInfo { }; /** * Defines a convenient DynamicSubgroupInfo where the information is specified as a String */ valuetype DynamicSubgroupInfoAsString : DynamicSubgroupInfo { public string info; }; /***********************************************************************/ /************************* DYNAMIC SUBGROUPS USER **********************/ /***********************************************************************/ /** * Defines the interface to be used by members using the SubgroupsHandler interface * with dynamic groups */ interface DynamicSubgroupsUser { /** * Request during state transfer to accept an existing dynamic subgroup; a subgroup must be returned, */ GroupMember acceptSubgroup(in SubgroupId id, in DynamicSubgroupInfo info); /** * Notification that a subgroup has been dynamically created. A subgroup must be returned, */ GroupMember subgroupCreated(in GroupMemberId creator, in SubgroupId id, in DynamicSubgroupInfo info); /** * Notification that a subgroup has been dynamically removed. */ void subgroupRemoved(in GroupMemberId remover, in SubgroupId id, in DynamicSubgroupInfo info); }; /***********************************************************************/ /************************* SUBGROUPS HANDLER ***************************/ /***********************************************************************/ /** * Interface supporting subgroups handling **/ interface SubgroupsHandler { /** * Sets a DynamicSubgroupsUser listener. This user must be set before the member joins * a group, or an exception is raised */ void setDynamicSubgroupsUser(in DynamicSubgroupsUser user) raises (MemberStateException); /** * Registers a static subgroup with a specific ID. This ID must be unique in the object and also * in the group. The group cannot have been activated yet, or an exception is raised. * Every member must have defined the same subgroups when the group is joined. * Once joined, it is not possible anymore to use registerSubgroup, as the subgroups * must be dynamically registered. * The subgroups registered with this method cannot be later unregistered. * The subgroupId must be a valid static subgroup Id (lower or equal to MAX_STATIC_SUBGROUP_ID) * or the subgroup is not registered and an exception is raised * @exception MemberStateException if the member has not yet joined a group, or it has been expulsed * @exception SubgroupsHandlerException if the subgroupId specified is not valid (not static) **/ void registerSubgroup(in SubgroupId uniqueSubgroupId, in GroupMember subgroup) raises (MemberStateException, SubgroupsHandlerException); /** * Registers a group dynamically, only possible when the member belongs already to a group and * has registered a dynamic subgroups user. * When this method is invoked, every member in the group, included this one, receives a invocation * through createdSubgroup, and a Subgroup must be supplied. * @exception MemberStateException if the member has not yet joined a group, or it has been expulsed * @exception SubgroupsHandlerException if the member does not support dynamic groups **/ void castSubgroupCreation(in DynamicSubgroupInfo info) raises (MemberStateException, SubgroupsHandlerException); /** * Registers a group dynamically, only possible when the member belongs already to a group and * has registered a dynamic subgroups user. * When this method is invoked, every member in the group, included this one, receives a invocation * through createdSubgroup, and a Subgroup must be supplied. * this call blocks until the subgroup is registered, returning the created subgroupId * @exception MemberStateException if the member has not yet joined a group, or it has been expulsed * @exception SubgroupsHandlerException if the member does not support dynamic groups **/ SubgroupId createSubgroup(in DynamicSubgroupInfo info, in GroupMember subgroup) raises (MemberStateException, SubgroupsHandlerException); /** * Removes the given subgroup. Only dynamic subgroups can be removed. * If the group is static, an exception is raised. If the subgroup does not exist, false is returned * Every member in the group receives a removedSubgroup notification * @exception MemberStateException if the member has not yet joined a group, or it has been expulsed * @exception SubgroupsHandlerException if the member does not support dynamic groups or the * subgroupId given is describes a static subgroup */ boolean removeSubgroup(in SubgroupId id, in DynamicSubgroupInfo info) raises (MemberStateException, SubgroupsHandlerException); /** * Returns the existing groups, statics and dynamics */ SubgroupIdsList getSubgroups(); /** * Returns the subgroup associated to a given subgroupId, null if not existing */ GroupMember getSubgroup(in SubgroupId id); /** * Returns the subgroupId for a group. If the group is not valid, EVERY_SUBGROUP is returned */ SubgroupId getSubgroupId(in GroupMember subgroup); }; }; }; }; #endif