401 lines
13 KiB
C++
401 lines
13 KiB
C++
//+--------------------------------------------------------------
|
|
//
|
|
// 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
|