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.
|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: cmap.cxx
//
//--------------------------------------------------------------------------
#include <precomp.hxx>
#include <mqtrans.hxx>
//------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------
CQueueMap::CQueueMap() : cs((InitStatus = RPC_S_OK, &InitStatus)) { dwMapSize = 0; dwOldest = 0; pMap = 0; }
//------------------------------------------------------------------------
// Initialize()
//------------------------------------------------------------------------
BOOL CQueueMap::Initialize( DWORD dwNewMapSize ) { if (!dwNewMapSize) return FALSE;
if (!dwMapSize) {
if (InitStatus != RPC_S_OK) return FALSE;
pMap = new QUEUEMAP_ENTRY [dwNewMapSize]; if (!pMap) return FALSE;
dwMapSize = dwNewMapSize;
for (unsigned i=0; i<dwMapSize; i++) { pMap[i].hQueue = 0; pMap[i].pwsQFormat = 0; } }
return TRUE; }
//------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------
CQueueMap::~CQueueMap() { if (pMap) { for (unsigned i=0; i<dwMapSize; i++) { if (pMap[i].hQueue) MQCloseQueue(pMap[i].hQueue); if (pMap[i].pwsQFormat) delete [] pMap[i].pwsQFormat; } }
delete pMap; }
//------------------------------------------------------------------------
// Lookup()
//------------------------------------------------------------------------
QUEUEHANDLE CQueueMap::Lookup( RPC_CHAR *pwsQFormat ) {
cs.Request();
for (unsigned i=0; i<dwMapSize; i++) { if ((pMap[i].pwsQFormat)&&(!RpcpStringSCompare(pwsQFormat,pMap[i].pwsQFormat))) { cs.Clear(); return pMap[i].hQueue; } }
cs.Clear();
return 0; }
//------------------------------------------------------------------------
// Add()
//------------------------------------------------------------------------
BOOL CQueueMap::Add( RPC_CHAR *pwsQFormat, QUEUEHANDLE hQueue ) { // Only add entries that look valid...
if ( !pwsQFormat || !hQueue ) { return FALSE; }
cs.Request();
// If the table is full, the clear out the oldest entry:
if (pMap[dwOldest].hQueue) { MQCloseQueue(pMap[dwOldest].hQueue); pMap[dwOldest].hQueue = 0; }
if (pMap[dwOldest].pwsQFormat) { delete [] pMap[dwOldest].pwsQFormat; pMap[dwOldest].pwsQFormat = 0; }
// New entry:
pMap[dwOldest].pwsQFormat = new RPC_CHAR [1+RpcpStringLength(pwsQFormat)]; if (!pMap[dwOldest].pwsQFormat) { cs.Clear(); return FALSE; }
RpcpStringCopy(pMap[dwOldest].pwsQFormat,pwsQFormat); pMap[dwOldest].hQueue = hQueue;
dwOldest = (1 + dwOldest)%dwMapSize;
cs.Clear();
return TRUE; }
//------------------------------------------------------------------------
// Remove()
//------------------------------------------------------------------------
BOOL CQueueMap::Remove( RPC_CHAR *pwsQFormat ) { cs.Request();
for (unsigned i=0; i<dwMapSize; i++) { if ((pMap[i].pwsQFormat)&&(!RpcpStringSCompare(pwsQFormat,pMap[i].pwsQFormat))) { delete [] pMap[i].pwsQFormat; pMap[i].pwsQFormat = 0; pMap[i].hQueue = 0; cs.Clear(); return TRUE; } }
cs.Clear();
return FALSE; }
|