477 lines
14 KiB
C++
477 lines
14 KiB
C++
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1992.
|
||
|
//
|
||
|
// File: wdocfile.hxx
|
||
|
//
|
||
|
// Contents: CWrappedDocFile class header
|
||
|
//
|
||
|
// Classes: CWrappedDocFile
|
||
|
//
|
||
|
// History: 06-Jan-92 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
#ifndef __WDOCFILE_HXX__
|
||
|
#define __WDOCFILE_HXX__
|
||
|
|
||
|
#include <dfmsp.hxx>
|
||
|
#include <dfbasis.hxx>
|
||
|
#include <pdocfile.hxx>
|
||
|
#include <ulist.hxx>
|
||
|
#include <entry.hxx>
|
||
|
#include <tset.hxx>
|
||
|
#include <freelist.hxx>
|
||
|
#include <tstream.hxx>
|
||
|
|
||
|
class PDocFileIterator;
|
||
|
class CPubDocFile;
|
||
|
class CDFBasis;
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CWrappedDocFile
|
||
|
//
|
||
|
// Purpose: Wrapped DocFile object for transactioning
|
||
|
//
|
||
|
// Interface: See below
|
||
|
//
|
||
|
// History: 06-Jan-92 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
class CWrappedDocFile : public PDocFile, public PTSetMember,
|
||
|
public CMallocBased
|
||
|
{
|
||
|
public:
|
||
|
inline void *operator new(size_t size, IMalloc * const pMalloc);
|
||
|
inline void *operator new(size_t size,
|
||
|
CDFBasis * const pdfb);
|
||
|
inline void ReturnToReserve(CDFBasis * const pdfb);
|
||
|
|
||
|
inline static SCODE Reserve(UINT cItems, CDFBasis * const pdfb);
|
||
|
inline static void Unreserve(UINT cItems, CDFBasis * const pdfb);
|
||
|
|
||
|
CWrappedDocFile(CDfName const *pdfn,
|
||
|
DFLUID dl,
|
||
|
DFLAGS const df,
|
||
|
CDFBasis *pdfb,
|
||
|
CPubDocFile *ppubdf);
|
||
|
SCODE Init(PDocFile *pdfBase);
|
||
|
#ifdef COORD
|
||
|
SCODE InitPub(CPubDocFile *ppubdf);
|
||
|
#endif
|
||
|
|
||
|
~CWrappedDocFile(void);
|
||
|
|
||
|
// PDocFile
|
||
|
inline void DecRef(void);
|
||
|
inline void AddRef () { PBasicEntry::AddRef(); };
|
||
|
inline void Release () { PBasicEntry::Release(); };
|
||
|
|
||
|
SCODE DestroyEntry(CDfName const *dfnName,
|
||
|
BOOL fClean);
|
||
|
SCODE RenameEntry(CDfName const *dfnName,
|
||
|
CDfName const *dfnNewName);
|
||
|
|
||
|
SCODE GetClass(CLSID *pclsid);
|
||
|
SCODE SetClass(REFCLSID clsid);
|
||
|
SCODE GetStateBits(DWORD *pgrfStateBits);
|
||
|
SCODE SetStateBits(DWORD grfStateBits, DWORD grfMask);
|
||
|
|
||
|
SCODE CreateDocFile(CDfName const *pdfnName,
|
||
|
DFLAGS const df,
|
||
|
DFLUID luidSet,
|
||
|
PDocFile **ppdfDocFile);
|
||
|
inline SCODE CreateDocFile(CDfName const *pdfnName,
|
||
|
DFLAGS const df,
|
||
|
DFLUID luidSet,
|
||
|
DWORD const dwType,
|
||
|
PDocFile **ppdfDocFile)
|
||
|
{ return CreateDocFile(pdfnName, df, luidSet, ppdfDocFile); }
|
||
|
|
||
|
SCODE GetDocFile(CDfName const *pdfnName,
|
||
|
DFLAGS const df,
|
||
|
PDocFile **ppdfDocFile);
|
||
|
|
||
|
inline SCODE GetDocFile(CDfName const *pdfnName,
|
||
|
DFLAGS const df,
|
||
|
DWORD const dwType,
|
||
|
PDocFile **ppdfDocFile)
|
||
|
{ return GetDocFile(pdfnName, df, ppdfDocFile); }
|
||
|
|
||
|
inline void ReturnDocFile(CWrappedDocFile *pdf);
|
||
|
|
||
|
SCODE CreateStream(CDfName const *pdfnName,
|
||
|
DFLAGS const df,
|
||
|
DFLUID luidSet,
|
||
|
PSStream **ppsstStream);
|
||
|
|
||
|
inline SCODE CreateStream(CDfName const *pdfnName,
|
||
|
DFLAGS const df,
|
||
|
DFLUID luidSet,
|
||
|
DWORD const dwType,
|
||
|
PSStream **ppsstStream)
|
||
|
{ return CreateStream(pdfnName, df, luidSet, ppsstStream); }
|
||
|
|
||
|
SCODE GetStream(CDfName const *pdfnName,
|
||
|
DFLAGS const df,
|
||
|
PSStream **ppsstStream);
|
||
|
|
||
|
inline SCODE GetStream(CDfName const *pdfnName,
|
||
|
DFLAGS const df,
|
||
|
DWORD const dwType,
|
||
|
PSStream **ppsstStream)
|
||
|
{ return GetStream(pdfnName, df, ppsstStream); }
|
||
|
|
||
|
inline void ReturnStream(CTransactedStream *pstm);
|
||
|
|
||
|
SCODE FindGreaterEntry(CDfName const *pdfnKey,
|
||
|
SIterBuffer *pib,
|
||
|
STATSTGW *pstat);
|
||
|
SCODE StatEntry(CDfName const *pdfn,
|
||
|
SIterBuffer *pib,
|
||
|
STATSTGW *pstat);
|
||
|
|
||
|
SCODE BeginCommitFromChild(CUpdateList &ulChanged,
|
||
|
DWORD const dwFlags,
|
||
|
CWrappedDocFile *pdfChild);
|
||
|
void EndCommitFromChild(DFLAGS const df,
|
||
|
CWrappedDocFile *pdfChild);
|
||
|
SCODE IsEntry(CDfName const *dfnName,
|
||
|
SEntryBuffer *peb);
|
||
|
SCODE DeleteContents(void);
|
||
|
|
||
|
// PTSetMember
|
||
|
SCODE BeginCommit(DWORD const dwFlags);
|
||
|
void EndCommit(DFLAGS const df);
|
||
|
void Revert(void);
|
||
|
#ifdef LARGE_STREAMS
|
||
|
void GetCommitInfo(ULONGLONG *pulRet1, ULONGLONG *pulRet2);
|
||
|
#else
|
||
|
void GetCommitInfo(ULONG *pulRet1, ULONG *pulRet2);
|
||
|
#endif
|
||
|
|
||
|
// PTimeEntry
|
||
|
SCODE GetTime(WHICHTIME wt, TIME_T *ptm);
|
||
|
SCODE SetTime(WHICHTIME wt, TIME_T tm);
|
||
|
SCODE GetAllTimes(TIME_T *patm, TIME_T *pmtm, TIME_T *pctm);
|
||
|
SCODE SetAllTimes(TIME_T atm, TIME_T mtm, TIME_T ctm);
|
||
|
|
||
|
inline CWrappedDocFile *GetReservedDocfile(CDfName const *pdfn,
|
||
|
DFLUID dl,
|
||
|
DFLAGS const df,
|
||
|
CPubDocFile *ppubdf);
|
||
|
inline CTransactedStream *GetReservedStream(CDfName const *pdfn,
|
||
|
DFLUID dl,
|
||
|
DFLAGS df
|
||
|
);
|
||
|
|
||
|
// Internal
|
||
|
SCODE SetBase(PDocFile *pdf);
|
||
|
inline PDocFile *GetBase(void);
|
||
|
inline CFreeList *GetDocfileFreelist(void);
|
||
|
inline CFreeList *GetStreamFreelist(void);
|
||
|
inline void SetClean(void);
|
||
|
inline void SetDirty(UINT fDirty);
|
||
|
inline UINT GetDirty(void) const;
|
||
|
inline CUpdateList *GetUpdateList(void);
|
||
|
|
||
|
private:
|
||
|
SCODE SetInitialState(PDocFile *pdfBase);
|
||
|
void RevertUpdate(CUpdate *pud);
|
||
|
|
||
|
DFLAGS _df; // Transactioning flags
|
||
|
CBasedDocFilePtr _pdfParent, _pdfBase;
|
||
|
CUpdateList _ulChanged;
|
||
|
CUpdateList _ulChangedHolder;
|
||
|
CUpdateList _ulChangedOld;
|
||
|
CTSSet _tssDeletedHolder;
|
||
|
BOOL _fBeginCommit;
|
||
|
CTransactedTimeEntry _tten;
|
||
|
CBasedPubDocFilePtr _ppubdf;
|
||
|
UINT _fDirty;
|
||
|
CLSID _clsid;
|
||
|
DWORD _grfStateBits;
|
||
|
CBasedDFBasisPtr const _pdfb;
|
||
|
};
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::operator new, public
|
||
|
//
|
||
|
// Synopsis: Unreserved object allocator
|
||
|
//
|
||
|
// Arguments: [size] -- byte count to allocate
|
||
|
// [pMalloc] -- allocator
|
||
|
//
|
||
|
// History: 25-May-93 AlexT Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
inline void *CWrappedDocFile::operator new(size_t size,
|
||
|
IMalloc * const pMalloc)
|
||
|
{
|
||
|
return(CMallocBased::operator new(size, pMalloc));
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::operator new, public
|
||
|
//
|
||
|
// Synopsis: Reserved object allocator
|
||
|
//
|
||
|
// Arguments: [size] -- byte count to allocate
|
||
|
// [pdfb] -- basis
|
||
|
//
|
||
|
// History: 25-May-93 AlexT Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
inline void *CWrappedDocFile::operator new(size_t size, CDFBasis * const pdfb)
|
||
|
{
|
||
|
olAssert(size == sizeof(CWrappedDocFile));
|
||
|
|
||
|
return pdfb->GetFreeList(CDFB_WRAPPEDDOCFILE)->GetReserved();
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::ReturnToReserve, public
|
||
|
//
|
||
|
// Synopsis: Reserved object return
|
||
|
//
|
||
|
// Arguments: [pdfb] -- basis
|
||
|
//
|
||
|
// History: 25-May-93 AlexT Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
inline void CWrappedDocFile::ReturnToReserve(CDFBasis * const pdfb)
|
||
|
{
|
||
|
CWrappedDocFile::~CWrappedDocFile();
|
||
|
pdfb->GetFreeList(CDFB_WRAPPEDDOCFILE)->ReturnToReserve(this);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::Reserve, public
|
||
|
//
|
||
|
// Synopsis: Reserve instances
|
||
|
//
|
||
|
// Arguments: [cItems] -- count of items
|
||
|
// [pdfb] -- basis
|
||
|
//
|
||
|
// History: 25-May-93 AlexT Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
inline SCODE CWrappedDocFile::Reserve(UINT cItems, CDFBasis * const pdfb)
|
||
|
{
|
||
|
return pdfb->Reserve(cItems, CDFB_WRAPPEDDOCFILE);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::Unreserve, public
|
||
|
//
|
||
|
// Synopsis: Unreserve instances
|
||
|
//
|
||
|
// Arguments: [cItems] -- count of items
|
||
|
// [pdfb] -- basis
|
||
|
//
|
||
|
// History: 25-May-93 AlexT Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
inline void CWrappedDocFile::Unreserve(UINT cItems, CDFBasis * const pdfb)
|
||
|
{
|
||
|
pdfb->Unreserve(cItems, CDFB_WRAPPEDDOCFILE);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::GetBase, public
|
||
|
//
|
||
|
// Synopsis: Returns base; used for debug checks
|
||
|
//
|
||
|
// History: 15-Sep-92 AlexT Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
inline PDocFile *CWrappedDocFile::GetBase(void)
|
||
|
{
|
||
|
return BP_TO_P(PDocFile *, _pdfBase);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::GetReservedDocfile, public
|
||
|
//
|
||
|
// Synopsis: Returns a previously reserved object
|
||
|
//
|
||
|
// History: 09-Nov-92 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline CWrappedDocFile *CWrappedDocFile::GetReservedDocfile(
|
||
|
CDfName const *pdfn,
|
||
|
DFLUID dl,
|
||
|
DFLAGS const df,
|
||
|
CPubDocFile *ppubdf)
|
||
|
{
|
||
|
return new(_pdfb)
|
||
|
CWrappedDocFile(pdfn, dl, df,
|
||
|
_pdfb, ppubdf);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::GetReservedStream, public
|
||
|
//
|
||
|
// Synopsis: Returns a previously reserved object
|
||
|
//
|
||
|
// History: 09-Nov-92 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline CTransactedStream *CWrappedDocFile::GetReservedStream(
|
||
|
CDfName const *pdfn,
|
||
|
DFLUID dl,
|
||
|
DFLAGS df
|
||
|
)
|
||
|
{
|
||
|
CDFBasis * pdfb = BP_TO_P(CDFBasis *, _pdfb);
|
||
|
|
||
|
return new(pdfb)
|
||
|
CTransactedStream(pdfn, dl, df,
|
||
|
#ifdef USE_NOSCRATCH
|
||
|
pdfb->GetBaseMultiStream(),
|
||
|
#endif
|
||
|
pdfb->GetScratch());
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::SetClean, public
|
||
|
//
|
||
|
// Synopsis: Resets dirty flags
|
||
|
//
|
||
|
// History: 10-Nov-92 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline void CWrappedDocFile::SetClean(void)
|
||
|
{
|
||
|
_fDirty = 0;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::SetDirty, public
|
||
|
//
|
||
|
// Synopsis: Sets dirty flags
|
||
|
//
|
||
|
// History: 10-Nov-92 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline void CWrappedDocFile::SetDirty(UINT fDirty)
|
||
|
{
|
||
|
_fDirty |= fDirty;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::GetDirty, public
|
||
|
//
|
||
|
// Synopsis: Returns the dirty flags
|
||
|
//
|
||
|
// History: 25-Nov-92 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline UINT CWrappedDocFile::GetDirty(void) const
|
||
|
{
|
||
|
return _fDirty;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::DecRef, public
|
||
|
//
|
||
|
// Synopsis: Decrements the ref count
|
||
|
//
|
||
|
// History: 23-Nov-92 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline void CWrappedDocFile::DecRef(void)
|
||
|
{
|
||
|
AtomicDec(&_cReferences);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::GetUpdateList, public
|
||
|
//
|
||
|
// Synopsis: Returns a pointer to the current update list
|
||
|
//
|
||
|
// History: 12-Apr-93 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
CUpdateList *CWrappedDocFile::GetUpdateList(void)
|
||
|
{
|
||
|
return &_ulChanged;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::ReturnDocFile, public
|
||
|
//
|
||
|
// Synopsis: Removes a docfile from the XS and returns it to the freelist
|
||
|
//
|
||
|
// Arguments: [pdf] - Docfile
|
||
|
//
|
||
|
// History: 23-Nov-92 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline void CWrappedDocFile::ReturnDocFile(CWrappedDocFile *pdf)
|
||
|
{
|
||
|
olDebugOut((DEB_ITRACE, "In CWrappedDocFile::ReturnDocFile:%p(%p)\n",
|
||
|
this, pdf));
|
||
|
_ppubdf->RemoveXSMember(pdf);
|
||
|
// Force ref count to zero without freeing memory
|
||
|
pdf->DecRef();
|
||
|
pdf->ReturnToReserve(BP_TO_P(CDFBasis *, _pdfb));
|
||
|
olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::ReturnDocFile\n"));
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWrappedDocFile::ReturnStream, public
|
||
|
//
|
||
|
// Synopsis: Removes a stream from the XS and returns it to the freelist
|
||
|
//
|
||
|
// Arguments: [pstm] - Stream
|
||
|
//
|
||
|
// History: 23-Nov-92 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline void CWrappedDocFile::ReturnStream(CTransactedStream *pstm)
|
||
|
{
|
||
|
olDebugOut((DEB_ITRACE, "In CWrappedDocFile::ReturnStream:%p(%p)\n",
|
||
|
this, pstm));
|
||
|
_ppubdf->RemoveXSMember(pstm);
|
||
|
// Force ref count to zero without freeing memory
|
||
|
pstm->DecRef();
|
||
|
pstm->ReturnToReserve(BP_TO_P(CDFBasis *, _pdfb));
|
||
|
olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::ReturnStream\n"));
|
||
|
}
|
||
|
|
||
|
#endif // __WDOCFILE_HXX__
|