diff options
Diffstat (limited to 'private/ole32/stg/ref/pbstream.cxx')
-rw-r--r-- | private/ole32/stg/ref/pbstream.cxx | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/private/ole32/stg/ref/pbstream.cxx b/private/ole32/stg/ref/pbstream.cxx new file mode 100644 index 000000000..966fc1407 --- /dev/null +++ b/private/ole32/stg/ref/pbstream.cxx @@ -0,0 +1,221 @@ +//+------------------------------------------------------------------------- +// +// Microsoft Windows +// Copyright (C) Microsoft Corporation, 1992 - 1992. +// +// File: pbstream.cxx +// +// Contents: CPubStream code +// +// Classes: +// +// Functions: +// +//-------------------------------------------------------------------------- + +#include "msfhead.cxx" + + +#include <sstream.hxx> +#include <publicdf.hxx> +#include <pbstream.hxx> +#include <docfilep.hxx> + +//+--------------------------------------------------------------------------- +// +// Member: CPubStream::CPubStream, public +// +// Synopsis: Constructor +// +//---------------------------------------------------------------------------- + +CPubStream::CPubStream(CPubDocFile *ppdf, + DFLAGS df, + CDfName const *pdfn) +{ + _psParent = NULL; + _df = df; + _ppdfParent = ppdf; + _cReferences = 1; + _dfn.Set(pdfn->GetLength(), pdfn->GetBuffer()); + _ppdfParent->AddChild(this); + _fDirty = FALSE; +} + +//+--------------------------------------------------------------------------- +// +// Member: CPubStream::Init, public +// +// Synopsis: Init function +// +// Arguments: [psParent] - Stream in transaction set +// [dlLUID] - LUID +// +//---------------------------------------------------------------------------- + +void CPubStream::Init(PSStream *psParent, + DFLUID dlLUID) +{ + _psParent = psParent; + _luid = dlLUID; +} + +//+--------------------------------------------------------------------------- +// +// Member: CPubStream::~CPubStream, public +// +// Synopsis: Destructor +// +//---------------------------------------------------------------------------- + +CPubStream::~CPubStream() +{ + msfAssert(_cReferences == 0); + + if (SUCCEEDED(CheckReverted())) + { + if (_ppdfParent != NULL) + _ppdfParent->ReleaseChild(this); + if (_psParent) + { + _psParent->Release(); + } + } +} + + +//+------------------------------------------------------------------------- +// +// Method: CPubStream::Release, public +// +// Synopsis: Release a pubstream object +// +// Arguments: None. +// +// Returns: S_OK if call completed OK. +// +// Algorithm: Delete 'this' - all real work done by destructor. +// +// Notes: +// +//-------------------------------------------------------------------------- + + +void CPubStream::vRelease(VOID) +{ + msfDebugOut((DEB_TRACE,"In CPubStream::Release()\n")); + msfAssert(_cReferences > 0); + AtomicDec(&_cReferences); + + + Commit(STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE); + + if (_cReferences == 0) + { + delete this; + } + msfDebugOut((DEB_TRACE,"Out CPubStream::Release()\n")); +} + +//+-------------------------------------------------------------- +// +// Member: CPubStream::Stat, public +// +// Synopsis: Fills in a stat buffer +// +// Arguments: [pstatstg] - Buffer +// [grfStatFlag] - stat flags +// +// Returns: S_OK or error code +// +// Modifies: [pstatstg] +// +//--------------------------------------------------------------- + + +SCODE CPubStream::Stat(STATSTGW *pstatstg, DWORD grfStatFlag) +{ + SCODE sc = S_OK; + + msfDebugOut((DEB_ITRACE, "In CPubStream::Stat(%p)\n", pstatstg)); + msfChk(CheckReverted()); + + msfAssert(_ppdfParent != NULL); + pstatstg->grfMode = DFlagsToMode(_df); + + msfChk(_psParent->GetTime(WT_CREATION,&pstatstg->ctime)); + msfChk(_psParent->GetTime(WT_MODIFICATION,&pstatstg->mtime)); + pstatstg->atime = pstatstg->mtime; + pstatstg->clsid = CLSID_NULL; + pstatstg->grfStateBits = 0; + + pstatstg->pwcsName = NULL; + if ((grfStatFlag & STATFLAG_NONAME) == 0) + { + msfChk(DfAllocWCS((WCHAR *)_dfn.GetBuffer(), &pstatstg->pwcsName)); + wcscpy(pstatstg->pwcsName, (WCHAR *)_dfn.GetBuffer()); + } + + ULONG cbSize; + _psParent->GetSize(&cbSize); + ULISet32(pstatstg->cbSize, cbSize); + msfDebugOut((DEB_ITRACE, "Out CPubStream::Stat\n")); + +Err: + return sc; +} + +//+-------------------------------------------------------------- +// +// Member: CPubStream::RevertFromAbove, public +// +// Synopsis: Parent has asked for reversion +// +//--------------------------------------------------------------- + + +void CPubStream::RevertFromAbove(void) +{ + msfDebugOut((DEB_ITRACE, "In CPubStream::RevertFromAbove:%p()\n", this)); + _df |= DF_REVERTED; + _psParent->Release(); +#if DBG == 1 + _psParent = NULL; +#endif + msfDebugOut((DEB_ITRACE, "Out CPubStream::RevertFromAbove\n")); +} + +//+--------------------------------------------------------------------------- +// +// Member: CPubStream::Commit, public +// +// Synopsis: Flush stream changes to disk in the direct case. +// +// Arguments: None +// +// Returns: Appropriate status code +// +//---------------------------------------------------------------------------- + + +SCODE CPubStream::Commit(DWORD dwFlags) +{ + SCODE sc = S_OK; + msfDebugOut((DEB_ITRACE, "In CPubStream::Commit:%p()\n", this)); + + if (SUCCEEDED(CheckReverted())) + { + if (_fDirty) + { + + // We're a stream so we must have a parent + // Here we dirty all parents up to the next transacted storage + _ppdfParent->SetDirty(); + + + sc = _ppdfParent->GetBaseMS()->Flush(FLUSH_CACHE(dwFlags)); + } + } + msfDebugOut((DEB_ITRACE, "Out CPubStream::Commit\n")); + return sc; +} |