windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/t120/mst120/crostmgr.cpp

375 lines
9.4 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#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);
}