375 lines
9.4 KiB
C++
375 lines
9.4 KiB
C++
|
#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);
|
||
|
}
|
||
|
|
||
|
|