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.
|
|
#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(); }
|