//+-------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1992 // // File: dfbasis.hxx // // Contents: DocFile basis block class // // Classes: CDFBasis // // History: 26-Feb-92 DrewB Created // //--------------------------------------------------------------- #ifndef __DFBASIS_HXX__ #define __DFBASIS_HXX__ #include #include #include #include interface ILockBytes; class CPubDocFile; class CDocFile; SAFE_DFBASED_PTR(CBasedPubDocFilePtr, CPubDocFile); //+-------------------------------------------------------------- // // Class: CDFBasis (dfb) // // Purpose: Defines base variables for sharing between exposed // DocFiles // // History: 26-Feb-92 DrewB Created // 18-May-93 AlexT Added CMallocBased // //--------------------------------------------------------------- typedef enum { CDFB_DIRECTDOCFILE = 0, CDFB_DIRECTSTREAM = 1, CDFB_WRAPPEDDOCFILE = 2, CDFB_TRANSACTEDSTREAM = 3 } CDFB_CLASSTYPE; #define CDFB_CLASSCOUNT 4 class CDFBasis : public CMallocBased { public: inline CDFBasis(IMalloc * const pMalloc, DFLAGS df, DWORD dwLockFlags, CGlobalContext *pgc); inline ~CDFBasis(void); void vRelease(void); inline void vAddRef(void); inline void SetAccess(CPerContext *ppc); inline void ClearAccess(void); inline ULONG CountContexts(void); inline ILockBytes **GetPBase(void); inline ILockBytes *GetBase(void); inline CFileStream **GetPDirty(void); inline CFileStream *GetDirty(void); inline ILockBytes *GetOriginal(void); inline void SetBase(ILockBytes *plkb); inline void SetDirty(CFileStream *pfst); inline void SetOriginal(ILockBytes *plkb); inline void SetContext(CPerContext *ppc); inline DWORD GetOrigLockFlags(void); inline ULONG GetNewTemp(void); inline DFSIGNATURE GetNewSig(void); inline CMStream *GetScratch(void); inline void SetScratch(CMStream *pms); inline CMStream *GetBaseMultiStream(void); inline void SetBaseMultiStream(CMStream *pms); inline CPubDocFile *GetCopyBase(void); inline void SetCopyBase(CPubDocFile *pdf); inline CFreeList *GetFreeList(CDFB_CLASSTYPE classtype); inline SCODE Reserve(UINT cItems, CDFB_CLASSTYPE classtype); inline void CDFBasis::Unreserve(UINT cItems, CDFB_CLASSTYPE classtype); inline DFLAGS GetOpenFlags(void); inline IMalloc *GetMalloc(void); #ifdef DIRECTWRITERLOCK HRESULT WaitForWriteAccess (DWORD dwTimeout, CGlobalContext *pgc); HRESULT ReleaseWriteAccess (); inline BOOL DirectWriterMode (); inline BOOL HaveWriteAccess (); #endif private: CBasedMStreamPtr _pms; CBasedMStreamPtr _pmsScratch; DFLAGS const _dfOpen; ILockBytes *_plkbBase; CFileStream *_pfstDirty; ILockBytes *_plkbOriginal; LONG _cReferences; ULONG _cTemps; DFSIGNATURE _cSigs; CBasedPubDocFilePtr _pdfCopyBase; CBasedGlobalContextPtr _pgcGlobalContext; DWORD _dwOrigLocks; CFreeList _afrl[CDFB_CLASSCOUNT]; static size_t _aReserveSize[CDFB_CLASSCOUNT]; #ifdef DIRECTWRITERLOCK HRESULT TryReadLocks (CGlobalContext *pgc, ULONG ulMask); BOOL _fDirectWriterMode; BOOL _fWriteLocked; #endif IMalloc * const _pMalloc; }; SAFE_DFBASED_PTR(CBasedDFBasisPtr, CDFBasis); //+-------------------------------------------------------------- // // Member: CDFBasis::CDFBasis, public // // Synopsis: Constructor // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline CDFBasis::CDFBasis(IMalloc * const pMalloc, DFLAGS df, DWORD dwLockFlags, CGlobalContext *pgc) : _pMalloc(pMalloc), _dfOpen(df) { _cReferences = 1; _cTemps = 0; _cSigs = 0; _pdfCopyBase = NULL; _plkbBase = NULL; _pfstDirty = NULL; _plkbOriginal = NULL; _dwOrigLocks = dwLockFlags; _pms = NULL; _pmsScratch = NULL; #ifdef DIRECTWRITERLOCK _fDirectWriterMode = P_READWRITE(df) && !P_TRANSACTED(df) && !P_DENYREAD(df) && P_DENYWRITE(df); _fWriteLocked = FALSE; #endif _pgcGlobalContext = pgc; _pgcGlobalContext->AddRef(); } //+-------------------------------------------------------------- // // Member: CDFBasis::~CDFBasis, public // // Synopsis: Destructor // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline CDFBasis::~CDFBasis(void) { delete BP_TO_P(CMStream *, _pmsScratch); _pgcGlobalContext->Release(); msfAssert(_cReferences == 0); } //+-------------------------------------------------------------- // // Member: CDFBasis::AddRef, public // // Synopsis: Increase reference count // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline void CDFBasis::vAddRef(void) { InterlockedIncrement(&_cReferences); } //+-------------------------------------------------------------- // // Member: CDFBasis::SetAccess, public // // Synopsis: Takes semaphore and sets pointers // // Arguments: [ppc] - Context // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline void CDFBasis::SetAccess(CPerContext *ppc) { SetContext(ppc); } //+-------------------------------------------------------------- // // Member: CDFBasis::ClearAccess, public // // Synopsis: Releases semaphore and resets pointers // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline void CDFBasis::ClearAccess(void) { #if DBG == 1 _plkbBase = NULL; _pfstDirty = NULL; #endif } //+-------------------------------------------------------------- // // Member: CDFBasis::GetPBase, public // // Synopsis: Returns a pointer to _plstBase // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline ILockBytes **CDFBasis::GetPBase(void) { return &_plkbBase; } //+-------------------------------------------------------------- // // Member: CDFBasis::GetPDirty, public // // Synopsis: Returns a pointer to _plstDirty // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline CFileStream **CDFBasis::GetPDirty(void) { return &_pfstDirty; } //+-------------------------------------------------------------- // // Member: CDFBasis::GetBase, public // // Synopsis: Returns _plstBase // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline ILockBytes *CDFBasis::GetBase(void) { return _plkbBase; } //+-------------------------------------------------------------- // // Member: CDFBasis::SetBase, public // // Synopsis: Sets the base // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline void CDFBasis::SetBase(ILockBytes *plkb) { _plkbBase = plkb; } //+-------------------------------------------------------------- // // Member: CDFBasis::GetDirty, public // // Synopsis: Returns _plstDirty // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline CFileStream *CDFBasis::GetDirty(void) { return _pfstDirty; } //+-------------------------------------------------------------- // // Member: CDFBasis::SetDirty, public // // Synopsis: Sets the Dirty // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline void CDFBasis::SetDirty(CFileStream *pfst) { _pfstDirty = pfst; } //+-------------------------------------------------------------- // // Member: CDFBasis::GetOriginal, public // // Synopsis: Returns _plstOriginal // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline ILockBytes *CDFBasis::GetOriginal(void) { return _plkbOriginal; } //+-------------------------------------------------------------- // // Member: CDFBasis::SetOriginal, public // // Synopsis: Sets the Original // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline void CDFBasis::SetOriginal(ILockBytes *plkb) { _plkbOriginal = plkb; } //+-------------------------------------------------------------- // // Member: CDFBasis::SetContext, public // // Synopsis: Sets the context // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline void CDFBasis::SetContext(CPerContext *ppc) { _plkbBase = ppc->GetBase(); _pfstDirty = ppc->GetDirty(); _plkbOriginal = ppc->GetOriginal(); } //+-------------------------------------------------------------- // // Member: CDFBasis::GetContextCount, public // // Synopsis: Returns the number of contexts. This can be compared against // The number of locks on the file to determine if there are any // seperate opens. // // History: 17-Mar-97 BChapman Created // //--------------------------------------------------------------- inline ULONG CDFBasis::CountContexts(void) { return _pgcGlobalContext->CountContexts(); } //+-------------------------------------------------------------- // // Member: CDFBasis::GetNewTemp, public // // Synopsis: Return _cTemps++ // // History: 03-Mar-92 DrewB Created // //--------------------------------------------------------------- inline ULONG CDFBasis::GetNewTemp(void) { return _cTemps++; } //+-------------------------------------------------------------- // // Member: CDFBasis::GetNewSig, public // // Synopsis: Return _cSigs++ // // History: 03-Mar-92 DrewB Created // //--------------------------------------------------------------- inline DFSIGNATURE CDFBasis::GetNewSig(void) { return _cSigs++; } //+-------------------------------------------------------------- // // Member: CDFBasis::GetCopyBase, public // // Synopsis: Returns _pdfCopyBase // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline CPubDocFile *CDFBasis::GetCopyBase(void) { return BP_TO_P(CPubDocFile *, _pdfCopyBase); } //+-------------------------------------------------------------- // // Member: CDFBasis::SetCopyBase, public // // Synopsis: Sets _pdfCopyBase // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline void CDFBasis::SetCopyBase(CPubDocFile *pdf) { _pdfCopyBase = P_TO_BP(CBasedPubDocFilePtr, pdf); } //+-------------------------------------------------------------- // // Member: CDFBasis::GetScratch, public // // Synopsis: Returns handle to scratch multistream // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline CMStream * CDFBasis::GetScratch(void) { return BP_TO_P(CMStream *, _pmsScratch); } //+-------------------------------------------------------------- // // Member: CDFBasis::SetScratch, public // // Synopsis: Sets scratch MS // // History: 02-Mar-92 DrewB Created // //--------------------------------------------------------------- inline void CDFBasis::SetScratch(CMStream *pms) { _pmsScratch = P_TO_BP(CBasedMStreamPtr, pms); } //+-------------------------------------------------------------- // // Member: CDFBasis::GetBaseMultiStream, public // // Synopsis: Returns pointer to base multistream // // History: 25-Feb-95 PhilipLa Created // //--------------------------------------------------------------- inline CMStream * CDFBasis::GetBaseMultiStream(void) { return BP_TO_P(CMStream *, _pms); } //+-------------------------------------------------------------- // // Member: CDFBasis::SetBaseMultiStream, public // // Synopsis: Sets base MS // // History: 25-Feb-95 PhilipLa Created // //--------------------------------------------------------------- inline void CDFBasis::SetBaseMultiStream(CMStream *pms) { _pms = P_TO_BP(CBasedMStreamPtr, pms); } //+-------------------------------------------------------------- // // Member: CDFBasis::GetOrigLockFlags, public // // Synopsis: Returns the original's lock flags // // History: 11-Sep-92 DrewB Created // //--------------------------------------------------------------- inline DWORD CDFBasis::GetOrigLockFlags(void) { return _dwOrigLocks; } //+------------------------------------------------------------------------- // // Member: CDFBasis::GetOpenFlags // // Synopsis: Returns access/share flags // // History: 21-Dec-92 AlexT Created // //-------------------------------------------------------------------------- inline DFLAGS CDFBasis::GetOpenFlags(void) { return(_dfOpen); } //+--------------------------------------------------------------------------- // // Member: CDFBasis::GetFreeList, public // // Synopsis: Gets the free list for the indicated reserved type // // History: 05-Nov-92 DrewB Created // 18-May-93 AlexT Switch to array // //---------------------------------------------------------------------------- inline CFreeList *CDFBasis::GetFreeList(CDFB_CLASSTYPE classtype) { msfAssert(classtype >= 0 && classtype <= CDFB_CLASSCOUNT); return &_afrl[classtype]; } //+--------------------------------------------------------------------------- // // Member: CDFBasis::Reserve, public // // Synopsis: Reserve memory for instances // // Arguments: [cItems] -- count of items to reserve // [classtype] -- class of items to reserve // // History: 21-May-93 AlexT Created // //---------------------------------------------------------------------------- inline SCODE CDFBasis::Reserve(UINT cItems, CDFB_CLASSTYPE classtype) { msfAssert(classtype >= 0 && classtype <= CDFB_CLASSCOUNT); return _afrl[classtype].Reserve(_pMalloc, cItems, _aReserveSize[classtype]); } //+--------------------------------------------------------------------------- // // Member: CDFBasis::Unreserve, public // // Synopsis: Unreserve memory for instances // // Arguments: [cItems] -- count of items to unreserve // [classtype] -- class of items to unreserve // // History: 21-May-93 AlexT Created // //---------------------------------------------------------------------------- inline void CDFBasis::Unreserve(UINT cItems, CDFB_CLASSTYPE classtype) { msfAssert(classtype >= 0 && classtype <= CDFB_CLASSCOUNT); _afrl[classtype].Unreserve(cItems); } //+--------------------------------------------------------------------------- // // Member: CDFBasis::GetMalloc, public // // Synopsis: Return allocator associated with basis // // History: 21-May-93 AlexT Created // //---------------------------------------------------------------------------- inline IMalloc *CDFBasis::GetMalloc(void) { #ifdef MULTIHEAP //We can't return the _pMalloc pointer here, since it's only valid // in the creating process. What we really want to return in the // pointer to the current allocator, which is always &g_smAllocator. //return (IMalloc *)_pMalloc; return (IMalloc *)&g_smAllocator; #else return (IMalloc *)_pMalloc; #endif } #ifdef DIRECTWRITERLOCK //+--------------------------------------------------------------------------- // // Member: CDFBasis::DirectWriterMode, public // // Synopsis: indicates if this is readwrite deny write // // History: 11-Aug-1996 HenryLee created // //---------------------------------------------------------------------------- inline BOOL CDFBasis::DirectWriterMode () { return _fDirectWriterMode; } //+--------------------------------------------------------------------------- // // Member: CDFBasis::HaveWriteLock, public // // Synopsis: indicates if this if someone is holding the exclusive writelock // // History: 11-Aug-1996 HenryLee created // //---------------------------------------------------------------------------- inline BOOL CDFBasis::HaveWriteAccess () { return _fWriteLocked; } #endif #endif