windows-nt/Source/XPSP1/NT/com/ole32/stg/ref/props/psetstg.hxx
2020-09-26 16:20:57 +08:00

194 lines
5.5 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: psetstg.hxx
//
// Contents: Header for class which provides common implementation of
// IPropertySetStorage.
//
// Classes: CPropertySetStorage
//
// History: 17-Mar-93 BillMo Created.
//
// Notes:
//
//--------------------------------------------------------------------------
#ifndef _PSETSTG_HXX_
#define _PSETSTG_HXX_
#include "h/stgprops.hxx"
#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 native and docfile
// IStorage objects.
//
// Notes:
//
//--------------------------------------------------------------------------
class CPropertySetStorage : public IPropertySetStorage
{
public:
inline CPropertySetStorage(IPrivateStorage *pprivstg);
inline ~CPropertySetStorage();
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);
private:
inline HRESULT Validate();
private:
ULONG _ulSig;
IPrivateStorage * _pprivstg;
};
//+-------------------------------------------------------------------
//
// Member: CPropertySetStorage::CPropertySetStorage
//
// Synopsis: Initialize the generic property storage object.
//
// Arguments: [pstg]
//
// Notes: The passed [pstg] is saved and then passed into
// the CPropertySet object when it is created on
// Open or Create. Open and Create use it to get a
// matching implementation of mapped stream.
//
// The lifetime of pstg is provided by the fact that
// CPropertySetStorage is a base class of the IStorage.
//
//--------------------------------------------------------------------
CPropertySetStorage::CPropertySetStorage(IPrivateStorage *pprivstg) :
_pprivstg(pprivstg),
_ulSig(PROPERTYSETSTORAGE_SIG)
{
}
//+-------------------------------------------------------------------
//
// Member: CPropertySetStorage::~CPropertySetStorage
//
// Synopsis: Delete the object and set the deletion signature.
//
//--------------------------------------------------------------------
CPropertySetStorage::~CPropertySetStorage()
{
_ulSig = PROPERTYSETSTORAGE_SIGDEL;
}
//+-------------------------------------------------------------------
//
// Member: CPropertySetStorage::Validate
//
// Synopsis: Validate signature.
//
//--------------------------------------------------------------------
inline HRESULT CPropertySetStorage::Validate()
{
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[8];
ULONG _cstatTotalInArray;
ULONG _istatNextToRead;
};
//+-------------------------------------------------------------------
//
// Member: CEnumSTATPROPSETSTG::Validate
//
// Synopsis: Validate signature.
//
//--------------------------------------------------------------------
inline HRESULT CEnumSTATPROPSETSTG::Validate()
{
return _ulSig == ENUMSTATPROPSETSTG_SIG ? S_OK : STG_E_INVALIDHANDLE;
}
#endif