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

104 lines
2.8 KiB
C++

/*++
Copyright (C) 2000-2001 Microsoft Corporation
--*/
#ifndef __WMI_A51_FILECACHE_H_
#define __WMI_A51_FILECACHE_H_
#include "stage.h"
#include <set>
#include <string>
class CFileCache
{
protected:
CCritSec m_cs;
WCHAR m_wszBaseName[MAX_PATH+1];
DWORD m_dwBaseNameLen;
CUniquePointerArray<CStagingFile> m_apStages;
CRealStagingFile* m_pMainStage;
long m_lRef;
public:
class CFileEnumerator
{
protected:
CFileCache* m_pCache;
WCHAR m_wszPrefix[MAX_PATH+1];
DWORD m_dwPrefixDirLen;
int m_nCurrentStage;
bool m_bUseFiles;
void* m_pStageEnumerator;
HANDLE m_hFileEnum;
std::set<WString, WSiless> m_setSent;
DWORD m_dwBaseNameLen;
public:
CFileEnumerator(CFileCache* pCache, DWORD dwBaseNameLen)
: m_pCache(pCache), m_nCurrentStage(-1), m_pStageEnumerator(NULL),
m_hFileEnum(NULL), m_dwBaseNameLen(dwBaseNameLen)
{}
~CFileEnumerator();
long GetFirst(LPCWSTR wszPrefix, WIN32_FIND_DATAW* pfd);
long GetFirstFile(WIN32_FIND_DATAW* pfd);
void ComputeCanonicalName(WIN32_FIND_DATAW* pfd, wchar_t *wszFilePath);
long GetNext(WIN32_FIND_DATAW* pfd);
long GetRawNext(WIN32_FIND_DATAW* pfd);
};
friend CFileEnumerator;
class CFindCloseMe
{
protected:
CFileCache* m_pCache;
void* m_hSearch;
public:
CFindCloseMe(CFileCache* pCache, void* hSearch)
: m_pCache(pCache), m_hSearch(hSearch){}
~CFindCloseMe()
{
if(m_pCache && m_hSearch) m_pCache->FindClose(m_hSearch);
}
};
protected:
int GetNumStages() {return m_apStages.GetSize();}
INTERNAL CStagingFile* GetStageFile(int nIndex) {return m_apStages[nIndex];}
INTERNAL CStagingFile* GetMainStagingFile() {return m_pMainStage;}
public:
CFileCache();
~CFileCache();
void Clear();
bool IsFullyFlushed();
long Initialize(LPCWSTR wszBaseName);
long RepositoryExists(LPCWSTR wszBaseName);
long WriteFile(LPCWSTR wszFileName, DWORD dwLen, BYTE* pBuffer);
long ReadFile(LPCWSTR wszFileName, DWORD* pdwLen, BYTE** ppBuffer,
bool bMustBeThere = false);
long DeleteFile(LPCWSTR wszFileName);
long RemoveDirectory(LPCWSTR wszFileName, bool bMustSucceed = true);
long FindFirst(LPCWSTR wszFilePrefix, WIN32_FIND_DATAW* pfd,
void** ppHandle);
long FindNext(void* pHandle, WIN32_FIND_DATAW* pfd);
void FindClose(void* pHandle);
long BeginTransaction();
long CommitTransaction();
long AbortTransaction();
CCritSec* GetLock() {return &m_cs;}
long AddRef() {return InterlockedIncrement(&m_lRef);}
long Release() {long lRet = InterlockedDecrement(&m_lRef); if (!lRet) delete this; return lRet;}
};
#endif