#include "precomp.h" #include "fsdiag.h" DEBUG_FILEZONE(ZONE_T120_CONF_ROSTER); /* * crostmgr.cpp * * Copyright (c) 1995 by DataBeam Corporation, Lexington, KY * * Abstract: * This is the implementation file for the Conference Roster * Manager Class. * * SEE THE INTERFACE FILE FOR A MORE DETAILED EXPLANATION OF THIS CLASS * * Private Instance Variable: * m_pGlobalConfRoster * A pointer to the global conference roster. * m_pLocalConfRoster * A pointer to the local conference roster. * m_fTopProvider * Flag indicating if this is a Top Provider node. * m_pMcsUserObject * Pointer to the MCS user object associated with this conference. * m_pConf * Pointer to object that will receive all the owner callbacks. * * Caveats: * None * * Author: * blp */ #include "crostmsg.h" #include "crostmgr.h" #include "conf.h" /* * CConfRosterMgr () * * Public Function Description * This is the conference roster constructor. It is responsible for * initializing all the instance variables used by this class. */ CConfRosterMgr::CConfRosterMgr( PMCSUser user_object, CConf *pConf, BOOL top_provider, PGCCError rc) : CRefCount(MAKE_STAMP_ID('C','R','M','r')), m_fTopProvider(top_provider), m_pMcsUserObject(user_object), m_pLocalConfRoster(NULL), m_pGlobalConfRoster(NULL), m_pConf(pConf) { BOOL maintain_pdu_buffer; DebugEntry(CConfRosterMgr::CConfRosterMgr); *rc = GCC_NO_ERROR; // Here we determine if the roster needs to maintain PDU data maintain_pdu_buffer = m_fTopProvider; // Create the global conference roster. DBG_SAVE_FILE_LINE m_pGlobalConfRoster = new CConfRoster( m_pMcsUserObject->GetTopNodeID(), m_pMcsUserObject->GetParentNodeID(), m_pMcsUserObject->GetMyNodeID(), m_fTopProvider, FALSE, // Is not Local maintain_pdu_buffer); if (m_pGlobalConfRoster != NULL) { if (m_fTopProvider == FALSE) { // Create the local conference roster. DBG_SAVE_FILE_LINE m_pLocalConfRoster = new CConfRoster( m_pMcsUserObject->GetTopNodeID(), m_pMcsUserObject->GetParentNodeID(), m_pMcsUserObject->GetMyNodeID(), m_fTopProvider, TRUE, // Is Local TRUE // Maintain PDU buffer ); if (m_pLocalConfRoster == NULL) *rc = GCC_ALLOCATION_FAILURE; } } else *rc = GCC_ALLOCATION_FAILURE; DebugExitVOID(CConfRosterMgr::CConfRosterMgr); } /* * ~CConfRosterMgr () * * Public Function Description * This is the conference roster destructor. It is responsible for * freeing up all memory allocated by this class. */ CConfRosterMgr::~CConfRosterMgr(void) { if (NULL != m_pGlobalConfRoster) { m_pGlobalConfRoster->Release(); } if (NULL != m_pLocalConfRoster) { m_pLocalConfRoster->Release(); } } /* * GCCError AddNodeRecord () * * Public Function Description * This routine is used to add a new record to the conference roster. * This class makes the decision about which roster the new record goes * into (global or local). */ GCCError CConfRosterMgr::AddNodeRecord(PGCCNodeRecord node_record) { GCCError rc = GCC_NO_ERROR; CConfRoster *conference_roster; DebugEntry(CConfRosterMgr::AddNodeRecord); /* ** First determinate the right conference roster. For non Top Providers ** the global roster will be updated when the refresh comes back in. */ conference_roster = m_fTopProvider ? m_pGlobalConfRoster : m_pLocalConfRoster; // Add the top providers conference record to the roster. rc = conference_roster->AddRecord(node_record, m_pMcsUserObject->GetMyNodeID()); DebugExitINT(CConfRosterMgr::AddNodeRecord, rc); return rc; } /* * GCCError UpdateNodeRecord () * * Public Function Description * This routine is used to replace a record in the conference roster with * a new record. This class makes the decision about which roster the new * record affects (global or local). */ GCCError CConfRosterMgr::UpdateNodeRecord(PGCCNodeRecord node_record) { GCCError rc = GCC_NO_ERROR; CConfRoster *conference_roster; DebugEntry(CConfRosterMgr::UpdateNodeRecord); /* ** First determinate the right conference roster. For non Top Providers ** the global roster will be updated when the refresh comes back in. */ conference_roster = m_fTopProvider ? m_pGlobalConfRoster : m_pLocalConfRoster; rc = conference_roster->ReplaceRecord(node_record, m_pMcsUserObject->GetMyNodeID()); DebugExitINT(CConfRosterMgr::UpdateNodeRecord, rc); return rc; } /* * GCCError RemoveUserReference () * * Public Function Description * This routine removes the record associated with the specified node * id. */ GCCError CConfRosterMgr::RemoveUserReference(UserID deteched_node_id) { GCCError rc = GCC_NO_ERROR; CConfRoster *conference_roster; DebugEntry(CConfRosterMgr::RemoveUserReference); /* ** First determinate the right conference roster. For non Top Providers ** the global roster will be updated when the refresh comes back in. */ conference_roster = m_fTopProvider ? m_pGlobalConfRoster : m_pLocalConfRoster; rc = conference_roster->RemoveUserReference (deteched_node_id); DebugExitINT(CConfRosterMgr::RemoveUserReference, rc); return rc; } /* * GCCError RosterUpdateIndication () * * Public Function Description * This routine is responsible for processing the decoded PDU data. * It essentially passes the PDU on along to the appropriate roster. */ GCCError CConfRosterMgr::RosterUpdateIndication( PGCCPDU roster_update, UserID sender_id) { GCCError rc = GCC_NO_ERROR; CConfRoster *conference_roster; DebugEntry(CConfRosterMgr::RosterUpdateIndication); /* ** Determine if this update came from the Top Provider or a node ** below this node. This dictates which conference roster will ** process the PDU. */ conference_roster = (m_fTopProvider || (sender_id == m_pMcsUserObject->GetTopNodeID())) ? m_pGlobalConfRoster : m_pLocalConfRoster; rc = conference_roster->ProcessRosterUpdateIndicationPDU ( &roster_update->u.indication.u.roster_update_indication. node_information, sender_id); DebugExitINT(CConfRosterMgr::RosterUpdateIndication, rc); return rc; } /* * GCCError FlushRosterUpdateIndication () * * Public Function Description * This routine is used to access any PDU data that might currently be * queued inside the conference roster. It also is responsible for * flushing a roster update message if necessary. */ GCCError CConfRosterMgr::FlushRosterUpdateIndication(PNodeInformation node_information) { GCCError rc = GCC_NO_ERROR; CConfRoster *conference_roster; CConfRosterMsg *roster_message; DebugEntry(CConfRosterMgr::FlushRosterUpdateIndication); // First determine the conference roster that is affected. conference_roster = m_fTopProvider ? m_pGlobalConfRoster : m_pLocalConfRoster; // Now add the node information to the PDU structure. conference_roster->FlushRosterUpdateIndicationPDU (node_information); /* ** Next we must deliver any roster update messages that need to be ** delivered. */ if (m_pGlobalConfRoster->HasRosterChanged ()) { DBG_SAVE_FILE_LINE roster_message = new CConfRosterMsg(m_pGlobalConfRoster); if (roster_message != NULL) { m_pConf->ConfRosterReportIndication(roster_message); roster_message->Release(); } else { ERROR_OUT(("CConfRosterMgr::FlushRosterUpdateIndication: can't create CConfRosterMsg")); rc = GCC_ALLOCATION_FAILURE; } } /* ** Now perform the necessary cleanup which includes resetting the ** conference rosters to their neutral state. */ m_pGlobalConfRoster->ResetConferenceRoster (); if (m_fTopProvider == FALSE) m_pLocalConfRoster->ResetConferenceRoster (); DebugExitINT(CConfRosterMgr::FlushRosterUpdateIndication, rc); return rc; } /* * GCCError GetFullRosterRefreshPDU () * * Public Function Description * This routine is used to access a full conference roster refresh. */ GCCError CConfRosterMgr::GetFullRosterRefreshPDU(PNodeInformation node_information) { GCCError rc; DebugEntry(CConfRosterMgr::GetFullRosterRefreshPDU); if (m_fTopProvider) { // Call on the global roster to build a full refresh PDU. rc = m_pGlobalConfRoster->BuildFullRefreshPDU (); if (rc == GCC_NO_ERROR) { /* ** Now flush the full refresh PDU. Note that this will also ** deliver any queued roster update messages to the local ** SAPs that may be queued. */ rc = FlushRosterUpdateIndication (node_information); } } else rc = GCC_INVALID_PARAMETER; DebugExitINT(CConfRosterMgr::GetFullRosterRefreshPDU, rc); return rc; } /* * BOOL Contains () * * Public Function Description * This routine is used to determine if the specified record exists in * the conference roster. */ /* * CConfRoster *GetConferenceRosterPointer () * * Public Function Description * This routine is used to access a pointer to the conference roster * managed by this conference roster manager. The global roster * is always returned by this routine. */ /* * USHORT GetNumberOfConferenceRecords () * * Public Function Description * This routine returns the total number of conference roster records * contained in the global conference roster record list. */ BOOL CConfRosterMgr:: IsThisNodeParticipant ( GCCNodeID nid ) { return ((NULL != m_pGlobalConfRoster) ? m_pGlobalConfRoster->Contains(nid) : FALSE); }