Leaked source code of windows server 2003
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.
 
 
 
 
 
 

254 lines
7.0 KiB

/*
* a c c t c a c h . c p p
*
* Author: Greg Friedman
*
* Purpose: Runtime store for cached account properties.
*
* Copyright (C) Microsoft Corp. 1998.
*/
#include "pch.hxx"
#include "acctcach.h"
#include "tmap.h"
#include "simpstr.h"
// explicit template instantiations
template class TMap<CACHEDACCOUNTPROP, CSimpleString>;
template class TPair<CACHEDACCOUNTPROP, CSimpleString>;
typedef TMap<CACHEDACCOUNTPROP, CSimpleString> CAccountPropMap;
typedef TPair<CACHEDACCOUNTPROP, CSimpleString> CAccountPropPair;
template class TMap<CSimpleString, CAccountPropMap*>;
template class TPair<CSimpleString, CAccountPropMap*>;
typedef TMap<CSimpleString, CAccountPropMap*> CAccountCacheMap;
typedef TPair<CSimpleString, CAccountPropMap*> CAccountCachePair;
static CAccountCacheMap *g_pAccountCache;
// REVIEW!!! We are leaking the prop arrays right now!!!
// the map template needs to be able to take a pair free func
//----------------------------------------------------------------------
// Internal Functions
//----------------------------------------------------------------------
//----------------------------------------------------------------------
// _FreeAccountCachePair
//----------------------------------------------------------------------
static void __cdecl _FreeAccountCachePair(CAccountCachePair *pPair)
{
if (NULL != pPair)
{
delete pPair->m_value;
delete pPair;
}
}
//----------------------------------------------------------------------
// _HrInitAccountPropCache
//----------------------------------------------------------------------
static HRESULT _HrInitAccountPropCache(void)
{
HRESULT hr = S_OK;
Assert(NULL == g_pAccountCache);
if (NULL != g_pAccountCache)
return E_FAIL;
g_pAccountCache = new CAccountCacheMap();
if (NULL == g_pAccountCache)
{
hr = E_OUTOFMEMORY;
goto exit;
}
g_pAccountCache->SetPairFreeFunction(_FreeAccountCachePair);
exit:
return S_OK;
}
//----------------------------------------------------------------------
// _HrFindAccountPropertyMap
//----------------------------------------------------------------------
static HRESULT _HrFindAccountPropertyMap(LPSTR pszAccountId,
CAccountPropMap **ppm,
BOOL fCreate)
{
HRESULT hr = S_OK;
CSimpleString ss;
CAccountCachePair *pPair = NULL;
CAccountPropMap *pMap = NULL;
Assert(NULL != ppm);
*ppm = NULL;
if (NULL == g_pAccountCache)
{
if (fCreate)
hr = _HrInitAccountPropCache();
if (NULL == g_pAccountCache)
goto exit;
}
if (FAILED(hr = ss.SetString(pszAccountId)))
goto exit;
pPair = g_pAccountCache->Find(ss);
if (NULL != pPair)
*ppm = pPair->m_value;
else if (fCreate)
{
pMap = new CAccountPropMap();
if (NULL == pMap)
{
hr = E_OUTOFMEMORY;
goto exit;
}
if (FAILED(hr = g_pAccountCache->Add(ss, pMap)))
{
delete pMap;
goto exit;
}
*ppm = pMap;
}
exit:
return hr;
}
//----------------------------------------------------------------------
// FreeAccountPropCache
//----------------------------------------------------------------------
void FreeAccountPropCache(void)
{
EnterCriticalSection(&g_csAccountPropCache);
if (NULL != g_pAccountCache)
{
delete g_pAccountCache;
g_pAccountCache = NULL;
}
LeaveCriticalSection(&g_csAccountPropCache);
}
//----------------------------------------------------------------------
// HrCacheAccountPropStrA
//----------------------------------------------------------------------
HRESULT HrCacheAccountPropStrA(LPSTR pszAccountId,
CACHEDACCOUNTPROP cap,
LPCSTR pszProp)
{
HRESULT hr = S_OK;
CAccountPropMap *pMap = NULL;
CAccountPropPair *pPair = NULL;
CSimpleString ssProp;
if (NULL == pszAccountId || NULL == pszProp)
return E_INVALIDARG;
EnterCriticalSection(&g_csAccountPropCache);
// find the account property map. create one if it doesn't exist
if (FAILED(hr = _HrFindAccountPropertyMap(pszAccountId, &pMap, TRUE)))
goto exit;
if (FAILED(hr = ssProp.SetString(pszProp)))
goto exit;
// look for the property in the map
pPair = pMap->Find(cap);
if (NULL == pPair)
hr = pMap->Add(cap, ssProp);
else
pPair->m_value = ssProp;
exit:
LeaveCriticalSection(&g_csAccountPropCache);
return hr;
}
//----------------------------------------------------------------------
// CacheAccountPropStrA
//----------------------------------------------------------------------
BOOL GetAccountPropStrA(LPSTR pszAccountId,
CACHEDACCOUNTPROP cap,
LPSTR *ppszProp)
{
HRESULT hr = S_OK;
CAccountPropMap *pMap = NULL;
CAccountPropPair *pPair = NULL;
BOOL fResult = FALSE;
Assert(NULL != pszAccountId && NULL != ppszProp);
if (NULL == g_pAccountCache)
return FALSE;
if (NULL == pszAccountId || NULL == ppszProp)
return FALSE;
*ppszProp = NULL;
EnterCriticalSection(&g_csAccountPropCache);
// find the account property map. don't create one if it doesn't exist
if (FAILED(hr = _HrFindAccountPropertyMap(pszAccountId, &pMap, FALSE)))
goto exit;
if (NULL == pMap)
goto exit;
pPair = pMap->Find(cap);
if (NULL != pPair)
{
Assert(!pPair->m_value.IsNull());
if (!pPair->m_value.IsNull())
{
*ppszProp = PszDupA(pPair->m_value.GetString());
if (NULL != *ppszProp)
fResult = TRUE;
}
}
exit:
LeaveCriticalSection(&g_csAccountPropCache);
return fResult;
}
//----------------------------------------------------------------------
// AccountCache_AccountChanged
//----------------------------------------------------------------------
void AccountCache_AccountChanged(LPSTR pszAccountId)
{
// delete the data associated with the account that was changed
EnterCriticalSection(&g_csAccountPropCache);
if (NULL != g_pAccountCache)
{
CSimpleString ss;
if (SUCCEEDED(ss.SetString(pszAccountId)))
g_pAccountCache->Remove(ss);
}
LeaveCriticalSection(&g_csAccountPropCache);
}
//----------------------------------------------------------------------
// AccountCache_AccountDeleted
//----------------------------------------------------------------------
void AccountCache_AccountDeleted(LPSTR pszAccountId)
{
AccountCache_AccountChanged(pszAccountId);
}