|
|
//+--------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1992.
//
// File: wdocfile.cxx
//
// Contents: Implementation of CWrappedDocFile methods for DocFiles
//
// History: 06-Jan-92 DrewB Created
//
//---------------------------------------------------------------
#include <dfhead.cxx>
#pragma hdrstop
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::CWrappedDocFile, public
//
// Synopsis: Empty object constructor
//
// Arguments: [pdfn] - Name
// [dl] - LUID
// [df] - Transactioning flags
// [dwType] - Type of object
// [pdfb] - Basis
// [ppubdf] - Public docfile
//
// History: 30-Mar-92 DrewB Created
//
//---------------------------------------------------------------
CWrappedDocFile::CWrappedDocFile(CDfName const *pdfn, DFLUID dl, DFLAGS const df, CDFBasis *pdfb, CPubDocFile *ppubdf) : PTSetMember(pdfn, STGTY_STORAGE), PDocFile(dl), _pdfb(P_TO_BP(CBasedDFBasisPtr, pdfb)) { olDebugOut((DEB_ITRACE, "In CWrappedDocFile::CWrappedDocFile:%p(" "%ws, %lu, %X, %p, %p)\n", this, pdfn->GetBuffer(), dl, df, pdfb, ppubdf));
_df = df; _fBeginCommit = FALSE; _cReferences = 0; _pdfParent = NULL; _ppubdf = P_TO_BP(CBasedPubDocFilePtr, ppubdf); _fDirty = 0; _pdfBase = NULL; PBasicEntry::_sig = CWRAPPEDDOCFILE_SIG; PTSetMember::_sig = CWRAPPEDDOCFILE_SIG; olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::CWrappedDocFile\n")); }
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::Init, public
//
// Synopsis: Constructor
//
// Arguments: [pdfBase] - Base DocFile
//
// Returns: Appropriate status code
//
// History: 06-Jan-92 DrewB Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::Init(PDocFile *pdfBase) { SCODE sc;
olDebugOut((DEB_ITRACE, "In CWrappedDocFile::CWrappedDocFile:%p(%p)\n", this, pdfBase));
olChk(SetInitialState(pdfBase)); _pdfBase = P_TO_BP(CBasedDocFilePtr, pdfBase); AddRef(); olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::CWrappedDocFile\n")); // Fall through
EH_Err: return sc; }
#ifdef COORD
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::InitPub, public
//
// Synopsis: Constructor
//
// Arguments: [ppubdf] - Enclosing CPubDocFile
//
// Returns: Appropriate status code
//
// History: 06-Jan-92 DrewB Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::InitPub(CPubDocFile *ppubdf) { _ppubdf = P_TO_BP(CBasedPubDocFilePtr, ppubdf); return S_OK; } #endif
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::~CWrappedDocFile, public
//
// Synopsis: Destructor
//
// History: 06-Jan-92 DrewB Created
//
//---------------------------------------------------------------
CWrappedDocFile::~CWrappedDocFile(void) { olDebugOut((DEB_ITRACE, "In CWrappedDocFile::~CWrappedDocFile()\n")); olAssert(_cReferences == 0); PBasicEntry::_sig = CWRAPPEDDOCFILE_SIGDEL; PTSetMember::_sig = CWRAPPEDDOCFILE_SIGDEL; #ifdef INDINST
if (P_INDEPENDENT(_df)) ((CDocFile *)_pdfBase)->Destroy(); else #endif
if (_pdfBase) _pdfBase->Release(); // We don't want SetInitialState in Revert to actually refer to the
// base because this object is dying and we shouldn't communicate
// with out base except for the above Release
_pdfBase = NULL; CWrappedDocFile::Revert(); olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::~CWrappedDocFile\n")); }
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::CreateDocFile, public
//
// Synopsis: Creates an embedded DocFile
//
// Arguments: [pdfnName] - Name of DocFile
// [df] - Transactioning flags
// [dlSet] - LUID to set or DF_NOLUID
// [dwType] - Type of entry
// [ppdfDocFile] - DocFile pointer return
//
// Returns: Appropriate error code
//
// Modifies: [*ppdfDocFile] holds DocFile pointer if successful
//
// History: 06-Jan-92 DrewB Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::CreateDocFile(CDfName const *pdfnName, DFLAGS const df, DFLUID dlSet, PDocFile **ppdfDocFile) { CWrappedDocFile *pdfWrapped; SEntryBuffer eb; SCODE sc; CUpdate *pud = NULL; CDFBasis *pdfb = BP_TO_P(CDFBasis *, _pdfb);
olDebugOut((DEB_ITRACE, "In CWrappedDocFile::CreateDocFile:%p(" "%ws, %X, %lu, %p, %p)\n", this, pdfnName, df, dlSet, ppdfDocFile));
if (SUCCEEDED(IsEntry(pdfnName, &eb))) olErr(EH_Err, STG_E_FILEALREADYEXISTS);
olAssert(P_TRANSACTED(_df));
if (dlSet == DF_NOLUID) dlSet = CWrappedDocFile::GetNewLuid(_pdfb->GetMalloc());
pdfWrapped = new (pdfb) CWrappedDocFile(pdfnName, dlSet, _df, pdfb, BP_TO_P(CPubDocFile *, _ppubdf)); olAssert(pdfWrapped != NULL && aMsg("Reserved DocFile not found"));
if (!P_NOUPDATE(df)) { olMemTo(EH_pdfWrapped, (pud = _ulChanged.Add(pdfb->GetMalloc(), pdfnName, NULL, dlSet, STGTY_STORAGE, pdfWrapped))); } olChkTo(EH_pud, pdfWrapped->Init(NULL)); _ppubdf->AddXSMember(this, pdfWrapped, dlSet); *ppdfDocFile = pdfWrapped; olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::CreateDocFile => %p\n", *ppdfDocFile)); return S_OK;
EH_pud: if (pud) _ulChanged.Delete(pud); EH_pdfWrapped: pdfWrapped->ReturnToReserve(pdfb); EH_Err: return sc; }
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::GetDocFile, public
//
// Synopsis: Instantiates or converts an existing stream to a
// DocFile
//
// Arguments: [pdfnName] - Name of stream
// [df] - Transactioning flags
// [dwType] - Type of entry
// [ppdfDocFile] - Pointer to return new object
//
// Returns: Appropriate error code
//
// Modifies: [*ppdfDocFile] holds DocFile pointer if successful
//
// History: 06-Jan-92 DrewB Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::GetDocFile(CDfName const *pdfnName, DFLAGS const df, PDocFile **ppdfDocFile) { PDocFile *pdfNew; PTSetMember *ptsm; CWrappedDocFile *pdfWrapped; SCODE sc;
olDebugOut((DEB_ITRACE, "In CWrappedDocFile::GetDocFile:%p(" "%ws, %X, %p)\n", this, pdfnName, df, ppdfDocFile));
olAssert(P_TRANSACTED(_df));
// Look for this name in this level transaction set
if ((ptsm = _ppubdf->FindXSMember(pdfnName, GetName())) != NULL) { if (ptsm->ObjectType() != STGTY_STORAGE) olErr(EH_Err, STG_E_FILENOTFOUND);
ptsm->AddRef(); *ppdfDocFile = (CWrappedDocFile *)ptsm; } else if (_pdfBase == NULL || _ulChanged.IsEntry(pdfnName, NULL) == UIE_ORIGINAL) { // named entry has been renamed or deleted
// (we can't have a rename or delete without a base)
olErr(EH_Err, STG_E_FILENOTFOUND); } else { CDfName const *pdfnRealName = pdfnName; CUpdate *pud; if (_ulChanged.IsEntry(pdfnName, &pud) == UIE_CURRENT && pud->IsRename()) { pdfnRealName = pud->GetCurrentName(); // We don't have to worry about picking up creates
// because any create would have an XSM that would
// be detected above
olVerify(_ulChanged.FindBase(pud, &pdfnRealName) == NULL); }
olAssert(_pdfBase != NULL); olChk(_pdfBase->GetDocFile(pdfnRealName, df, &pdfNew)); olAssert(pdfNew->GetLuid() != DF_NOLUID && aMsg("Docfile id is DF_NOLUID!"));
CDFBasis *pdfb; pdfb = BP_TO_P(CDFBasis *, _pdfb); olMemTo(EH_Get, pdfWrapped = new(pdfb->GetMalloc()) CWrappedDocFile(pdfnName, pdfNew->GetLuid(), _df, pdfb, BP_TO_P(CPubDocFile *, _ppubdf))); olChkTo(EH_pdfWrapped, pdfWrapped->Init(pdfNew)); _ppubdf->AddXSMember(this, pdfWrapped, pdfWrapped->GetLuid()); *ppdfDocFile = pdfWrapped; }
olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::GetDocFile => %p\n", *ppdfDocFile)); return S_OK;
EH_pdfWrapped: delete pdfWrapped; EH_Get: pdfNew->Release(); EH_Err: return sc; }
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::IsEntry, public
//
// Synopsis: Determines whether the given object is in the DocFile
// or not
//
// Arguments: [pdfnName] - Object name
// [peb] - Entry buffer to fill in
//
// Returns: Appropriate error code
//
// Modifies: [peb]
//
// History: 15-Jan-92 DrewB Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::IsEntry(CDfName const *pdfnName, SEntryBuffer *peb) { CUpdate *pud; SCODE sc = S_OK; UlIsEntry uie;
olDebugOut((DEB_ITRACE, "In CWrappedDocFile::IsEntry(%ws, %p)\n", pdfnName, peb));
// Look in XSM's (for open/created things)
PTSetMember *ptsm; if ((ptsm = _ppubdf->FindXSMember(pdfnName, GetName())) != NULL) { peb->luid = ptsm->GetName(); peb->dwType = ptsm->ObjectType(); } else { uie = _ulChanged.IsEntry(pdfnName, &pud); if (uie == UIE_CURRENT) { peb->luid = pud->GetLUID(); peb->dwType = pud->GetFlags() & ULF_TYPEFLAGS; } else if (uie == UIE_ORIGINAL || _pdfBase == NULL) { sc = STG_E_FILENOTFOUND; } else { sc = _pdfBase->IsEntry(pdfnName, peb); } } olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::IsEntry => %lu, %lu, %lu\n", sc, peb->luid, peb->dwType)); return sc; }
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::RenameEntry, public
//
// Synopsis: Renames an element of the DocFile
//
// Arguments: [pdfnName] - Current name
// [pdfnNewName] - New name
//
// Returns: Appropriate error code
//
// History: 09-Jan-92 DrewB Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::RenameEntry(CDfName const *pdfnName, CDfName const *pdfnNewName) { SCODE sc; SEntryBuffer eb;
olDebugOut((DEB_ITRACE, "In CWrappedDocFile::RenameEntry(%ws, %ws)\n", pdfnName, pdfnNewName));
olAssert(P_TRANSACTED(_df));
if (SUCCEEDED(sc = IsEntry(pdfnNewName, &eb))) olErr(EH_Err, STG_E_ACCESSDENIED) else if (sc != STG_E_FILENOTFOUND) olErr(EH_Err, sc);
olChk(IsEntry(pdfnName, &eb)); olMem(_ulChanged.Add(_pdfb->GetMalloc(), pdfnNewName, pdfnName, eb.luid, eb.dwType, NULL));
_ppubdf->RenameChild(pdfnName, GetName(), pdfnNewName);
olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::RenameEntry\n")); return S_OK;
EH_Err: return sc; }
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::DestroyEntry, public
//
// Synopsis: Permanently destroys a child
//
// Arguments: [pdfnName] - Name
// [fClean] - If true, remove create entry from update list
// rather than appending a delete update entry
//
// Returns: Appropriate error code
//
// History: 09-Jan-92 DrewB Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::DestroyEntry(CDfName const *pdfnName, BOOL fClean) { SCODE sc; SEntryBuffer eb;
olDebugOut((DEB_ITRACE, "In CWrappedDocFile::DestroyEntry:%p(%ws, %d)\n", this, pdfnName, fClean));
olAssert(P_TRANSACTED(_df));
if (fClean) { CUpdate *pud = NULL; UlIsEntry uie;
uie = _ulChanged.IsEntry(pdfnName, &pud); olAssert(uie == UIE_CURRENT); RevertUpdate(pud); _ulChanged.Delete(pud); } else { PTSetMember *ptsm;
olChk(IsEntry(pdfnName, &eb)); olMem(_ulChanged.Add(_pdfb->GetMalloc(), NULL, pdfnName, eb.luid, eb.dwType, NULL));
if ((ptsm = _ppubdf->FindXSMember(pdfnName, GetName())) != NULL) { olAssert(ptsm->GetName() != DF_NOLUID && aMsg("Can't destroy NOLUID XSM")); _ppubdf->DestroyChild(ptsm->GetName()); } }
olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::DestroyEntry\n")); return S_OK;
EH_Err: return sc; }
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::GetTime, public
//
// Synopsis: Gets a time
//
// Arguments: [wt] - Which time
// [ptm] - Time return
//
// Returns: Appropriate status code
//
// Modifies: [ptm]
//
// History: 31-Jul-92 DrewB Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::GetTime(WHICHTIME wt, TIME_T *ptm) { _tten.GetTime(wt, ptm); return S_OK; } //+--------------------------------------------------------------
//
// Member: CWrappedDocFile::GetAllTimes, public
//
// Synopsis: Gets all times
//
// Arguments: [patm] - Access Time
// [pmtm] - Modification Time
// [pctm] - Creation Time
//
// Returns: Appropriate status code
//
// Modifies: [atm], [mtm], [ctm]
//
// History: 26-May-95 SusiA Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::GetAllTimes(TIME_T *patm, TIME_T *pmtm, TIME_T *pctm) { _tten.GetAllTimes(patm, pmtm, pctm); return S_OK; } //+--------------------------------------------------------------
//
// Member: CWrappedDocFile::SetAllTimes, public
//
// Synopsis: Sets all time values
//
// Arguments: [atm] - Access Time
// [mtm] - Modification Time
// [ctm] - Creation Time
//
// Returns: Appropriate status code
//
// Modifies:
//
// History: 22-Nov-95 SusiA Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::SetAllTimes(TIME_T atm, TIME_T mtm, TIME_T ctm) { SetDirty((1 << WT_CREATION) | (1 << WT_MODIFICATION) |(1 << WT_ACCESS)); _tten.SetAllTimes(atm, mtm, ctm); return S_OK; }
//+--------------------------------------------------------------
//
// Member: CWrappedDocFile::SetTime, public
//
// Synopsis: Sets a time
//
// Arguments: [wt] - Which time
// [tm] - New time
//
// Returns: Appropriate status code
//
// History: 31-Jul-92 DrewB Created
//
//---------------------------------------------------------------
SCODE CWrappedDocFile::SetTime(WHICHTIME wt, TIME_T tm) { olAssert((1 << WT_CREATION) == DIRTY_CREATETIME); olAssert((1 << WT_MODIFICATION) == DIRTY_MODIFYTIME); olAssert((1 << WT_ACCESS) == DIRTY_ACCESSTIME); SetDirty(1 << wt); _tten.SetTime(wt, tm); return S_OK; }
//+---------------------------------------------------------------------------
//
// Member: CWrappedDocFile::GetClass, public
//
// Synopsis: Gets the class ID
//
// Arguments: [pclsid] - Class ID return
//
// Returns: Appropriate status code
//
// Modifies: [pclsid]
//
// History: 11-Nov-92 DrewB Created
//
//----------------------------------------------------------------------------
SCODE CWrappedDocFile::GetClass(CLSID *pclsid) { olDebugOut((DEB_ITRACE, "In CWrappedDocFile::GetClass:%p(%p)\n", this, pclsid)); *pclsid = _clsid; olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::GetClass\n")); return S_OK; }
//+---------------------------------------------------------------------------
//
// Member: CWrappedDocFile::SetClass, public
//
// Synopsis: Sets the class ID
//
// Arguments: [clsid] - New class ID
//
// Returns: Appropriate status code
//
// History: 11-Nov-92 DrewB Created
//
//----------------------------------------------------------------------------
SCODE CWrappedDocFile::SetClass(REFCLSID clsid) { olDebugOut((DEB_ITRACE, "In CWrappedDocFile::SetClass:%p(?)\n", this)); _clsid = clsid; SetDirty(DIRTY_CLASS); olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::SetClass\n")); return S_OK; }
//+---------------------------------------------------------------------------
//
// Member: CWrappedDocFile::GetStateBits, public
//
// Synopsis: Gets the state bits
//
// Arguments: [pgrfStateBits] - State bits return
//
// Returns: Appropriate status code
//
// Modifies: [pgrfStateBits]
//
// History: 11-Nov-92 DrewB Created
//
//----------------------------------------------------------------------------
SCODE CWrappedDocFile::GetStateBits(DWORD *pgrfStateBits) { olDebugOut((DEB_ITRACE, "In CWrappedDocFile::GetStateBits:%p(%p)\n", this, pgrfStateBits)); *pgrfStateBits = _grfStateBits; olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::GetStateBits\n")); return S_OK; }
//+---------------------------------------------------------------------------
//
// Member: CWrappedDocFile::SetStateBits, public
//
// Synopsis: Sets the state bits
//
// Arguments: [grfStateBits] - Bits to set
// [grfMask] - Mask
//
// Returns: Appropriate status code
//
// History: 11-Nov-92 DrewB Created
//
//----------------------------------------------------------------------------
SCODE CWrappedDocFile::SetStateBits(DWORD grfStateBits, DWORD grfMask) { olDebugOut((DEB_ITRACE, "In CWrappedDocFile::SetStateBits:%p(" "%lu, %lu)\n", this, grfStateBits, grfMask)); _grfStateBits = (_grfStateBits & ~grfMask) | (grfStateBits & grfMask); SetDirty(DIRTY_STATEBITS); olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::SetStateBits\n")); return S_OK; }
|