//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1993. // // File: psetstg.hxx // // Contents: Header for classes which provides common implementation of // IPropertySetStorage. CPropertySetStorage is a generic // implementation. // // Classes: CPropertySetStorage // // History: 17-Mar-93 BillMo Created. // 18-Aug-96 MikeHill Updated for StgCreatePropSet APIs. // 07-Feb-97 Danl Removed CDocFilePropertySetStorage. // 5/18/98 MikeHill // - Cleaned up CPropertySetStorage constructor by moving // some parameters to a new Init method. // - Added bool to cleanly determine if IStorage is ref-ed. // // Notes: // //-------------------------------------------------------------------------- #ifndef _PSETSTG_HXX_ #define _PSETSTG_HXX_ #include #include "utils.hxx" // // Mapped Stream Option Flags used by propapi and docfile. // This tells CPropertySetStorage constructor to either Create or // QueryInterface for the mapped stream. // enum MAPPED_STREAM_OPTS { MAPPED_STREAM_CREATE, MAPPED_STREAM_QI }; #define PROPERTYSETSTORAGE_SIG LONGSIG('P','S','S','T') #define PROPERTYSETSTORAGE_SIGDEL LONGSIG('P','S','S','t') #define ENUMSTATPROPSETSTG_SIG LONGSIG('S','P','S','S') #define ENUMSTATPROPSETSTG_SIGDEL LONGSIG('S','P','S','s') //+------------------------------------------------------------------------- // // Class: CPropertySetStorage // // Purpose: Implementation of IPropertySetStorage for generic // IStorage objects. // //-------------------------------------------------------------------------- class CPropertySetStorage : public IPropertySetStorage { public: // ------------ // Construction // ------------ CPropertySetStorage( MAPPED_STREAM_OPTS MSOpts ); ~CPropertySetStorage(); void Init( IStorage *pstg, IBlockingLock *pBlockingLock, BOOL fControlLifetimes ); // ------------------- // IPropertySetStorage // ------------------- STDMETHOD(QueryInterface)( REFIID riid, void **ppvObject); STDMETHOD_(ULONG,AddRef)(void); STDMETHOD_(ULONG,Release)(void); STDMETHOD(Create)( REFFMTID rfmtid, const CLSID * pclsid, DWORD grfFlags, DWORD grfMode, IPropertyStorage ** ppprstg); STDMETHOD(Open)( REFFMTID rfmtid, DWORD grfMode, IPropertyStorage ** ppprstg); STDMETHOD(Delete)( REFFMTID rfmtid); STDMETHOD(Enum)( IEnumSTATPROPSETSTG ** ppenum); // ---------------- // Internal Methods // ---------------- protected: VOID Lock(); VOID Unlock(); HRESULT CreateUserDefinedStream ( IStorage * pstg, CPropSetName & psn, DWORD grfMode, BOOL * pfCreated, IStream ** ppStream ); inline HRESULT Validate(); // ------------ // Data Members // ------------ protected: ULONG _ulSig; BOOL _fContainingStgIsRefed:1; IStorage *_pstg; MAPPED_STREAM_OPTS _MSOpts; IBlockingLock * _pBlockingLock; #ifndef _MAC CRITICAL_SECTION _CriticalSection; BOOL _fInitCriticalSection; #endif LONG _cReferences; }; //+------------------------------------------------------------------- // // Member: CPropertySetStorage::~CPropertySetStorage // // Synopsis: Set the deletion signature. // //-------------------------------------------------------------------- inline CPropertySetStorage::~CPropertySetStorage() { _ulSig = PROPERTYSETSTORAGE_SIGDEL; #ifndef _MAC if (_fInitCriticalSection) DeleteCriticalSection( &_CriticalSection ); #endif if( _fContainingStgIsRefed ) _pstg->Release(); } //+------------------------------------------------------------------- // // Member: CPropertySetStorage::CPropertySetStorage // // Synopsis: Initialize the generic property storage object. // // Arguments: [MAPPED_STREAM_OPTS] fMSOpts // Flag that indicates whether to Create or QI for the // mapped stream. // // Note: This routine doesn't AddRef pstg or pBlockingLock because of the way this class // is used in the docfile class hierarchy. The life of pstg is // coupled to the life of CExposedDocfile. // //-------------------------------------------------------------------- inline CPropertySetStorage::CPropertySetStorage( MAPPED_STREAM_OPTS MSOpts ) { _ulSig = PROPERTYSETSTORAGE_SIG; _fContainingStgIsRefed = FALSE; _cReferences = 1; _pBlockingLock = NULL; _pstg = NULL; _MSOpts = MSOpts; #ifndef _MAC _fInitCriticalSection = FALSE; __try { InitializeCriticalSection( &_CriticalSection ); _fInitCriticalSection = TRUE; } __except( EXCEPTION_EXECUTE_HANDLER ) { } #endif } //+------------------------------------------------------------------- // // Member: CPropertySetStorage::Validate // // Synopsis: Validate signature. // //-------------------------------------------------------------------- inline HRESULT CPropertySetStorage::Validate() { if( !_fInitCriticalSection ) return E_OUTOFMEMORY; else return _ulSig == PROPERTYSETSTORAGE_SIG ? S_OK : STG_E_INVALIDHANDLE; } //+------------------------------------------------------------------------- // // Class: CEnumSTATPROPSETSTG // // Purpose: Implementation of IEnumSTATPROPSETSTG for native and docfile // IStorage objects. // // Notes: // //-------------------------------------------------------------------------- class CEnumSTATPROPSETSTG : public IEnumSTATPROPSETSTG { public: // for IPropertySetStorage::Enum CEnumSTATPROPSETSTG(IStorage *pstg, HRESULT *phr); // for IEnumSTATPROPSETSTG::Clone CEnumSTATPROPSETSTG(CEnumSTATPROPSETSTG &Other, HRESULT *phr); ~CEnumSTATPROPSETSTG(); STDMETHOD(QueryInterface)( REFIID riid, void **ppvObject); STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void); STDMETHOD(Next)(ULONG celt, STATPROPSETSTG * rgelt, ULONG * pceltFetched); // We don't need RemoteNext. STDMETHOD(Skip)(ULONG celt); STDMETHOD(Reset)(); STDMETHOD(Clone)(IEnumSTATPROPSETSTG ** ppenum); private: inline HRESULT Validate(); VOID CleanupStatArray(); private: ULONG _ulSig; LONG _cRefs; IEnumSTATSTG * _penumSTATSTG; STATSTG _statarray[1]; ULONG _cstatTotalInArray; ULONG _istatNextToRead; }; //+------------------------------------------------------------------- // // Member: CEnumSTATPROPSETSTG::Validate // // Synopsis: Validate signature. // //-------------------------------------------------------------------- inline HRESULT CEnumSTATPROPSETSTG::Validate() { return _ulSig == ENUMSTATPROPSETSTG_SIG ? S_OK : STG_E_INVALIDHANDLE; } #endif