Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

649 lines
21 KiB

/*
* arostmgr.h
*
* Copyright (c) 1995 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* A single instance of this class represents the owner of all the
* Application Roster objects for a single "Application Protocol Key". The
* CAppRosterMgr takes care of both the "Local" and "Global"
* rosters for all the Sessions that exists which use the same Application
* Protocol Key (peer applications). Organizing ApplicationRosters this
* way enables GCC to meet some of the requirements specified by the T.GAT
* recommendation. Specifically, it enables GCC to deliver multiple
* application rosters that a particular application might be interested in
* a single application roster update indication. It also hides much of
* the complexity required to manage application rosters from the
* CConf object.
*
* To understand the responsibilities of the CAppRosterMgr it is
* important to understand the meaning of a "Session" within the context
* of GCC. A "Session" is a logical entity that is used by a set of peer
* Application Protocol Entities (APEs see T.GAT) to communicate. When an
* application enrolls with GCC it must specify the session it wishes to
* enroll with by specifying a GCCSessionKey. This session key includes an
* Application Protocol Key and a session ID. The enrolling application
* must include an Application Protocol Key that is unique for that
* particular APE (Application Protocol Entity see T.GAT). When other APEs
* in the conference enroll with the same GCCSessionKey, they all show up
* in the same Application Roster. This makes it possible for all the APEs
* enrolled in the same session to determine who it is talking to who.
*
* Note that it is possible for the same APE to be enrolled in multiple
* sessions at the same time. Typically the session that does not include
* a session ID is considered the "Default" session for a particular APE.
* The industry seems to be leaning toward using this default session to do
* administrative task like announcing your capabilities to other APEs or
* as a place to enroll inactively until you have time to join the channels
* associated with the real session you want to enroll with.
*
* An obvious requirement of the CAppRosterMgr is that it must
* have the ability to deliver all the related rosters (the rosters
* associated with all the sessions in existence for a particular APE) to
* the enrolled User Application SAPs and to the Control SAP. It must also
* be able to manage the flow of PDU traffic to and from the application
* rosters it manages. Below is a more detailed description of the
* responsibilities of the CAppRosterMgr.
*
* The rules for when an CAppRosterMgr exist in a CConf object are
* quite a bit more complex than with the CConfRosterMgr. In the
* later case, every node is explicitly required to maintain either a
* single "Global" CConfRoster Manager (if it is a Top Provider node)
* or both a "Local" and "Global" CConfRoster Manager (if it is a
* subordinate node). The existence of an CAppRosterMgr depends
* entirely on an application being enrolled with the conference. If no
* applications are enrolled there are no ApplicationRosterManagers. It
* gets much more complicated if some nodes are servicing enrolled
* applications while others are not. This is often the case when a
* dedicated MCU is in use. Since an Application Roster's information base
* is distributed throughout the CConf, this sometimes requires that
* CAppRosterMgr objects exist at nodes that contain no enrolled
* applications.
*
* An CAppRosterMgr maintains both "Global" and "Local" rosters.
* A "Local" CAppRoster consist of all the Application Roster
* Records at its local node and below it in the connection hierarchy.
* The CAppRosterMgr does not communicate any changes made to
* "Local" ApplicationRosters to the CAppSap objects. Its only input is
* from either primitive calls at the local node or from Roster Update PDUs
* received from subordinate nodes. A "Local" CAppRoster can only
* exist at nodes that are not the Top Provider.
*
* A "Global" CAppRoster has a dual set of responsibilities
* depending on whether or not it is at a Top Provider. A "Global" roster
* at a Top Provider is responsible for maintaining an Application Roster
* that includes a record entry for every application in the CConf
* that is enrolled with the same Application Protocol Key. It is also
* responsible for sending full application roster refreshes to all of its
* subordinate nodes when changes to the roster occur. All
* ApplicationRosterManagers managing "Global" rosters (regardless of
* location within the connection hierarchy) have the ability to send
* Roster Update indications to their local enrolled CAppSap objects.
* Pointers to CAppSap objects that have enrolled with the conference are
* maintained in a list of enrolled ApplicationSaps. These pointers are
* passed in to this object whenever a new APE enrolls with an Application
* Roster through a GCC primitive at the local node. Application Rosters
* are propagated up to the enrolled applications through Command Target
* calls to the ApplicationSap object. The CAppRosterMgr also
* maintains a pointer to the CControlSAP object. Remember all roster
* updates are directed to both the appropriate application SAPs and to the
* Control SAP.
*
* ApplicationRosterManagers are also responsible for receiving full
* refreshes of the Application Roster from the Top Provider and passing
* them on to the appropriate "Global" CAppRoster object it
* maintains. It also sends (as mentioned above) Roster Update indications
* to the enrolled Application SAP objects and the Control SAP via
* CAppRosterMsg objects.
*
* All PDUs and messages are delivered when the CAppRosterMgr is
* flushed. This is a very important concept in that it allows an
* CAppRosterMgr to process a number of request and PDUs before
* actually being flushed. The CAppRoster itself will queue up
* changes to a PDU that can consist of either multiple updates or a single
* refresh and will not free it until after it is flushed. Therefore, when
* processing a roster update PDU that consists of changes to the
* conference roster as well as multiple application rosters, a roster
* refresh PDU can be held back until all the roster managers have had a
* chance to process their portion of the roster update. Once complete, a
* single PDU can be built by flushing the CConfRosterMgr and all
* the affected ApplicationRosterManagers.
*
* Caveats:
* None.
*
* Author:
* blp
*/
#ifndef _APPLICATION_ROSTER_MANAGER_
#define _APPLICATION_ROSTER_MANAGER_
#include "gccpdu.h"
#include "mcsuser.h"
// #include "gcmdtar.h"
#include "arost.h"
#include "sesskey.h"
#include "clists.h"
class CAppRosterMgr : public CRefCount
{
public:
CAppRosterMgr(PGCCSessionKey,
PSessionKey, // PDU
GCCConfID,
PMCSUser,
CConf *,
PGCCError);
~CAppRosterMgr(void);
GCCError EnrollRequest(GCCEnrollRequest *, GCCEntityID, GCCNodeID, CAppSap *);
GCCError UnEnrollRequest(PGCCSessionKey, GCCEntityID);
GCCError ProcessRosterUpdateIndicationPDU(PSetOfApplicationInformation, UserID uidSender);
PSetOfApplicationInformation FlushRosterUpdateIndication(PSetOfApplicationInformation *, PGCCError);
PSetOfApplicationInformation GetFullRosterRefreshPDU(PSetOfApplicationInformation *, PGCCError);
BOOL IsThisYourSessionKey(PGCCSessionKey pSessKey) { return IsThisSessionKeyValid(pSessKey); }
BOOL IsThisYourSessionKeyPDU(PSessionKey pSessKey) { return IsThisSessionKeyPDUValid(pSessKey); }
GCCError RemoveEntityReference(GCCEntityID);
GCCError RemoveUserReference(UserID uidDetached);
GCCError ApplicationRosterInquire(PGCCSessionKey, CAppRosterMsg *);
BOOL IsEntityEnrolled(GCCEntityID);
BOOL IsAPEEnrolled(GCCNodeID, GCCEntityID);
BOOL IsAPEEnrolled(CSessKeyContainer *, GCCNodeID, GCCEntityID);
BOOL IsEmpty(void);
void DeleteRosterRecord(GCCNodeID, GCCEntityID);
private:
GCCError SendRosterReportMessage(void);
CAppRoster *GetApplicationRoster(PGCCSessionKey, CAppRosterList *);
CAppRoster *GetApplicationRosterFromPDU(PSessionKey, CAppRosterList *);
BOOL IsThisSessionKeyValid(PGCCSessionKey pSessKey)
{ return m_pSessionKey->IsThisYourApplicationKey(&pSessKey->application_protocol_key); }
BOOL IsThisSessionKeyPDUValid(PSessionKey pSessKey)
{ return m_pSessionKey->IsThisYourApplicationKeyPDU(&pSessKey->application_protocol_key); }
void CleanupApplicationRosterLists(void);
private:
GCCConfID m_nConfID;
BOOL m_fTopProvider;
PMCSUser m_pMcsUserObject;
CAppSapEidList2 m_AppSapEidList2;
CConf *m_pConf;
CAppRosterList m_GlobalRosterList;
CAppRosterList m_LocalRosterList;
CAppRosterList m_RosterDeleteList;
CSessKeyContainer *m_pSessionKey;
};
#endif // _APPLICATION_ROSTER_MANAGER_
/*
* CAppRosterMgr (
* PGCCSessionKey session_key,
* GCCConfID conference_id,
* PMCSUser user_object,
* UINT owner_message_base,
* CControlSAP *pControlSap,
* PGCCError return_value)
*
* Public Function Description
* This is the application roster manager constructor. It is responsible
* for initializing all the instance variables used by this class.
* This constructor is used when the initial roster data that is
* availble comes from local API data.
*
* Formal Parameters:
* session_key - (i) "API" Session Key used to establish the
* application protocol key for this session.
* conference_id - (i) Conference ID associated with this roster
* maanger.
* user_object - (i) Pointer to the user attachment object used
* by this class.
* owner_object - (i) Pointer to the owner object.
* owner_message_base - (i) Message base to add to all the owner
* callbacks.
* control_sap - (i) Pointer to the node controller SAP object.
* return_value - (o) Pointer to error value to be returned.
*
*
* Return Value
* GCC_NO_ERROR - No resource error occured.
* GCC_ALLOCATION_FAILURE - A resource error occured.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* CAppRosterMgr (
* PSessionKey session_key,
* GCCConfID conference_id,
* PMCSUser user_object,
* UINT owner_message_base,
* CControlSAP *pControlSap,
* PGCCError return_value)
*
* Public Function Description
* This is the application roster manager constructor. It is responsible
* for initializing all the instance variables used by this class.
* This constructor is used when the initial roster data that is
* availble comes from remote PDU data.
*
* This constructor handles a number of different possiblities:
* For Non Top Providers:
* 1) A refresh received from the top provider.
* 2) An update from a node below this one.
*
* For the Top Provider:
* 1) An Update from a lower node
*
* Formal Parameters:
* session_key - (i) "PDU" Session Key used to establish the
* application protocol key for this session.
* conference_id - (i) Conference ID associated with this roster
* maanger.
* user_object - (i) Pointer to the user attachment object used
* by this class.
* owner_object - (i) Pointer to the owner object.
* owner_message_base - (i) Message base to add to all the owner
* callbacks.
* control_sap - (i) Pointer to the node controller SAP object.
* return_value - (o) Pointer to error value to be returned.
*
*
* Return Value
* GCC_NO_ERROR - No resource error occured.
* GCC_ALLOCATION_FAILURE - A resource error occured.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* ~ApplicationRosterManager ()
*
* Public Function Description
* This is the application roster manager destructor. It is used to
* free up all memory associated with this class.
*
* Formal Parameters:
* None.
*
* Return Value
* None.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* GCCError EnrollRequest (
* PGCCSessionKey session_key,
* PGCCApplicationRecord application_record,
* EntityID entity_id,
* UINT number_of_capabilities,
* PGCCApplicationCapability * capabilities_list)
*
* Public Function Description
* This routine is called whenever an APE wishes to enroll with the
* conference in a specific session. This routine can be used to
* either add a new record or replace a currently existing record.
*
* Formal Parameters:
* session_key - (i) Session to enroll with.
* application_record - (i) Application record to enroll with.
* entity_id - (i) Entity ID of enrolling APE.
* number_of_capabilities - (i) Number of capabilities in caps list.
* capabilities_list - (i) list of capabilities that the APE is
* enrolling with.
* command_target - (i) Pointer to APE SAP that is enrolling.
*
* Return Value
* GCC_NO_ERROR - No error occured.
* GCC_BAD_SESSION_KEY - Session key passed in is invalid.
* GCC_ALLOCATION_FAILURE - A resource error occured.
* GCC_INVALID_NON_COLLAPSED_CAP - Bad non-collapsed capabilities.
* GCC_INVALID_PARAMETER - Invalid parameter passed in.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* GCCError UnEnrollRequest (
* PGCCSessionKey session_key,
* EntityID entity_id)
*
* Public Function Description
* This routine is called whenever an APE wishes to unenroll from the
* conference (or a specific session).
*
* Formal Parameters:
* session_key - (i) Session to unenroll from.
* entity_id - (i) Entity ID of unenrolling APE.
*
* Return Value
* GCC_NO_ERROR - No error occured.
* GCC_BAD_SESSION_KEY - Session key passed in is invalid.
* GCC_APP_NOT_ENROLLED - APE is not enrolled with this
* session..
* GCC_INVALID_PARAMETER - Invalid parameter passed in.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* GCCError ProcessRosterUpdateIndicationPDU(
* PSetOfApplicationInformation set_of_application_info,
* UserID sender_id)
*
* Public Function Description
* This routine processes an incomming roster update PDU. It is
* responsible for passing the PDU on to the right application roster.
*
* Formal Parameters:
* set_of_application_info - (i) PDU data to process
* sender_id - (i) Node ID that sent the update.
*
* Return Value
* GCC_NO_ERROR - No error occured.
* GCC_BAD_SESSION_KEY - Session key passed in is invalid.
* GCC_ALLOCATION_FAILURE - A resource error occured.
* GCC_INVALID_PARAMETER - Invalid parameter passed in.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* PSetOfApplicationInformation FlushRosterUpdateIndication (
* PSetOfApplicationInformation * set_of_information,
* PGCCError return_value)
*
* Public Function Description
* This routine is used to access any PDU data that might currently be
* queued inside the application rosters managed by this application
* roster manager. It also is responsible for flushing any queued
* roster update messages if necessary.
*
* Formal Parameters:
* set_of_information - (o) Pointer PDU to fill in.
* return_value - (o) Error return here.
*
* Return Value
* Pointer to the new set of application information.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* PSetOfApplicationInformation GetFullRosterRefreshPDU (
* PSetOfApplicationInformation * set_of_information,
* PGCCError return_value)
*
* Public Function Description
* This routine is used to obtain a complete roster refresh of all the
* rosters maintained by this roster manger.
*
* Formal Parameters:
* set_of_information - (o) Pointer PDU to fill in.
* return_value - (o) Error return here.
*
* Return Value
* Pointer to the new set of application information.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* BOOL IsThisYourSessionKey(
* PGCCSessionKey session_key)
*
* Public Function Description
* This routine is used to determine if the specified "API" session key is
* associated with this application roster manager.
*
* Formal Parameters:
* session_key - (i) "API" session key to test.
*
* Return Value
* TRUE - If session key is associated with this manager.
* FALSE - If session key is NOT associated with this manager.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* BOOL IsThisYourSessionKeyPDU(
* PSessionKey session_key);
*
* Public Function Description
* This routine is used to determine if the specified "PDU" session key is
* associated with this application roster manager.
*
* Formal Parameters:
* session_key - (i) "PDU" session key to test.
*
* Return Value
* TRUE - If session key is associated with this manager.
* FALSE - If session key is NOT associated with this manager.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* GCCError RemoveEntityReference(
* EntityID application_entity)
*
* Public Function Description
* This routine is used to remove the specified APE entity from the
* session it is enrolled with. Note that this routine is only used
* to remove local entity references.
*
* Formal Parameters:
* application_entity - (i) Entity reference to remove.
*
* Return Value
* GCC_NO_ERROR - Entity was removed.
* GCC_INVALID_PARAMETER - Entity does not exist here.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* GCCError RemoveUserReference(
* UserID detached_user)
*
* Public Function Description
* This routine is used to remove all references associated with the
* node defined by the detached user.
*
* Formal Parameters:
* detached_user - (i) User reference to remove.
*
* Return Value
* GCC_NO_ERROR - User reference was removed.
* GCC_INVALID_PARAMETER - No records associated with this node.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* BOOL IsEntityEnrolled(
* EntityID entity_id)
*
* Public Function Description
* This routine informs the caller if the specified entity is enrolled
* with any sessions managed by this application roster manager.
*
* Formal Parameters:
* entity_id - (i) Entity to test.
*
* Return Value
* TRUE - Entity is enrolled.
* FALSE - Entity is not enrolled.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* GCCError ApplicationRosterInquire (
* PGCCSessionKey session_key,
* CAppRosterMsg *roster_message)
*
* Public Function Description
* This routine inserts the appropriate application rosters into the
* roster message that is passed in. If the specified session key is set
* to NULL or a session ID of zero is passed in, all the global rosters
* managed by this object will be returned. Otherwise, only the
* specified session roster will be returned.
*
* Formal Parameters:
* session_key - (i) Session key defining roster being inquired about.
* roster_message - (o) Roster message to fill in.
*
* Return Value
* GCC_NO_ERROR - No error occured.
* GCC_ALLOCATION_FAILURE - A resource error occured.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* BOOL IsAPEEnrolled(
* UserID node_id,
* EntityID entity_id)
*
* Public Function Description
* This routine determines if the specified APE is enrolled with one
* of the sessions managed by this application roster manager.
*
* Formal Parameters:
* node_id - (i) Node ID of APE to test.
* entity_id - (i) Entity ID of APE to test.
*
* Return Value
* TRUE - APE is enrolled here.
* FALSE - APE is not enrolled here.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* BOOL IsAPEEnrolled(
* CSessKeyContainer *session_key_data,
* UserID node_id,
* EntityID entity_id)
*
* Public Function Description
* This routine determines if the specified APE is enrolled with the
* specified session.
*
* Formal Parameters:
* session_key_data - (i) Session Key of roster to check.
* node_id - (i) Node ID of APE to test.
* entity_id - (i) Entity ID of APE to test.
*
* Return Value
* TRUE - APE is enrolled with this session.
* FALSE - APE is not enrolled with this session.
*
* Side Effects
* None.
*
* Caveats
* None.
*/
/*
* BOOL IsEmpty(void)
*
* Public Function Description
* This routine determines if this application roster managfer contains
* any application rosters.
*
* Formal Parameters:
* None.
*
* Return Value
* TRUE - Application Roster Manager is empty.
* FALSE - Application Roster Manager is NOT empty.
*
* Side Effects
* None.
*
* Caveats
* None.
*/