windows-nt/Source/XPSP1/NT/enduser/stuff/itss/freelist.h
2020-09-26 16:20:57 +08:00

150 lines
4.3 KiB
C++

// FreeList.h -- Definition of CFreeList class and IFreeList interface.
#ifndef __FREELIST_H__
#define __FREELIST_H__
/*
This file defines the interface to the free-space manager for the Tome file. It's
done as a subclass of IPersistStreamInit so that different free list implementations
can be bound to particular Tome files automatically.
Its public methods allow you to:
1. Add a segment of LockBytes address space to the free space
2. Allocate address space from available free space
3. Attempt an allocation beginning at a particular address
4. Allocate address space at the end of the LockBytes container.
*/
#undef GetFreeSpace // kill the obsolete Win16 macro before we
// encounter the IFreeList definition...
class CFreeList : public CITUnknown
{
public:
~CFreeList();
static HRESULT CreateFreeList(IITFileSystem *pITFS, CULINT cbPreallocated, IITFreeList **ppITFreeList);
static HRESULT CreateAndSizeFreeList(IITFileSystem *pITFS, CULINT cbPreallocated, UINT cSlots, IITFreeList **ppITFreeList);
static HRESULT LoadFreeList(IITFileSystem *pITFS, IITFreeList **ppITFreeList);
static HRESULT AttachFreeList(IITFileSystem *pITFS, IITFreeList **ppITFreeList);
private:
CFreeList(IUnknown *punkOuter);
class CImpIFreeList : public IITFreeList
{
public:
CImpIFreeList(CFreeList *pBackObj, IUnknown *punkOuter);
~CImpIFreeList(void);
HRESULT ReadIn (LPSTREAM pStm, PVOID pv, ULONG cb);
HRESULT WriteOut(LPSTREAM pStm, PVOID pv, ULONG cb);
// IPersist Method:
HRESULT STDMETHODCALLTYPE GetClassID(
/* [out] */ CLSID __RPC_FAR *pClassID);
// IPersistStreamInit Methods:
HRESULT STDMETHODCALLTYPE IsDirty( void);
HRESULT STDMETHODCALLTYPE Load(
/* [in] */ LPSTREAM pStm);
HRESULT STDMETHODCALLTYPE Save(
/* [in] */ LPSTREAM pStm,
/* [in] */ BOOL fClearDirty);
HRESULT STDMETHODCALLTYPE GetSizeMax(
/* [out] */ ULARGE_INTEGER __RPC_FAR *pCbSize);
HRESULT STDMETHODCALLTYPE InitNew( void);
// IFreeList Methods:
HRESULT STDMETHODCALLTYPE InitNew(IITFileSystem *pITFS, CULINT cbPreallocated);
HRESULT STDMETHODCALLTYPE InitNew(IITFileSystem *pITFS, CULINT cbPreallocated, UINT cEntriesMax);
HRESULT STDMETHODCALLTYPE InitLoad(IITFileSystem *pITFS);
HRESULT STDMETHODCALLTYPE LazyInitNew(IITFileSystem *pITFS);
HRESULT STDMETHODCALLTYPE RecordFreeList();
HRESULT STDMETHODCALLTYPE PutFreeSpace(CULINT ullBase, CULINT ullCB);
HRESULT STDMETHODCALLTYPE GetFreeSpace(CULINT *pullBase, CULINT *pullcb);
HRESULT STDMETHODCALLTYPE GetFreeSpaceAt(CULINT ullBase, CULINT *pullcb);
HRESULT STDMETHODCALLTYPE GetEndingFreeSpace
(CULINT *pullBase, CULINT *pullcb);
HRESULT STDMETHODCALLTYPE GetStatistics
(CULINT *pcbLost, CULINT *pcbSpace);
HRESULT STDMETHODCALLTYPE SetFreeListEmpty();
HRESULT STDMETHODCALLTYPE SetSpaceSize(ULARGE_INTEGER uliCbSpace);
private:
UINT HighestEntryLEQ(CULINT &ullBase);
HRESULT STDMETHODCALLTYPE ConnectToStream();
typedef struct _freeitem
{
CULINT ullOffset; // Start of free block
CULINT ullCB; // Size of free block in bytes
} FREEITEM, *PFREEITEM;
enum { DEFAULT_ENTRIES_MAX = 510 };
CITCriticalSection m_cs;
BOOL m_fInitialed;
BOOL m_fIsDirty;
UINT m_cBlocks; // Number of blocks in list
UINT m_cBlocksMax; // Max number of blocks in list
CULINT m_cbLost; // Number of bytes totally lost forever
CULINT m_cbSpace;
BOOL m_fDirty;
IITFileSystem *m_pITFS;
DEBUGDEF(CULINT m_cbPreallocated)
PFREEITEM m_paFreeItems;
};
friend CImpIFreeList;
CImpIFreeList m_ImpIFreeList;
};
typedef CFreeList *PCFreelist;
extern GUID aIID_CFreeList[4];
extern UINT cInterfaces_CFreeList;
inline CFreeList::CFreeList(IUnknown * punkOuter)
: m_ImpIFreeList(this, punkOuter),
CITUnknown(aIID_CFreeList, cInterfaces_CFreeList, (IUnknown *)&m_ImpIFreeList)
{
}
inline CFreeList::~CFreeList
()
{
}
#endif // __FREELIST_H__