//*************************************************************************** // // (c) 2001 by Microsoft Corp. All Rights Reserved. // //*************************************************************************** #ifndef __A51_OBJHEAP__H_ #define __A51_OBJHEAP__H_ #include "index.h" #include "VarObjHeap.h" typedef DWORD TOffset; typedef DWORD TPage; class CObjectHeap { protected: BOOL m_bInit; CVarObjHeap m_Heap; CBtrIndex m_Index; bool KeyRootInstancePath(const wchar_t *wszPath); public: CObjectHeap() :m_bInit(FALSE) {} virtual ~CObjectHeap(){} long Initialize(CPageSource * pAbstractSource, WCHAR * wszBaseName, DWORD dwBaseNameLen); long Uninitialize(DWORD dwShutDownFlags); //Transaction aborts require caches to be flushed and re-read void InvalidateCache(); long FlushCaches(); //File read/write methods long WriteObject(LPCWSTR wszFilePath1, LPCWSTR wszFilePath2, DWORD dwBufferLen, BYTE* pBuffer); long WriteLink(LPCWSTR wszLinkPath); long DeleteObject(LPCWSTR wszFilePath); long DeleteLink(LPCWSTR wszLinkPath); long DeleteNode(LPCWSTR wszNodeName); long ReadObject(LPCWSTR wszFilePath, DWORD* pdwBufferLen, BYTE** ppBuffer); long ReadNextIndex(CFileName &wszSearch, CFileName &wszNextIndex); // for the dump utility CBtrIndex * GetIndex(){ return &m_Index; }; CVarObjHeap * GetFileHeap(){ return &m_Heap; }; long ObjectEnumerationBegin(const wchar_t *wszSearchPrefix, void **ppHandle); long ObjectEnumerationEnd(void *pHandle); long ObjectEnumerationNext(void *pHandle, CFileName &wszFileName, BYTE **ppBlob, DWORD *pdwSize); long ObjectEnumerationFree(void *pHandle, BYTE *pBlob); long IndexEnumerationBegin(const wchar_t *wszSearchPrefix, void **ppHandle); long IndexEnumerationEnd(void *pHandle); long IndexEnumerationNext(void *pHandle, CFileName &wszFileName, bool bCopyFullPath = false); protected: long GetIndexFileName(LPCWSTR wszFilePath, CFileName& wszIndexFileName); long GetFileInfo(LPCWSTR wszFilePath, TPage *pnPage, TOffset* pnOffset, DWORD* pdwLength); long ParseInfoFromIndexFile(LPCWSTR wszIndexFileName, TPage *pnPage, TOffset* pnOffset, DWORD* pdwLength); long CreateIndexFile(LPCWSTR wszFilePath, TPage nPage, TOffset nOffset, DWORD dwLength); long DeleteIndexFile(LPCWSTR wszFilePath, LPCWSTR wszIndexFileName); long CreateZeroLengthFile(LPCWSTR wszFilePath); long DeleteZeroLengthFile(LPCWSTR wszFilePath); long WriteAllocation(DWORD dwDataLength, BYTE* pData, TPage *pnPage, TOffset *pnOffset); long WriteExistingAllocation(TPage nOldPage, TOffset nOldOffset, DWORD dwBufferLen, BYTE *pBuffer, DWORD *pnNewPage, DWORD *pnNewOffset); long ReadAllocation(TPage nPage, TOffset nOffset, DWORD dwDataLength, BYTE* pBuffer); }; #endif