//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1992. // // File: pbstream.hxx // // Contents: CPubStream definition // // Classes: CPubStream // // History: 16-Jan-92 PhilipLa Created. // 12-Jun-96 MikeHill Moved the body of the FlushNoException // method to the new Write method (except for // the Commit). Made Flush & FlushNoException // inline. // 21-Jun-96 MikeHill Declare CPubMappedStream::_pb as based. // 01-Jul-96 MikeHill - Adjust signatures for Win32 SEH removal. // - Added _powner member to CPubMappedStream. // 11-Feb-97 Danl - Make CPubMappedStream inherit from // IMappedStream and stub IUnknowns. // //-------------------------------------------------------------------------- #ifndef __PBSTREAM_HXX__ #define __PBSTREAM_HXX__ #include #include #include #include class CPubDocFile; class CPubStream; SAFE_DFBASED_PTR (CBasedPubStreamPtr, CPubStream); SAFE_DFBASED_PTR (CBasedMappedStreamPtr, IMappedStream); //+-------------------------------------------------------------- // // Class: CPubMappedStream // // Purpose: Structure that lives in shared memory for // mapped stream implementation. // // History: 1-May-95 BillMo Created. // // Notes: // //--------------------------------------------------------------- #ifdef NEWPROPS class CPubMappedStream { public: CPubMappedStream(CPubStream *pst) { _pb = NULL; _cbUsed = 0; _cbOriginalStreamSize = 0; _fDirty = FALSE; _fLowMem = FALSE; _fChangePending = FALSE; _pst = P_TO_BP(CBasedPubStreamPtr, pst); _powner = NULL; } ~CPubMappedStream() { msfAssert(_pb == NULL); } VOID Open(IN NTPROP np, OUT LONG *phr); VOID Close(OUT LONG *phr); VOID ReOpen(IN OUT VOID **ppv, OUT LONG *phr); VOID Quiesce(VOID); VOID Map(IN BOOLEAN fCreate, OUT VOID **ppv); VOID Unmap(IN BOOLEAN fFlush, IN OUT VOID **ppv); VOID Flush(OUT LONG *phr); ULONG GetSize(OUT LONG *phr); VOID SetSize(IN ULONG cb, IN BOOLEAN fPersistent, IN OUT VOID **ppv, OUT LONG *phr); NTSTATUS Lock(IN BOOLEAN fExclusive); NTSTATUS Unlock(VOID); VOID QueryTimeStamps(OUT STATPROPSETSTG *pspss, BOOLEAN fNonSimple) const; BOOLEAN QueryModifyTime(OUT LONGLONG *pll) const; BOOLEAN QuerySecurity(OUT ULONG *pul) const; BOOLEAN IsWriteable(VOID) const; BOOLEAN IsModified(VOID) const; VOID SetModified(OUT LONG *phr); HANDLE GetHandle(VOID) const; #if DBG BOOLEAN SetChangePending(BOOLEAN fChangePending); BOOLEAN IsNtMappedStream(VOID) const; #endif inline IMalloc * GetMalloc(VOID); inline VOID Cleanup(VOID); HRESULT Write (); #if DBG inline ULONG BytesCommitted(VOID) { return _cbUsed; } VOID DfpdbgFillUnusedMemory(VOID); VOID DfpdbgCheckUnusedMemory(VOID); #else VOID DfpdbgFillUnusedMemory(VOID) {} VOID DfpdbgCheckUnusedMemory(VOID) {} #endif private: CBasedPubStreamPtr _pst; CBasedBytePtr _pb; ULONG _cbUsed; ULONG _cbOriginalStreamSize; BOOLEAN _fDirty; BOOLEAN _fLowMem; BOOLEAN _fChangePending; CBasedBytePtr _powner; // Owner of this mapped stream. }; // class CPubMappedstream #endif //+-------------------------------------------------------------- // // Class: CPubStream // // Purpose: Public stream interface // // Interface: See below // // History: 16-Jan-92 PhilipLa Created. // //--------------------------------------------------------------- class CPubStream : public PRevertable { public: CPubStream(CPubDocFile *ppdf, DFLAGS df, CDfName const *pdfn); ~CPubStream(); void Init(PSStream *psParent, DFLUID dlLUID); inline void vAddRef(void); void vRelease(void); // PRevertable void RevertFromAbove(void); #ifdef NEWPROPS SCODE FlushBufferedData(int recursionlevel); #endif SCODE Stat(STATSTGW *pstatstg, DWORD grfStatFlag); #ifdef LARGE_STREAMS inline SCODE ReadAt(ULONGLONG ulOffset, #else inline SCODE ReadAt(ULONG ulOffset, #endif VOID *pb, ULONG cb, ULONG STACKBASED *pcbRead); #ifdef LARGE_STREAMS inline SCODE WriteAt(ULONGLONG ulOffset, #else inline SCODE WriteAt(ULONG ulOffset, #endif VOID const HUGEP *pb, ULONG cb, ULONG STACKBASED *pcbWritten); #ifdef LARGE_STREAMS inline SCODE GetSize(ULONGLONG *pcb); inline SCODE SetSize(ULONGLONG cb); #else inline SCODE GetSize(ULONG *pcb); inline SCODE SetSize(ULONG cb); #endif inline PSStream *GetSt(void) const; #ifdef NEWPROPS inline CPubMappedStream & GetMappedStream(void); inline const CPubMappedStream & GetConstMappedStream(void); #endif inline SCODE CheckReverted(void) const; inline ULONG GetTransactedDepth () const; inline void SetClean(void); inline void SetDirty(void); SCODE Commit(DWORD dwFlags); inline void EmptyCache (); private: CBasedSStreamPtr _psParent; CBasedPubDocFilePtr _ppdfParent; BOOL _fDirty; LONG _cReferences; #ifdef NEWPROPS CPubMappedStream _PubMappedStream; #endif }; //+-------------------------------------------------------------- // // Member: CPubStream::CheckReverted, public // // Synopsis: Returns revertedness // // History: 11-Aug-92 DrewB Created // //--------------------------------------------------------------- inline SCODE CPubStream::CheckReverted(void) const { return P_REVERTED(_df) ? STG_E_REVERTED : S_OK; } //+-------------------------------------------------------------- // // Member: CPubStream::AddRef, public // // Synopsis: Increments the ref count // // History: 26-Feb-92 DrewB Created // //--------------------------------------------------------------- inline void CPubStream::vAddRef(void) { InterlockedIncrement(&_cReferences); } //+-------------------------------------------------------------- // // Member: CPubStream::GetSt, public // // Synopsis: Returns _psParent // // History: 26-Feb-92 DrewB Created // //--------------------------------------------------------------- inline PSStream *CPubStream::GetSt(void) const { return BP_TO_P(PSStream *, _psParent); } //+-------------------------------------------------------------- // // Member: CPubStream::GetMappedStream, public // // Synopsis: Returns this as a CPubMappedStream // // History: 26-May-95 BillMo Created // //--------------------------------------------------------------- #ifdef NEWPROPS inline CPubMappedStream & CPubStream::GetMappedStream(void) { return _PubMappedStream; } inline const CPubMappedStream & CPubStream::GetConstMappedStream(void) { return _PubMappedStream; } #endif //+--------------------------------------------------------------------------- // // Member: CPubStream::SetClean, public // // Synopsis: Resets the dirty flag // // History: 11-Nov-92 DrewB Created // //---------------------------------------------------------------------------- inline void CPubStream::SetClean(void) { _fDirty = FALSE; } //+--------------------------------------------------------------------------- // // Member: CPubStream::SetDirty, public // // Synopsis: Sets the dirty flag // // History: 11-Nov-92 DrewB Created // //---------------------------------------------------------------------------- inline void CPubStream::SetDirty(void) { _fDirty = TRUE; _ppdfParent->SetDirty(); } //+------------------------------------------------------------------------- // // Method: CPubStream::ReadAt, public // // Synopsis: Read from a stream // // Arguments: [ulOffset] - Byte offset to read from // [pb] - Buffer // [cb] - Count of bytes to read // [pcbRead] - Return number of bytes actually read // // Returns: Appropriate status code // // Modifies: [pcbRead] // // History: 16-Jan-92 PhilipLa Created. // //-------------------------------------------------------------------------- #ifdef LARGE_STREAMS inline SCODE CPubStream::ReadAt(ULONGLONG ulOffset, #else inline SCODE CPubStream::ReadAt(ULONG ulOffset, #endif VOID *pb, ULONG cb, ULONG STACKBASED *pcbRead) { SCODE sc; if (SUCCEEDED(sc = CheckReverted())) if (!P_READ(_df)) sc = STG_E_ACCESSDENIED; else sc = _psParent->ReadAt(ulOffset,pb,cb,pcbRead); return sc; } //+------------------------------------------------------------------------- // // Method: CPubStream::WriteAt, public // // Synopsis: Write to a stream // // Arguments: [ulOffset] - Byte offset to write at // [pb] - Buffer // [cb] - Count of bytes to write // [pcbWritten] - Return number of bytes actually written // // Returns: Appropriate status code // // Modifies: [pcbWritten] // // History: 16-Jan-92 PhilipLa Created. // //-------------------------------------------------------------------------- #ifdef LARGE_STREAMS inline SCODE CPubStream::WriteAt(ULONGLONG ulOffset, #else inline SCODE CPubStream::WriteAt(ULONG ulOffset, #endif VOID const HUGEP *pb, ULONG cb, ULONG STACKBASED *pcbWritten) { SCODE sc; if (SUCCEEDED(sc = CheckReverted())) if (!P_WRITE(_df)) sc = STG_E_ACCESSDENIED; else { sc = _psParent->WriteAt(ulOffset,pb,cb,pcbWritten); if (SUCCEEDED(sc)) SetDirty(); } return sc; } //+-------------------------------------------------------------- // // Member: CPubStream::GetSize, public // // Synopsis: Gets the size of the stream // // Arguments: [pcb] - Stream size return // // Returns: Appropriate status code // // Modifies: [pcb] // // History: 30-Apr-92 DrewB Created // //--------------------------------------------------------------- #ifdef LARGE_STREAMS inline SCODE CPubStream::GetSize(ULONGLONG *pcb) #else inline SCODE CPubStream::GetSize(ULONG *pcb) #endif { SCODE sc; if (SUCCEEDED(sc = CheckReverted())) _psParent->GetSize(pcb); return sc; } //+------------------------------------------------------------------------- // // Member: CPubStream::SetSize, public // // Synposis: Set the size of a linear stream // // Arguments: [ulNewSize] -- New size for stream // // Returns: Error code returned by MStream call. // // Algorithm: Pass call up to parent. // // History: 29-Jul-91 PhilipLa Created. // 16-Jan-92 PhilipLa Moved from CSStream to CPubStream // //--------------------------------------------------------------------------- #ifdef LARGE_STREAMS inline SCODE CPubStream::SetSize(ULONGLONG ulNewSize) #else inline SCODE CPubStream::SetSize(ULONG ulNewSize) #endif { SCODE sc; if (SUCCEEDED(sc = CheckReverted())) if (!P_WRITE(_df)) sc = STG_E_ACCESSDENIED; else { sc = _psParent->SetSize(ulNewSize); if (SUCCEEDED(sc)) SetDirty(); } return sc; } //+------------------------------------------------------------------------- // // Member: CPubStream::EmptyCache, public // // Synposis: empties the stream cache for compaction // // History: 29-Jul-99 HenryLee Created. // //--------------------------------------------------------------------------- inline void CPubStream::EmptyCache () { _psParent->EmptyCache(); } //+-------------------------------------------------------------- // // Member: CPubStream::GetTransactedDepth, public // // Synopsis: Returns transaction depth level from parent // // History: 11-Aug-92 DrewB Created // //--------------------------------------------------------------- inline ULONG CPubStream::GetTransactedDepth() const { return _ppdfParent->GetTransactedDepth(); } //+------------------------------------------------------------------------- // // Member: CPubMappedStream::GetMalloc, public // // Synposis: Get the allocator for the stream. // //--------------------------------------------------------------------------- #ifdef NEWPROPS inline IMalloc * CPubMappedStream::GetMalloc(void) { return &g_smAllocator; } inline VOID CPubMappedStream::Cleanup(VOID) { if (!_fLowMem) GetMalloc()->Free(BP_TO_P(BYTE *, _pb)); _pb = NULL; } #endif #endif //__PBSTREAM_HXX__