//+-------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1992. // // File: wdfstrm.cxx // // Contents: CWrappedDocFile stream methods // // History: 22-Jan-92 DrewB Created // //--------------------------------------------------------------- #include #pragma hdrstop #include //+-------------------------------------------------------------- // // Member: CWrappedDocFile::CreateStream, public // // Synopsis: Creates a wrapped stream // // Arguments: [pdfnName] - Name // [df] - Transactioning flags // [dlSet] - LUID to set or DF_NOLUID // [pppstStream] - Stream return // // Returns: Appropriate status code // // Modifies: [pppstStream] // // History: 09-Jan-92 DrewB Created // //--------------------------------------------------------------- SCODE CWrappedDocFile::CreateStream(CDfName const *pdfnName, DFLAGS const df, DFLUID dlSet, PSStream **ppsstStream) { SEntryBuffer eb; SCODE sc; CTransactedStream *pstWrapped; CUpdate *pud = NULL; olDebugOut((DEB_ITRACE, "In CWrappedDocFile::CreateStream(" "%ws, %X, %lu, %p)\n", pdfnName, df, dlSet, ppsstStream)); if (SUCCEEDED(IsEntry(pdfnName, &eb))) olErr(EH_Err, STG_E_FILEALREADYEXISTS); olAssert(P_TRANSACTED(_df)); if (dlSet == DF_NOLUID) dlSet = CTransactedStream::GetNewLuid(_pdfb->GetMalloc()); pstWrapped = GetReservedStream(pdfnName, dlSet, _df); if (!P_NOUPDATE(df)) { olMemTo(EH_pstWrapped, (pud = _ulChanged.Add(_pdfb->GetMalloc(), pdfnName, NULL, dlSet, STGTY_STREAM, pstWrapped))); } if (pstWrapped != NULL) { olChkTo(EH_pud, pstWrapped->Init(NULL)); _ppubdf->AddXSMember(this, pstWrapped, dlSet); } *ppsstStream = pstWrapped; olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::CreateStream => %p\n", *ppsstStream)); return S_OK; EH_pud: if (pud) _ulChanged.Delete(pud); EH_pstWrapped: pstWrapped->ReturnToReserve(BP_TO_P(CDFBasis *, _pdfb)); EH_Err: return sc; } //+-------------------------------------------------------------- // // Member: CWrappedDocFile::GetStream, public // // Synopsis: Instantiates a wrapped stream // // Arguments: [pdfnName] - Name // [df] - Permissions // [pppstStream] - Stream return // // Returns: Appropriate status code // // Modifies: [pppstStream] // // History: 09-Jan-92 DrewB Created // //--------------------------------------------------------------- SCODE CWrappedDocFile::GetStream(CDfName const *pdfnName, DFLAGS const df, PSStream **ppsstStream) { PSStream *psstNew; PTSetMember *ptsm; CTransactedStream *pstWrapped; SCODE sc; olDebugOut((DEB_ITRACE, "In CWrappedDocFile::GetStream(" "%ws, %X, %p)\n", pdfnName, df, ppsstStream)); olAssert(P_TRANSACTED(_df)); // Look for this name in this level transaction set if ((ptsm = _ppubdf->FindXSMember(pdfnName, GetName())) != NULL) { if (ptsm->ObjectType() != STGTY_STREAM) olErr(EH_Err, STG_E_FILENOTFOUND); ptsm->AddRef(); *ppsstStream = (CTransactedStream *)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 { // We didn't find it here, so we need to ask our parent // Find the right name to ask of the parent 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->GetStream(pdfnRealName, df, &psstNew)); olAssert(psstNew->GetLuid() != DF_NOLUID && aMsg("Stream id is DF_NOLUID!")); #ifdef USE_NOSCRATCH olMemTo(EH_Get, pstWrapped = new(_pdfb->GetMalloc()) CTransactedStream(pdfnName, psstNew->GetLuid(), _df, _pdfb->GetBaseMultiStream(), _pdfb->GetScratch())); #else olMemTo(EH_Get, pstWrapped = new(_pdfb->GetMalloc()) CTransactedStream(pdfnName, psstNew->GetLuid(), _df, _pdfb->GetScratch())); #endif olChkTo(EH_pstWrapped, pstWrapped->Init(psstNew)); *ppsstStream = pstWrapped; _ppubdf->AddXSMember(this, pstWrapped, pstWrapped->GetLuid()); } olDebugOut((DEB_ITRACE, "Out CWrappedDocFile::GetStream => %p\n", *ppsstStream)); return S_OK; EH_pstWrapped: delete pstWrapped; EH_Get: psstNew->Release(); EH_Err: return sc; }