windows-nt/Source/XPSP1/NT/admin/snapin/adsiedit/schemacache.cpp
2020-09-26 16:20:57 +08:00

210 lines
5.4 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: schemacache.cpp
//
//--------------------------------------------------------------------------
#include "pch.h"
#include "schemacache.h"
//+--------------------------------------------------------------------------
//
// Member: CADSIEditSchemaCache::Lookup
//
// Synopsis: Gets the cache item identified by the given class name
//
// Arguments: [pszClass - IN] : the name of the class to retrieve the
// cache information for
// [refpItem - OUT] : reference to a pointer that will receive
// the cached item
//
// Returns: bool : true if the cache contained the item
//
// History: 27-Nov-2000 JeffJon Created
//
//---------------------------------------------------------------------------
CADSIEditClassCacheItemBase* CADSIEditSchemaCache::FindClassCacheItem(CCredentialObject* pCredObject,
PCWSTR pszClass,
PCWSTR pszSchemaPath)
{
_Lock();
CADSIEditClassCacheItemBase* pCacheSchemaItem = 0;
do // false while
{
BOOL bFound = m_Map.Lookup(pszClass, pCacheSchemaItem);
if (!bFound)
{
TRACE(_T("Cache miss: %s\n"), pszClass);
HRESULT hr = S_OK;
CComPtr<IADsClass> spClass;
hr = OpenObjectWithCredentials(pCredObject,
pszSchemaPath,
IID_IADsClass,
(void**)&spClass);
if ( FAILED(hr) )
{
TRACE(_T("Bind failed in IsContainer() because hr=0x%x\n"), hr);
break;
}
short bContainer = 0;
hr = spClass->get_Container( &bContainer );
if (FAILED(hr))
{
TRACE(_T("IADsClass::get_Container() failed. hr=0x%x\n"), hr);
}
pCacheSchemaItem = new CADSIEditClassCacheItemBase(pszClass, bContainer ? true : false);
if (pCacheSchemaItem)
{
//
// set in the cache
//
m_Map.SetAt(pszClass, pCacheSchemaItem);
}
else
{
ASSERT(pCacheSchemaItem);
break;
}
}
} while (false);
_Unlock();
return pCacheSchemaItem;
}
//+--------------------------------------------------------------------------
//
// Member: CADSIEditSchemaCache::Lookup
//
// Synopsis: Gets the cache item identified by the given class name
//
// Arguments: [pszClass - IN] : the name of the class to retrieve the
// cache information for
// [refpItem - OUT] : reference to a pointer that will receive
// the cached item
//
// Returns: bool : true if the cache contained the item
//
// History: 27-Nov-2000 JeffJon Created
//
//---------------------------------------------------------------------------
BOOL CADSIEditSchemaCache::Lookup(PCWSTR pszClass, CADSIEditClassCacheItemBase*& refpItem)
{
_Lock();
BOOL b = m_Map.Lookup(pszClass, refpItem);
_Unlock();
return b;
}
//+--------------------------------------------------------------------------
//
// Member: CADSIEditSchemaCache::Initialize
//
// Synopsis: Initializes the critical section and cleans out the cache
//
// Arguments:
//
// Returns: HRESULT : S_OK if initialization succeeded
//
// History: 27-Nov-2000 JeffJon Created
//
//---------------------------------------------------------------------------
HRESULT CADSIEditSchemaCache::Initialize()
{
HRESULT hr = S_OK;
ExceptionPropagatingInitializeCriticalSection(&m_cs);
_Lock();
_Cleanup();
_Unlock();
return hr;
}
//+--------------------------------------------------------------------------
//
// Member: CADSIEditSchemaCache::Destroy
//
// Synopsis: Cleans out the cache and deletes the critical section
//
// Arguments:
//
// Returns: HRESULT : S_OK if everything was deleted successfully
//
// History: 27-Nov-2000 JeffJon Created
//
//---------------------------------------------------------------------------
HRESULT CADSIEditSchemaCache::Destroy()
{
HRESULT hr = S_OK;
_Lock();
_Cleanup();
_Unlock();
//
// REVIEW_JEFFJON : need to add exception handling here
//
::DeleteCriticalSection(&m_cs);
return hr;
}
//+--------------------------------------------------------------------------
//
// Member: CADSIEditSchemaCache::Clear
//
// Synopsis: Cleans out the cache
//
// Arguments:
//
// Returns:
//
// History: 27-Nov-2000 JeffJon Created
//
//---------------------------------------------------------------------------
void CADSIEditSchemaCache::Clear()
{
_Lock();
_Cleanup();
_Unlock();
}
//+--------------------------------------------------------------------------
//
// Member: CADSIEditSchemaCache::_Cleanup
//
// Synopsis: Removes all entries from the map and deletes them
//
// Arguments:
//
// Returns:
//
// History: 27-Nov-2000 JeffJon Created
//
//---------------------------------------------------------------------------
void CADSIEditSchemaCache::_Cleanup()
{
CString Key;
CADSIEditClassCacheItemBase* pCacheItem = NULL;
POSITION pos = m_Map.GetStartPosition();
while (!m_Map.IsEmpty())
{
m_Map.GetNextAssoc (pos, Key, pCacheItem);
m_Map.RemoveKey (Key);
delete pCacheItem;
}
}