632 lines
17 KiB
C++
632 lines
17 KiB
C++
//+--------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1992.
|
|
//
|
|
// File: entry.cxx
|
|
//
|
|
// Contents: Entry implementations
|
|
//
|
|
// History: 29-Jul-92 DrewB Created
|
|
// 10-Apr-95 HenryLee remove Sleep
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
#include <dfhead.cxx>
|
|
#include <smalloc.hxx>
|
|
|
|
#pragma hdrstop
|
|
|
|
#define PDOCFILE_VCALL(x) \
|
|
if (_sig == CDOCFILE_SIG) \
|
|
return ((CDocFile *)this)->x; \
|
|
else if (_sig == CWRAPPEDDOCFILE_SIG) \
|
|
return ((CWrappedDocFile *)this)->x; \
|
|
else olAssert (!"Invalid signature on PDocFile!");\
|
|
return STG_E_INVALIDFUNCTION;
|
|
|
|
#define PSSTREAM_VCALL(x) \
|
|
if (_sig == CDIRECTSTREAM_SIG) \
|
|
return ((CDirectStream *)this)->x; \
|
|
else if (_sig == CTRANSACTEDSTREAM_SIG) \
|
|
return ((CTransactedStream *)this)->x; \
|
|
else olAssert (!"Invalid signature on PSStream!");\
|
|
return STG_E_INVALIDFUNCTION;
|
|
|
|
#define PTIMEENTRY_VCALL(x) \
|
|
if (_sig == CDOCFILE_SIG) \
|
|
return ((CDocFile *)this)->x; \
|
|
else if (_sig == CWRAPPEDDOCFILE_SIG) \
|
|
return ((CWrappedDocFile *)this)->x; \
|
|
else olAssert (!"Invalid signature on PTimeEntry");\
|
|
return STG_E_INVALIDFUNCTION;
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PTimeEntry::CopyTimesFrom, public
|
|
//
|
|
// Synopsis: Copies one entries times to another
|
|
//
|
|
// Arguments: [ptenFrom] - From
|
|
//
|
|
// Returns: Appropriate status code
|
|
//
|
|
// History: 29-Jul-92 DrewB Created
|
|
// 26-May-95 SusiA Removed GetTime; Added GetAllTimes
|
|
// 22-Nov-95 SusiA SetAllTimes at once
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PTimeEntry::CopyTimesFrom(PTimeEntry *ptenFrom)
|
|
{
|
|
SCODE sc;
|
|
TIME_T atm; //Access time
|
|
TIME_T mtm; //Modification time
|
|
TIME_T ctm; //Creation time
|
|
|
|
olDebugOut((DEB_ITRACE, "In PTimeEntry::CopyTimesFrom(%p)\n",
|
|
ptenFrom));
|
|
olChk(ptenFrom->GetAllTimes(&atm, &mtm, &ctm));
|
|
olChk(SetAllTimes(atm, mtm, ctm));
|
|
olDebugOut((DEB_ITRACE, "Out PTimeEntry::CopyTimesFrom\n"));
|
|
// Fall through
|
|
EH_Err:
|
|
return sc;
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PBasicEntry::GetNewLuid, public
|
|
//
|
|
// Synopsis: Returns a new luid
|
|
//
|
|
// History: 21-Oct-92 AlexT Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
//We used to have a mutex here - it turns out that this is unnecessary,
|
|
// since we're already holding the tree mutex. We get a performance
|
|
// win by eliminating the mutex.
|
|
//Using CSmAllocator mutex and took out Sleep()
|
|
//static CStaticDfMutex _sdmtxLuids(TSTR("DfLuidsProtector"));
|
|
|
|
DFLUID PBasicEntry::GetNewLuid(const IMalloc *pMalloc)
|
|
{
|
|
DFLUID luid;
|
|
|
|
luid = ((CSmAllocator *)pMalloc)->IncrementLuid();
|
|
return luid;
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PTimeEntry::GetTime, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PTimeEntry::GetTime(WHICHTIME wt, TIME_T *ptm)
|
|
{
|
|
PTIMEENTRY_VCALL (GetTime (wt, ptm));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PTimeEntry::SetTime, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PTimeEntry::SetTime(WHICHTIME wt, TIME_T tm)
|
|
{
|
|
PTIMEENTRY_VCALL (SetTime (wt, tm));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PTimeEntry::GetAllTimes, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PTimeEntry::GetAllTimes(TIME_T *patm, TIME_T *pmtm, TIME_T *pctm)
|
|
{
|
|
PTIMEENTRY_VCALL (GetAllTimes (patm, pmtm, pctm));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PTimeEntry::SetTime, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PTimeEntry::SetAllTimes(TIME_T atm, TIME_T mtm, TIME_T ctm)
|
|
{
|
|
PTIMEENTRY_VCALL (SetAllTimes (atm, mtm, ctm));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PBasicEntry::Release, public
|
|
//
|
|
// Synopsis: Release resources for a PBasicEntry
|
|
//
|
|
// History: 11-Dec-91 DrewB Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
void PBasicEntry::Release(void)
|
|
{
|
|
LONG lRet;
|
|
|
|
olDebugOut((DEB_ITRACE, "In PBasicEntry::Release()\n"));
|
|
olAssert(_cReferences > 0);
|
|
|
|
lRet = AtomicDec(&_cReferences);
|
|
if (lRet == 0)
|
|
{
|
|
if (_sig == CDOCFILE_SIG)
|
|
delete (CDocFile *)this;
|
|
else if (_sig == CWRAPPEDDOCFILE_SIG)
|
|
delete (CWrappedDocFile *)this;
|
|
else if (_sig == CDIRECTSTREAM_SIG)
|
|
delete (CDirectStream *)this;
|
|
else if (_sig == CTRANSACTEDSTREAM_SIG)
|
|
delete (CTransactedStream *)this;
|
|
else
|
|
olAssert (!"Invalid signature on PBasicEntry!");
|
|
}
|
|
olDebugOut((DEB_ITRACE, "Out PBasicEntry::Release\n"));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PSStream::BeginCommitFromChild, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PSStream::BeginCommitFromChild(
|
|
#ifdef LARGE_STREAMS
|
|
ULONGLONG ulSize,
|
|
#else
|
|
ULONG ulSize,
|
|
#endif
|
|
CDeltaList *pDelta,
|
|
CTransactedStream *pstChild)
|
|
{
|
|
PSSTREAM_VCALL (BeginCommitFromChild (ulSize, pDelta, pstChild));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PSStream::EndCommitFromChild, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
void PSStream::EndCommitFromChild(DFLAGS df, CTransactedStream *pstChild)
|
|
{
|
|
if (_sig == CDIRECTSTREAM_SIG)
|
|
((CDirectStream *)this)->EndCommitFromChild (df, pstChild);
|
|
else if (_sig == CTRANSACTEDSTREAM_SIG)
|
|
((CTransactedStream *)this)->EndCommitFromChild (df, pstChild);
|
|
else olAssert (!"Invalid signature on PSStream!");
|
|
return;
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PSStream::EmptyCache, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
void PSStream::EmptyCache()
|
|
{
|
|
if (_sig == CDIRECTSTREAM_SIG)
|
|
((CDirectStream *)this)->EmptyCache();
|
|
else if (_sig == CTRANSACTEDSTREAM_SIG)
|
|
((CTransactedStream *)this)->EmptyCache();
|
|
else olAssert (!"Invalid signature on PSStream!");
|
|
return;
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PSStream::GetDeltaList, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
CDeltaList * PSStream::GetDeltaList(void)
|
|
{
|
|
if (_sig == CDIRECTSTREAM_SIG)
|
|
return ((CDirectStream *)this)->GetDeltaList ();
|
|
else if (_sig == CTRANSACTEDSTREAM_SIG)
|
|
return ((CTransactedStream *)this)->GetDeltaList ();
|
|
else olAssert (!"Invalid signature on PSStream!");
|
|
return NULL;
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PSStream::ReadAt, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PSStream::ReadAt(
|
|
#ifdef LARGE_STREAMS
|
|
ULONGLONG ulOffset,
|
|
#else
|
|
ULONG ulOffset,
|
|
#endif
|
|
VOID *pBuffer,
|
|
ULONG ulCount,
|
|
ULONG STACKBASED *pulRetval)
|
|
{
|
|
PSSTREAM_VCALL (ReadAt (ulOffset, pBuffer, ulCount, pulRetval));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PSStream::WriteAt, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PSStream::WriteAt(
|
|
#ifdef LARGE_STREAMS
|
|
ULONGLONG ulOffset,
|
|
#else
|
|
ULONG ulOffset,
|
|
#endif
|
|
VOID const *pBuffer,
|
|
ULONG ulCount,
|
|
ULONG STACKBASED *pulRetval)
|
|
{
|
|
PSSTREAM_VCALL (WriteAt (ulOffset, pBuffer, ulCount, pulRetval));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PSStream::SetSize, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
#ifdef LARGE_STREAMS
|
|
SCODE PSStream::SetSize(ULONGLONG ulNewSize)
|
|
#else
|
|
SCODE PSStream::SetSize(ULONG ulNewSize)
|
|
#endif
|
|
{
|
|
PSSTREAM_VCALL (SetSize (ulNewSize));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PSStream::GetSize, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
#ifdef LARGE_STREAMS
|
|
void PSStream::GetSize(ULONGLONG *pulSize)
|
|
#else
|
|
void PSStream::GetSize(ULONG *pulSize)
|
|
#endif
|
|
{
|
|
if (_sig == CDIRECTSTREAM_SIG)
|
|
((CDirectStream *)this)->GetSize (pulSize);
|
|
else if (_sig == CTRANSACTEDSTREAM_SIG)
|
|
((CTransactedStream *)this)->GetSize (pulSize);
|
|
else olAssert (!"Invalid signature on PSStream!");
|
|
return;
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::DestroyEntry, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::DestroyEntry(CDfName const *pdfnName,
|
|
BOOL fClean)
|
|
{
|
|
PDOCFILE_VCALL (DestroyEntry(pdfnName, fClean));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::RenameEntry, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::RenameEntry(CDfName const *pdfnName,
|
|
CDfName const *pdfnNewName)
|
|
{
|
|
PDOCFILE_VCALL (RenameEntry (pdfnName, pdfnNewName));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::GetClass, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::GetClass(CLSID *pclsid)
|
|
{
|
|
PDOCFILE_VCALL (GetClass (pclsid));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::SetClass, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::SetClass(REFCLSID clsid)
|
|
{
|
|
PDOCFILE_VCALL (SetClass (clsid));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::GetStateBits, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::GetStateBits(DWORD *pgrfStateBits)
|
|
{
|
|
PDOCFILE_VCALL (GetStateBits (pgrfStateBits));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::SetStateBits, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::SetStateBits(DWORD grfStateBits, DWORD grfMask)
|
|
{
|
|
PDOCFILE_VCALL (SetStateBits (grfStateBits, grfMask));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::CreateDocFile, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::CreateDocFile(CDfName const *pdfnName,
|
|
DFLAGS const df,
|
|
DFLUID luidSet,
|
|
PDocFile **ppdfDocFile)
|
|
{
|
|
PDOCFILE_VCALL (CreateDocFile (pdfnName, df, luidSet, ppdfDocFile));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::GetDocFile, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::GetDocFile(CDfName const *pdfnName,
|
|
DFLAGS const df,
|
|
PDocFile **ppdfDocFile)
|
|
{
|
|
PDOCFILE_VCALL (GetDocFile (pdfnName, df, ppdfDocFile));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::CreateStream, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::CreateStream(CDfName const *pdfnName,
|
|
DFLAGS const df,
|
|
DFLUID luidSet,
|
|
PSStream **ppsstStream)
|
|
{
|
|
PDOCFILE_VCALL (CreateStream (pdfnName, df, luidSet, ppsstStream));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::GetStream, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::GetStream(CDfName const *pdfnName,
|
|
DFLAGS const df,
|
|
PSStream **ppsstStream)
|
|
{
|
|
PDOCFILE_VCALL (GetStream (pdfnName, df, ppsstStream));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::FindGreaterEntry, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::FindGreaterEntry(CDfName const *pdfnKey,
|
|
SIterBuffer *pib,
|
|
STATSTGW *pstat)
|
|
{
|
|
PDOCFILE_VCALL (FindGreaterEntry (pdfnKey, pib, pstat));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::StatEntry, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::StatEntry(CDfName const *pdfn,
|
|
SIterBuffer *pib,
|
|
STATSTGW *pstat)
|
|
{
|
|
PDOCFILE_VCALL (StatEntry (pdfn, pib, pstat));
|
|
}
|
|
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::BeginCommitFromChild, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::BeginCommitFromChild(CUpdateList &ulChanged,
|
|
DWORD const dwFlags,
|
|
CWrappedDocFile *pdfChild)
|
|
{
|
|
PDOCFILE_VCALL (BeginCommitFromChild (ulChanged, dwFlags, pdfChild));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::EndCommitFromChild, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
void PDocFile::EndCommitFromChild(DFLAGS const df,
|
|
CWrappedDocFile *pdfChild)
|
|
{
|
|
if (_sig == CDOCFILE_SIG)
|
|
((CDocFile *)this)->EndCommitFromChild (df, pdfChild);
|
|
else if (_sig == CWRAPPEDDOCFILE_SIG)
|
|
((CWrappedDocFile *)this)->EndCommitFromChild (df, pdfChild);
|
|
else olAssert (!"Invalid signature on PTimeEntry!");
|
|
return;
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::IsEntry, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::IsEntry(CDfName const *pdfnName,
|
|
SEntryBuffer *peb)
|
|
{
|
|
PDOCFILE_VCALL (IsEntry (pdfnName, peb));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: PDocFile::DeleteContents, public
|
|
//
|
|
// Synopsis: calls to derived object
|
|
//
|
|
// History: 20-Jan-98 HenryLee Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
SCODE PDocFile::DeleteContents(void)
|
|
{
|
|
PDOCFILE_VCALL (DeleteContents());
|
|
}
|
|
|