|
|
//+--------------------------------------------------------------
//
// 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
|