windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/t120/mst120/crostmsg.cpp
2020-09-26 16:20:57 +08:00

181 lines
4.4 KiB
C++

#include "precomp.h"
#include "fsdiag.h"
DEBUG_FILEZONE(ZONE_T120_CONF_ROSTER);
/*
* crostmsg.cpp
*
* Copyright (c) 1995 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* This is the implementation file for the Conference Roster Message
* Class. This class maintains a conference roster, and is able
* to "serialize" the roster into a block of memory. It utilizes a
* "Lock - UnLock" facility to ensure that the roster memory remains
* valid until all interested parties are through using the object.
*
* Protected Instance Variables:
*
* Private Member Functions:
*
* Caveats:
* None.
*
* Author:
* jbo/blp
*/
#include "crostmsg.h"
/*
* CConfRosterMsg ()
*
* Public Function Description
* This constructor is used to create a Conference Roster Message object.
* The pointer to the conference roster will be stored.
*/
CConfRosterMsg::CConfRosterMsg(CConfRoster *conference_roster)
:
CRefCount(MAKE_STAMP_ID('A','R','M','g')),
m_pMemoryBlock(NULL),
m_pConfRoster(conference_roster)
{
}
/*
* ~CConfRosterMsg ()
*
* Public Function Description:
* The destructor for the CConfRosterMsg class will clean up
* any memory allocated during the life of the object.
*/
CConfRosterMsg::~CConfRosterMsg(void)
{
delete m_pMemoryBlock;
}
/*
* GCCError LockConferenceRosterMessage ()
*
* Public Function Description
* This routine is used to lock an CConfRosterMsg. The memory
* necessary to hold the list of rosters is allocated and the rosters are
* "serialized" into the allocated memory block.
*/
GCCError CConfRosterMsg::LockConferenceRosterMessage(void)
{
GCCError rc = GCC_NO_ERROR;
UINT roster_data_length;
PGCCConferenceRoster temporary_roster;
/*
* Return an error if this object has been freed or if the internal
* conference roster pointer is invalid.
*/
if (m_pConfRoster == NULL)
return (GCC_ALLOCATION_FAILURE);
/*
* If this is the first time this routine is called, determine the size of
* the memory required to hold the conference roster and go ahead
* and serialize the data. Otherwise, just increment the lock count.
*/
if (Lock() == 1)
{
/*
* Determine the size of the memory block needed to hold the roster.
*/
roster_data_length = m_pConfRoster->LockConferenceRoster();
/*
* Allocate space to hold the conference roster and all associated data.
* FIX: Switch critical flag to TRUE when Sharded memory manager is
* set up to support it.
*/
DBG_SAVE_FILE_LINE
if (NULL != (m_pMemoryBlock = new BYTE[roster_data_length]))
{
/*
* Retrieve all of the data for the conference roster.
*/
m_pConfRoster->GetConfRoster(&temporary_roster, m_pMemoryBlock);
}
else
{
ERROR_OUT(("CConfRosterMsg::LockConferenceRosterMessage: "
"can't allocate memory, size=%u", (UINT) roster_data_length));
rc = GCC_ALLOCATION_FAILURE;
}
/*
* Since we do not need the conference roster anymore it is
* OK to unlock it here.
*/
m_pConfRoster->UnLockConferenceRoster ();
}
if (GCC_NO_ERROR != rc)
{
Unlock();
}
return rc;
}
/*
* GCCError GetConferenceRosterMessage()
*
* Public Function Description
* This routine is used to obtain a pointer to the Conference Roster
* memory block used to deliver messages. This routine should not be
* called before LockConferenceRosterMessage is called.
*/
GCCError CConfRosterMsg::GetConferenceRosterMessage(LPBYTE *ppRosterData)
{
GCCError rc = GCC_ALLOCATION_FAILURE;
if (GetLockCount() > 0)
{
if (m_pMemoryBlock != NULL)
{
*ppRosterData = m_pMemoryBlock;
rc = GCC_NO_ERROR;
}
else
{
ERROR_OUT(("CConfRosterMsg::GetConferenceRosterMessage: no data"));
ASSERT(GCC_ALLOCATION_FAILURE == rc);
}
}
else
{
ERROR_OUT(("CConfRosterMsg::GetConferenceRosterMessage: data not locked"));
ASSERT(GCC_ALLOCATION_FAILURE == rc);
}
return rc;
}
/*
* void UnLockConferenceRosterMessage ()
*
* Public Function Description
* This member function is responsible for unlocking the data locked for
* the "API" conference roster after the lock count goes to zero.
*/
void CConfRosterMsg::UnLockConferenceRosterMessage(void)
{
if (Unlock(FALSE) == 0)
{
/*
* Free up the memory block allocated to hold the roster
*/
delete m_pMemoryBlock;
m_pMemoryBlock = NULL;
}
// we have to call Release() because we used Unlock(FALSE)
Release();
}