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

197 lines
5.8 KiB
C++

//depot/private/wmi_branch2/admin/wmi/wbem/winmgmt/xfiles/filecach.h#8 - edit change 28793 (text)
/*++
Copyright (C) 2000-2001 Microsoft Corporation
--*/
#ifndef __WMI_A51_FILECACHE_H_
#define __WMI_A51_FILECACHE_H_
#include <set>
#include <string>
extern bool g_bShuttingDown;
#include "pagemgr.h"
#include "a51tools.h"
#include "objheap.h"
#include "index.h"
class CFileCache
{
protected:
long m_lRef;
BOOL m_bInit;
CPageSource m_TransactionManager;
CObjectHeap m_ObjectHeap;
DWORD m_dwBaseNameLen;
WCHAR m_wszBaseName[MAX_PATH+1]; // be debugger friendly, live it last
public:
protected:
public:
CFileCache();
~CFileCache();
private:
void Clear(DWORD dwShutDownFlags)
{
m_ObjectHeap.Uninitialize(dwShutDownFlags);
m_TransactionManager.Shutdown(dwShutDownFlags);
}
public:
long Flush()
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_TransactionManager.Checkpoint();
}
long RollbackCheckpoint()
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_TransactionManager.CheckpointRollback();
}
long RollbackCheckpointIfNeeded()
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (m_TransactionManager.GetStatus())
return m_TransactionManager.CheckpointRollback();
else
return 0;
}
long Initialize(LPCWSTR wszBaseName);
long Uninitialize(DWORD dwShutDownFlags);
private:
long InnerInitialize(LPCWSTR wszBaseName);
long RepositoryExists(LPCWSTR wszBaseName);
public:
//Write 1 or 2 indexes pointing to the object in the object store
long WriteObject(LPCWSTR wszFileName1, LPCWSTR wszFileName2, DWORD dwLen, BYTE* pBuffer)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.WriteObject(wszFileName1, wszFileName2, dwLen, pBuffer);
}
//Writes a link and no object
long WriteLink(LPCWSTR wszLinkName)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.WriteLink(wszLinkName);
}
//Retrieve a buffer based on the index
HRESULT ReadObject(LPCWSTR wszFileName, DWORD* pdwLen, BYTE** ppBuffer, bool bMustBeThere = false)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.ReadObject(wszFileName, pdwLen, ppBuffer);
}
//Deletion of an object deletes the link also
long DeleteObject(LPCWSTR wszFileName)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.DeleteObject(wszFileName);
}
//Deletion of a link does not touch the object heap
long DeleteLink(LPCWSTR wszLinkName)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.DeleteLink(wszLinkName);
}
long BeginTransaction()
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_TransactionManager.BeginTrans();
}
long CommitTransaction()
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_TransactionManager.CommitTrans();
}
long AbortTransaction()
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
long lRes = m_TransactionManager.RollbackTrans();
if(lRes != ERROR_SUCCESS) return lRes;
m_ObjectHeap.InvalidateCache();
return ERROR_SUCCESS;
}
long AddRef() {return InterlockedIncrement(&m_lRef);}
long Release() {long lRet = InterlockedDecrement(&m_lRef); if (!lRet) delete this;return lRet;}
//Object enumeration methods that allow us to enumerate a set of objects and the
//result is the heap object itself rather than just the path
long ObjectEnumerationBegin(const wchar_t *wszSearchPrefix, void **ppHandle)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.ObjectEnumerationBegin(wszSearchPrefix, ppHandle);
}
long ObjectEnumerationEnd(void *pHandle)
{
if (!m_bInit)return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.ObjectEnumerationEnd(pHandle);
}
long ObjectEnumerationNext(void *pHandle, CFileName &wszFileName, BYTE **ppBlob, DWORD *pdwSize)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.ObjectEnumerationNext(pHandle, wszFileName, ppBlob, pdwSize);
}
long ObjectEnumerationFree(void *pHandle, BYTE *pBlob)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.ObjectEnumerationFree(pHandle, pBlob);
}
//Index enumeration methods for iterating through the index
long IndexEnumerationBegin(const wchar_t *wszSearchPrefix, void **ppHandle)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.IndexEnumerationBegin(wszSearchPrefix, ppHandle);
}
long IndexEnumerationEnd(void *pHandle)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.IndexEnumerationEnd(pHandle);
}
long IndexEnumerationNext(void *pHandle, CFileName &wszFileName)
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
return m_ObjectHeap.IndexEnumerationNext(pHandle, wszFileName);
}
long EmptyCaches()
{
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
long lRes = m_TransactionManager.EmptyCaches();
if (lRes == 0)
lRes = m_ObjectHeap.FlushCaches();
return lRes;
}
};
#endif