windows-nt/Source/XPSP1/NT/com/ole32/stg/ref/expdf.hxx

401 lines
13 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+--------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996.
//
// File: expdf.hxx
//
// Contents: Exposed DocFile header
//
// Classes: CExposedDocFile
//
// Notes:
// The CExposedDocFile class is the implementation
// of IStorage. It implements IPropertySetStorage
// by inheriting from CPropertySetStorage. CPropertySetStorage
// implements all the functionality of IPropertySetStorage.
//
// Note that this interface is solely UNICODE, the ASCII layer
// support which is present if _UNICODE is not defined, provides
// the overloaded functions that handles the ASCII to Unicode
// conversion.
//
//
//---------------------------------------------------------------
#ifndef __EXPDF_HXX__
#define __EXPDF_HXX__
#include "h/dfmsp.hxx"
#include "dfbasis.hxx"
#include "h/revert.hxx"
#include "h/cdocfile.hxx"
#include "h/chinst.hxx"
#ifdef NEWPROPS
#include "props/h/windef.h"
#include "props/psetstg.hxx"
#endif
// CopyDocFileToIStorage flags
#define COPY_STORAGES 1
#define COPY_STREAMS 2
#define COPY_PROPERTIES 4
#define COPY_ALL (COPY_STORAGES | COPY_STREAMS | COPY_PROPERTIES)
class CDocFile;
interface CExposedStream;
class CPropertySetStorage;
//+--------------------------------------------------------------
//
// Class: CExposedDocFile (df)
//
// Purpose: Exposed DocFile class
//
// Note: PRevertable is a general virtual class base that
// handles updates to the storage elements. E.g.
// when an IStorage parent is deleted, the children
// underneadth them will have the reverted state.
//
// IPrivateStorage is a virtual class which has the functionality
// of returning the IStorage interface pointer. It is used by the
// propertyset interfaces to access the IStorage functions of
// CExposedDocfile.
//
//---------------------------------------------------------------
interface CExposedDocFile
:
public IStorage,
public IRootStorage,
#ifdef NEWPROPS
public CPropertySetStorage,
public IPrivateStorage,
#endif
public PRevertable
{
public:
CExposedDocFile( CExposedDocFile *pdfParent,
CDocFile *pdf,
DFLAGS const df,
DFLUID luid,
ILockBytes *pilbBase,
CDfName const *pdfn,
CMStream* pmsBase,
CDFBasis *pdfb);
virtual ~CExposedDocFile(void);
// From IUnknown
STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj);
STDMETHOD_(ULONG,AddRef)(void);
STDMETHOD_(ULONG,Release)(void);
// IStorage
STDMETHOD(Commit)(DWORD grfCommitFlags);
STDMETHOD(Revert)(void);
STDMETHOD(EnumElements)(DWORD reserved1,
void *reserved2,
DWORD reserved3,
IEnumSTATSTG **ppenm);
STDMETHOD(SetClass)(REFCLSID clsid);
STDMETHOD(SetStateBits)(DWORD grfStateBits, DWORD grfMask);
// functions that uses char/wchar directly or indirectly
STDMETHOD(CreateStream)(TCHAR const *pwcsName,
DWORD grfMode,
DWORD reserved1,
DWORD reserved2,
IStream **ppstm);
STDMETHOD(OpenStream)(TCHAR const *pwcsName,
void *reserved1,
DWORD grfMode,
DWORD reserved2,
IStream **ppstm);
STDMETHOD(CreateStorage)(TCHAR const *pwcsName,
DWORD grfMode,
DWORD reserved1,
DWORD reserved2,
IStorage **ppstg);
STDMETHOD(OpenStorage)(TCHAR const *pwcsName,
IStorage *pstgPriority,
DWORD grfMode,
SNB snbExclude,
DWORD reserved,
IStorage **ppstg);
STDMETHOD(CopyTo)(DWORD ciidExclude,
IID const *rgiidExclude,
SNB snbExclude,
IStorage *pstgDest);
STDMETHOD(MoveElementTo)(TCHAR const *lpszName,
IStorage *pstgDest,
TCHAR const *lpszNewName,
DWORD grfFlags);
STDMETHOD(DestroyElement)(TCHAR const *pwcsName);
STDMETHOD(RenameElement)(TCHAR const *pwcsOldName,
TCHAR const *pwcsNewName);
STDMETHOD(SetElementTimes)(const TCHAR *lpszName,
FILETIME const *pctime,
FILETIME const *patime,
FILETIME const *pmtime);
STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag);
private:
SCODE CreateExposedStream( CDfName const *pdfnName,
DFLAGS const df,
CExposedStream **ppStream);
SCODE GetExposedStream( CDfName const *pdfnName,
DFLAGS const df,
CExposedStream **ppStream);
SCODE CreateExposedDocFile(CDfName const *pdfnName,
DFLAGS const df,
CExposedDocFile **ppdfDocFile);
SCODE GetExposedDocFile( CDfName const *pdfnName,
DFLAGS const df,
CExposedDocFile **ppdfDocFile);
SCODE DestroyEntry( CDfName const *pdfnName, BOOL fClean);
SCODE RenameEntry(CDfName const *pdfnName,
CDfName const *pdfnNewName);
#ifndef _UNICODE // the real code will map to the
// block above if we are using UNICODE
private:
// internal functions that uses wide character
SCODE CreateStream(WCHAR const *pwcsName,
DWORD grfMode,
DWORD reserved1,
DWORD reserved2,
IStream **ppstm);
SCODE OpenStream(WCHAR const *pwcsName,
void *reserved1,
DWORD grfMode,
DWORD reserved2,
IStream **ppstm);
SCODE CreateStorage(WCHAR const *pwcsName,
DWORD grfMode,
DWORD reserved1,
DWORD reserved2,
IStorage **ppstg);
SCODE OpenStorage(WCHAR const *pwcsName,
IStorage *pstgPriority,
DWORD grfMode,
SNBW snbExclude,
DWORD reserved,
IStorage **ppstg);
SCODE CopyTo(DWORD ciidExclude,
IID const *rgiidExclude,
SNBW snbExclude,
IStorage *pstgDest);
SCODE MoveElementTo(WCHAR const *pwcsName,
IStorage *pstgDest,
TCHAR const *ptcsNewName,
DWORD grfFlags);
SCODE DestroyElement(WCHAR const *pwcsName);
SCODE RenameElement(WCHAR const *pwcsOldName,
WCHAR const *pwcsNewName);
SCODE SetElementTimes(WCHAR const *pwcsName,
FILETIME const *pctime,
FILETIME const *patime,
FILETIME const *pmtime);
STDMETHOD(Stat)(STATSTGW *pstatstg, DWORD grfStatFlag);
#endif // !_UNICODE
public:
// IRootStorage
STDMETHOD(SwitchToFile)(TCHAR *ptcsFile);
#ifdef NEWPROPS
// IPrivateStorage
STDMETHOD_(IStorage *,GetStorage)(VOID);
#endif
// New methods
inline SCODE Validate(void) const;
inline CDocFile* GetDF() const
{ return _pdf; }
public: // methods related to maintaining the tree
inline void SetDF( CDocFile* pdf)
{ _pdf = pdf; }
inline BOOL IsRoot(void) const
{ return _pdfParent == NULL; }
inline CExposedDocFile* GetParent(void) const
{ return _pdfParent; }
inline void SetClean(void)
{ _fDirty = FALSE; }
inline BOOL IsDirty(void) const
{ return _fDirty; }
inline void SetDirty(void);
inline void SetDirtyBit(void)
{ _fDirty = TRUE; }
BOOL IsAtOrAbove(CExposedDocFile *pdf);
CMStream* GetBaseMS(void)
{ return _pmsBase; }
inline SCODE FindGreaterEntry(CDfName const *pdfnKey,
CDfName *pNextKey,
STATSTGW *pstat);
inline SCODE CheckReverted(void) const;
inline void ReleaseChild(PRevertable *prv);
inline void AddChild(PRevertable *prv);
// PRevertable
virtual void RevertFromAbove(void);
#ifdef NEWPROPS
virtual SCODE FlushBufferedData(void);
#endif
private:
SCODE CreateEntry(WCHAR const *pwcsName,
DWORD dwType,
DWORD grfMode,
void **ppv);
SCODE OpenEntry(WCHAR const *pwcsName,
DWORD dwType,
DWORD grfMode,
void **ppv);
static DWORD MakeCopyFlags(DWORD ciidExclude,
IID const *rgiidExclude);
SCODE CopyDocFileToIStorage( CDocFile *pdfFrom,
IStorage *pstgTo,
SNBW snbExclude,
DWORD dwCopyFlags);
SCODE CopyDStreamToIStream( CDirectStream *pstFrom,
IStream *pstTo);
SCODE ConvertInternalStream( CExposedDocFile *pdfExp);
inline SCODE CheckCopyTo(void);
CExposedDocFile *_pdfParent;
CChildInstanceList _cilChildren;
BOOL _fDirty;
ULONG _sig;
ULONG _ulAccessLockBase;
protected:
ILockBytes *_pilbBase;
CMStream *_pmsBase;
CDocFile *_pdf;
LONG _cReferences;
CDFBasis *_pdfb; // stores docfile wide stuff
};
#define CEXPOSEDDOCFILE_SIG LONGSIG('E', 'D', 'F', 'L')
#define CEXPOSEDDOCFILE_SIGDEL LONGSIG('E', 'd', 'F', 'l')
//+--------------------------------------------------------------
//
// Member: CExposedDocFile::Validate, public
//
// Synopsis: Validates the class signature
//
// Returns: Returns STG_E_INVALIDHANDLE for failure
//
//---------------------------------------------------------------
inline SCODE CExposedDocFile::Validate(void) const
{
return (this == NULL || _sig != CEXPOSEDDOCFILE_SIG) ?
STG_E_INVALIDHANDLE : S_OK;
}
//+---------------------------------------------------------------------------
//
// Member: CExposedDocFile::SetDirty, public
//
// Synopsis: Sets the dirty flag and all parents' dirty flags
//
//----------------------------------------------------------------------------
inline void CExposedDocFile::SetDirty(void)
{
CExposedDocFile *ppdf = this;
olAssert( this && aMsg("Attempted to dirty parent of root"));
do
{
ppdf->SetDirtyBit();
ppdf = ppdf->GetParent();
} while (ppdf != NULL);
}
//+--------------------------------------------------------------
//
// Member: CExposedDocFile::ReleaseChild, private
//
// Synopsis: Releases a child instance
//
// Arguments: [prv] - Child instance
//
//---------------------------------------------------------------
inline void CExposedDocFile::ReleaseChild(PRevertable *prv)
{
olAssert(SUCCEEDED(CheckReverted()));
_cilChildren.RemoveRv(prv);
}
//+--------------------------------------------------------------
//
// Member: CExposedDocFile::AddChild, public
//
// Synopsis: Adds a child instance
//
// Arguments: [prv] - Child
//
//---------------------------------------------------------------
inline void CExposedDocFile::AddChild(PRevertable *prv)
{
olAssert(SUCCEEDED(CheckReverted()));
_cilChildren.Add(prv);
}
//+---------------------------------------------------------------------------
//
// Member: CExposedDocFile::FindGreaterEntry, public
//
// Synopsis: Returns the next greater child
//
// Arguments: [pdfnKey] - Previous key
// [pstat] - iterator buffer
//
// Returns: Appropriate status code
//
// Modifies: [pstat]
//
//----------------------------------------------------------------------------
inline SCODE CExposedDocFile::FindGreaterEntry(CDfName const *pdfnKey,
CDfName *pNextKey,
STATSTGW *pstat)
{
olAssert(SUCCEEDED(CheckReverted()));
return _pdf->FindGreaterEntry(pdfnKey, pNextKey, pstat);
}
//+--------------------------------------------------------------
//
// Member: CExposedDocFile::CheckReverted, private
//
// Synopsis: Returns STG_E_REVERTED if reverted
//
//---------------------------------------------------------------
inline SCODE CExposedDocFile::CheckReverted(void) const
{
return P_REVERTED(_df) ? STG_E_REVERTED : S_OK;
}
#endif