mirror of https://github.com/tongzx/nt5src
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.
248 lines
5.1 KiB
248 lines
5.1 KiB
//***************************************************************************
|
|
//
|
|
// (c) 1999-2001 by Microsoft Corp. All Rights Reserved.
|
|
//
|
|
// objcache.cpp
|
|
//
|
|
// cvadai 19-Mar-99 Created as prototype for Quasar.
|
|
//
|
|
//***************************************************************************
|
|
|
|
#define _REPDRVR_CPP_
|
|
#pragma warning( disable : 4786 ) // identifier was truncated to 'number' characters in the
|
|
#pragma warning( disable : 4251 ) // needs to have dll-interface to be used by clients of class
|
|
|
|
#define _WIN32_DCOM
|
|
|
|
#include "precomp.h"
|
|
#include <comutil.h>
|
|
#include <map>
|
|
#include <reposit.h>
|
|
#include <wbemcli.h>
|
|
#include <objcache.h>
|
|
#include <corepol.h>
|
|
#include <crc64.h>
|
|
|
|
#ifndef CHASHCACHE_INLINED
|
|
typedef std::map <SQL_ID, void *> CacheInfo;
|
|
|
|
CRITICAL_SECTION g_csCache;
|
|
|
|
class _WMILockit
|
|
{
|
|
public:
|
|
_WMILockit();
|
|
~_WMILockit();
|
|
};
|
|
|
|
|
|
_WMILockit::_WMILockit()
|
|
{
|
|
EnterCriticalSection(&g_csCache);
|
|
}
|
|
|
|
_WMILockit::~_WMILockit()
|
|
{
|
|
LeaveCriticalSection(&g_csCache);
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CHashCache::CHashCache
|
|
//
|
|
//***************************************************************************
|
|
|
|
CHashCache::CHashCache()
|
|
{
|
|
if (!g_csCache.DebugInfo)
|
|
InitializeCriticalSection(&g_csCache);
|
|
|
|
}
|
|
//***************************************************************************
|
|
//
|
|
// CHashCache::~CHashCache
|
|
//
|
|
//***************************************************************************
|
|
CHashCache::~CHashCache()
|
|
{
|
|
Empty();
|
|
if (!g_csCache.DebugInfo)
|
|
DeleteCriticalSection(&g_csCache);
|
|
}
|
|
//***************************************************************************
|
|
//
|
|
// CHashCache::Insert
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CHashCache::Insert(SQL_ID dId, void *pUnk)
|
|
{
|
|
_WMILockit _Lk;
|
|
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
void *pTmp = m_info[dId];
|
|
if (pTmp != pUnk)
|
|
delete pTmp;
|
|
|
|
m_info[dId] = pUnk;
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CHashCache::Delete
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CHashCache::Delete(SQL_ID dId)
|
|
{
|
|
_WMILockit _Lk;
|
|
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
delete m_info[dId];
|
|
m_info[dId] = NULL;
|
|
CacheInfo::iterator it = m_info.find(dId);
|
|
if (it != m_info.end())
|
|
m_info.erase(it);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CHashCache::Exists
|
|
//
|
|
//***************************************************************************
|
|
|
|
bool CHashCache::Exists (SQL_ID dId)
|
|
{
|
|
_WMILockit _Lk;
|
|
|
|
bool bRet = false;
|
|
|
|
CacheInfo::iterator it = m_info.find(dId);
|
|
if (it != m_info.end())
|
|
bRet = true;
|
|
|
|
return bRet;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CHashCache::Get
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CHashCache::Get(SQL_ID dId, void **ppObj)
|
|
{
|
|
_WMILockit _Lk;
|
|
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
CacheInfo::iterator it = m_info.find(dId);
|
|
if (it != m_info.end())
|
|
{
|
|
*ppObj = (*it).second;
|
|
}
|
|
else
|
|
hr = WBEM_E_NOT_FOUND;
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CHashCache::FindFirst
|
|
//
|
|
//***************************************************************************
|
|
|
|
CListElement *CHashCache::FindFirst()
|
|
{
|
|
_WMILockit _Lk;
|
|
CListElement *pRet = NULL;
|
|
|
|
CacheInfo::iterator it = m_info.begin();
|
|
while (it != m_info.end())
|
|
{
|
|
if ((*it).second)
|
|
{
|
|
pRet = new CListElement;
|
|
if (pRet)
|
|
{
|
|
pRet->m_dId = (*it).first;
|
|
pRet->m_pObj = (*it).second;
|
|
}
|
|
break;
|
|
}
|
|
|
|
it++;
|
|
}
|
|
|
|
return pRet;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CHashCache::FindNext
|
|
//
|
|
//***************************************************************************
|
|
|
|
CListElement *CHashCache::FindNext(SQL_ID dId)
|
|
{
|
|
_WMILockit _Lk;
|
|
CListElement *pRet = NULL;
|
|
|
|
CacheInfo::iterator it = m_info.find(dId);
|
|
|
|
if (it == m_info.end())
|
|
{
|
|
it = m_info.begin();
|
|
while ((*it).first < dId)
|
|
{
|
|
it++;
|
|
if (it == m_info.end())
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (it != m_info.end())
|
|
it++;
|
|
|
|
while (it != m_info.end())
|
|
{
|
|
if ((*it).second)
|
|
{
|
|
pRet = new CListElement;
|
|
if (pRet)
|
|
{
|
|
pRet->m_dId = (*it).first;
|
|
pRet->m_pObj = (*it).second;
|
|
}
|
|
break;
|
|
}
|
|
it++;
|
|
}
|
|
|
|
return pRet;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CHashCache::Empty
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CHashCache::Empty()
|
|
{
|
|
_WMILockit _Lk;
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
m_info.clear();
|
|
|
|
return hr;
|
|
}
|
|
|
|
#endif
|