windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/roswell/index.h
2020-09-26 16:20:57 +08:00

146 lines
3.7 KiB
C++

#ifndef __A51_INDEX__H_
#define __A51_INDEX__H_
#include "heap.h"
#include "btr.h"
class CAbstractIndex
{
public:
virtual ~CAbstractIndex(){}
virtual long Create(LPCWSTR wszFileName) = 0;
virtual long Delete(LPCWSTR wszFileName) = 0;
virtual long FindFirst(LPCWSTR wszPrefix, WIN32_FIND_DATAW* pfd,
void** ppHandle) = 0;
virtual long FindNext(void* pHandle, WIN32_FIND_DATAW* pfd) = 0;
virtual long FindClose(void* pHandle) = 0;
};
typedef DWORD TDirectoryId;
#define ROSWELL_MAX_COMPONENT_LENGTH 50
#define ROSWELL_MAX_PREFIX_LENGTH ROSWELL_MAX_COMPONENT_LENGTH
struct CFileKey
{
TDirectoryId m_nDirectoryId;
char m_szComponentName[ROSWELL_MAX_COMPONENT_LENGTH];
};
struct CFileValue
{
TDirectoryId m_nId;
TOffset m_nOffset;
DWORD m_dwLength;
};
class CFileKeyCompare
{
public:
bool operator()(const CFileKey& keyFirst, const CFileKey& keySecond) const
{
if(keyFirst.m_nDirectoryId != keySecond.m_nDirectoryId)
return (keyFirst.m_nDirectoryId < keySecond.m_nDirectoryId);
else
return (strcmp(keyFirst.m_szComponentName,
keySecond.m_szComponentName) < 0);
}
};
class CIndex : public CAbstractIndex
{
public:
CFileHeap* m_pHeap;
CCritSec m_cs;
DWORD m_dwPrefixLength;
TDirectoryId m_nNextId;
typedef std::map<CFileKey, CFileValue, CFileKeyCompare> TDirectoryMap;
typedef TDirectoryMap::iterator TDirectoryIterator;
TDirectoryMap m_map;
public:
CIndex(CFileHeap* pHeap)
: m_pHeap(pHeap), m_nNextId(1), m_dwPrefixLength(0)
{}
long Initialize(DWORD dwPrefixLength);
long Create(LPCWSTR wszFileName);
long Delete(LPCWSTR wszFileName);
long FindFirst(LPCWSTR wszPrefix, WIN32_FIND_DATAW* pfd, void** ppHandle);
long FindNext(void* pHandle, WIN32_FIND_DATAW* pfd);
long FindClose(void* pHandle);
protected:
long ConvertInputToAscii(LPCWSTR wszFileName, char* szFileName);
long CreateRecord(TDirectoryId nParentId, char* szComponentName,
TDirectoryId* pnChildId);
TDirectoryId GetNewDirectoryId();
friend class CIndexIterator;
};
class CIndexIterator
{
protected:
CIndex::TDirectoryMap& m_rMap;
CIndex::TDirectoryIterator m_it;
TDirectoryId m_nParentId;
char m_szPrefix[ROSWELL_MAX_PREFIX_LENGTH];
long m_lPrefixLen;
public:
CIndexIterator(TDirectoryId nParentId, char* szPrefix,
CIndex::TDirectoryIterator it, CIndex::TDirectoryMap& rMap);
long FindNext(WIN32_FIND_DATAW* pfd);
};
class COldIndex : public CAbstractIndex
{
public:
COldIndex(CFileHeap* pHeap){}
long Initialize(bool bNewFile, DWORD dwPrefixLength);
long Create(LPCWSTR wszFileName);
long Delete(LPCWSTR wszFileName);
long FindFirst(LPCWSTR wszPrefix, WIN32_FIND_DATAW* pfd, void** ppHandle);
long FindNext(void* pHandle, WIN32_FIND_DATAW* pfd);
long FindClose(void* pHandle);
};
class CBtrIndex : public CAbstractIndex
{
DWORD m_dwPrefixLength;
CRITICAL_SECTION m_cs;
CBTree bt;
CPageSource ps;
BOOL CopyStringToWIN32_FIND_DATA(
LPSTR pszSource,
WIN32_FIND_DATAW* pfd
);
public:
CBtrIndex();
~CBtrIndex();
long Shutdown(DWORD dwShutDownFlags);
long Initialize(DWORD dwPrefixLength, LPCWSTR wszRepositoryDir,
CAbstractFileSource* pSource );
long Create(LPCWSTR wszFileName);
long Delete(LPCWSTR wszFileName);
long FindFirst(LPCWSTR wszPrefix, WIN32_FIND_DATAW* pfd, void** ppHandle);
long FindNext(void* pHandle, WIN32_FIND_DATAW* pfd);
long FindClose(void* pHandle);
long InvalidateCache();
CBTree& GetTree() {return bt;}
};
#endif