//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1992. // // File: expst.hxx // // Contents: CExposedStream definition // // Classes: CExposedStream // // Functions: // // History: 28-Feb-92 PhilipLa Created. // //-------------------------------------------------------------------------- #ifndef __EXPST_HXX__ #define __EXPST_HXX__ #include #include #include "lock.hxx" #include #include #include #include class CPubStream; class CPubMappedStream; class CDFBasis; interface ILockBytes; class CSeekPointer; SAFE_DFBASED_PTR(CBasedSeekPointerPtr, CSeekPointer); //+-------------------------------------------------------------- // // Class: CExposedStream (est) // // Purpose: Public stream interface // // Interface: See below // // History: 28-Feb-92 PhilipLa Created. // //--------------------------------------------------------------- interface CExposedStream: public IStream, public IMarshal, public CMallocBased #ifdef NEWPROPS , public IMappedStream #endif #ifdef POINTER_IDENTITY , public CMarshalList #endif #ifdef ASYNC , public CAsyncConnectionContainer #endif { public: CExposedStream(void); SCODE Init(CPubStream *pst, CDFBasis *pdfb, CPerContext *ppc, CSeekPointer *psp); #ifdef ASYNC SCODE InitMarshal(CPubStream *pst, CDFBasis *pdfb, CPerContext *ppc, DWORD dwAsyncFlags, IDocfileAsyncConnectionPoint *pdacp, CSeekPointer *psp); #endif ~CExposedStream(void); // From IUnknown STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj); STDMETHOD_(ULONG,AddRef)(void); STDMETHOD_(ULONG,Release)(void); // IMarshal STDMETHOD(GetUnmarshalClass)(REFIID riid, LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, LPCLSID pCid); STDMETHOD(GetMarshalSizeMax)(REFIID riid, LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, LPDWORD pSize); STDMETHOD(MarshalInterface)(IStream *pStm, REFIID riid, LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags); STDMETHOD(UnmarshalInterface)(IStream *pStm, REFIID riid, LPVOID *ppv); static SCODE StaticReleaseMarshalData(IStream *pstStm, DWORD mshlflags); STDMETHOD(ReleaseMarshalData)(IStream *pStm); STDMETHOD(DisconnectObject)(DWORD dwReserved); // New methods STDMETHOD(Read)(VOID HUGEP *pv, ULONG cb, ULONG *pcbRead); STDMETHOD(Write)(VOID const HUGEP *pv, ULONG cb, ULONG *pcbWritten); STDMETHOD(Seek)(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition); STDMETHOD(SetSize)(ULARGE_INTEGER cb); STDMETHOD(CopyTo)(IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten); STDMETHOD(Commit)(DWORD grfCommitFlags); STDMETHOD(Revert)(void); STDMETHOD(LockRegion)(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); STDMETHOD(UnlockRegion)(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag); STDMETHOD(Clone)(IStream **ppstm); // IMappedStream methods STDMETHODIMP_(VOID) Open(IN NTPROP np, OUT LONG *phr); STDMETHODIMP_(VOID) Close(OUT LONG *phr); STDMETHODIMP_(VOID) ReOpen(IN OUT VOID **ppv, OUT LONG *phr); STDMETHODIMP_(VOID) Quiesce(VOID); STDMETHODIMP_(VOID) Map(IN BOOLEAN fCreate, OUT VOID **ppv); STDMETHODIMP_(VOID) Unmap(IN BOOLEAN fFlush, IN OUT VOID **ppv); STDMETHODIMP_(VOID) Flush(OUT LONG *phr); STDMETHODIMP_(ULONG) GetSize(OUT LONG *phr); STDMETHODIMP_(VOID) SetSize(IN ULONG cb, IN BOOLEAN fPersistent, IN OUT VOID **ppv, OUT LONG *phr); STDMETHODIMP_(NTSTATUS) Lock(IN BOOLEAN fExclusive); STDMETHODIMP_(NTSTATUS) Unlock(VOID); STDMETHODIMP_(VOID) QueryTimeStamps(OUT STATPROPSETSTG *pspss, BOOLEAN fNonSimple) const; STDMETHODIMP_(BOOLEAN) QueryModifyTime(OUT LONGLONG *pll) const; STDMETHODIMP_(BOOLEAN) QuerySecurity(OUT ULONG *pul) const; STDMETHODIMP_(BOOLEAN) IsWriteable(VOID) const; STDMETHODIMP_(BOOLEAN) IsModified(VOID) const; STDMETHODIMP_(VOID) SetModified(OUT LONG *phr); STDMETHODIMP_(HANDLE) GetHandle(VOID) const; #if DBG STDMETHODIMP_(BOOLEAN) SetChangePending(BOOLEAN fChangePending); STDMETHODIMP_(BOOLEAN) IsNtMappedStream(VOID) const; #endif inline CPubMappedStream & GetMappedStream(void) const; inline const CPubMappedStream & GetConstMappedStream(void) const; inline SCODE Validate(void) const; inline CPubStream *GetPub(void) const; static SCODE Unmarshal(IStream *pstm, void **ppv, DWORD mshlflags); private: SCODE CopyToWorker(IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten, CSafeSem *pss); CBasedPubStreamPtr _pst; CBasedDFBasisPtr _pdfb; CPerContext *_ppc; ULONG _sig; LONG _cReferences; CBasedSeekPointerPtr _psp; #ifdef DIRECTWRITERLOCK HRESULT ValidateWriteAccess(); #endif }; SAFE_INTERFACE_PTR(SafeCExposedStream, CExposedStream); #define CEXPOSEDSTREAM_SIG LONGSIG('E', 'X', 'S', 'T') #define CEXPOSEDSTREAM_SIGDEL LONGSIG('E', 'x', 'S', 't') //+-------------------------------------------------------------- // // Member: CExposedStream::Validate, public // // Synopsis: Validates the object signature // // Returns: Returns STG_E_INVALIDHANDLE for bad signatures // // History: 17-Mar-92 DrewB Created // //--------------------------------------------------------------- inline SCODE CExposedStream::Validate(void) const { olChkBlocks((DBG_FAST)); return (this == NULL || _sig != CEXPOSEDSTREAM_SIG) ? STG_E_INVALIDHANDLE : S_OK; } //+-------------------------------------------------------------- // // Member: CExposedStream::GetPub, public // // Synopsis: Returns the public // // History: 28-Feb-92 DrewB Created // //--------------------------------------------------------------- inline CPubStream *CExposedStream::GetPub(void) const { #ifdef MULTIHEAP // The tree mutex must be taken before calling this routine // CSafeMultiHeap smh(_ppc); // optimization #endif return BP_TO_P(CPubStream *, _pst); } #ifdef NEWPROPS inline CPubMappedStream & CExposedStream::GetMappedStream(void) const { return _pst->GetMappedStream(); } inline const CPubMappedStream & CExposedStream::GetConstMappedStream(void) const { return _pst->GetConstMappedStream(); } #endif #endif // #ifndef __EXPST_HXX__