|
|
// 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__
|