323 lines
9.4 KiB
C++
323 lines
9.4 KiB
C++
//+--------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1992.
|
|
//
|
|
// File: expdf.hxx
|
|
//
|
|
// Contents: Exposed DocFile header
|
|
//
|
|
// Classes: CExposedDocFile
|
|
//
|
|
// History: 20-Jan-92 DrewB Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
#ifndef __EXPDF_HXX__
|
|
#define __EXPDF_HXX__
|
|
|
|
#include <except.hxx>
|
|
#include <dfmsp.hxx>
|
|
#include <dfbasis.hxx>
|
|
#include <psstream.hxx>
|
|
#include <debug.hxx>
|
|
#include <stgprops.hxx>
|
|
#include <safedecl.hxx>
|
|
#include <psetstg.hxx>
|
|
#include "dfmem.hxx"
|
|
#include <mrshlist.hxx>
|
|
#include <bag.hxx>
|
|
|
|
#ifdef ASYNC
|
|
#include "astgconn.hxx"
|
|
#endif
|
|
|
|
// CopyDocFileToIStorage flags
|
|
#define COPY_STORAGES 1
|
|
#define COPY_STREAMS 2
|
|
#define COPY_ALL (COPY_STORAGES | COPY_STREAMS)
|
|
|
|
class CPubDocFile;
|
|
class PDocFile;
|
|
class CPerContext;
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Class: CExposedDocFile (df)
|
|
//
|
|
// Purpose: Exposed DocFile class
|
|
//
|
|
// Interface: See IStorage
|
|
//
|
|
// History: 20-Jan-92 DrewB Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
|
|
interface CExposedDocFile
|
|
:
|
|
public IStorage,
|
|
#ifdef NEWPROPS
|
|
public CPropertySetStorage,
|
|
#endif
|
|
public IRootStorage,
|
|
public IMarshal,
|
|
#if WIN32 >= 300
|
|
public IAccessControl,
|
|
#endif
|
|
public CMallocBased
|
|
#ifdef NEWPROPS
|
|
, public IBlockingLock
|
|
#endif
|
|
#ifdef DIRECTWRITERLOCK
|
|
, public IDirectWriterLock
|
|
#endif
|
|
#ifdef POINTER_IDENTITY
|
|
, public CMarshalList
|
|
#endif
|
|
#ifdef ASYNC
|
|
, public CAsyncConnectionContainer
|
|
#endif
|
|
{
|
|
public:
|
|
CExposedDocFile(CPubDocFile *pdf,
|
|
CDFBasis *pdfb,
|
|
CPerContext *ppc);
|
|
#ifdef ASYNC
|
|
SCODE InitMarshal(DWORD dwAsyncFlags,
|
|
IDocfileAsyncConnectionPoint *pdacp);
|
|
#endif
|
|
|
|
~CExposedDocFile(void);
|
|
|
|
// From IUnknown
|
|
STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj);
|
|
STDMETHOD_(ULONG,AddRef)(void);
|
|
STDMETHOD_(ULONG,Release)(void);
|
|
|
|
// IMarshal
|
|
STDMETHOD(GetUnmarshalClass)(REFIID riid,
|
|
LPVOID pv,
|
|
DWORD dwDestContext,
|
|
LPVOID pvDestContext,
|
|
DWORD mshlflags,
|
|
LPCLSID pCid);
|
|
STDMETHOD(GetMarshalSizeMax)(REFIID riid,
|
|
LPVOID pv,
|
|
DWORD dwDestContext,
|
|
LPVOID pvDestContext,
|
|
DWORD mshlflags,
|
|
LPDWORD pSize);
|
|
STDMETHOD(MarshalInterface)(IStream *pStm,
|
|
REFIID riid,
|
|
LPVOID pv,
|
|
DWORD dwDestContext,
|
|
LPVOID pvDestContext,
|
|
DWORD mshlflags);
|
|
STDMETHOD(UnmarshalInterface)(IStream *pStm,
|
|
REFIID riid,
|
|
LPVOID *ppv);
|
|
static SCODE StaticReleaseMarshalData(IStream *pstStm,
|
|
DWORD mshlflags);
|
|
STDMETHOD(ReleaseMarshalData)(IStream *pStm);
|
|
STDMETHOD(DisconnectObject)(DWORD dwReserved);
|
|
|
|
// IStorage
|
|
STDMETHOD(CreateStream)(OLECHAR const *pwcsName,
|
|
DWORD grfMode,
|
|
DWORD reserved1,
|
|
DWORD reserved2,
|
|
IStream **ppstm);
|
|
STDMETHOD(OpenStream)(OLECHAR const *pwcsName,
|
|
void *reserved1,
|
|
DWORD grfMode,
|
|
DWORD reserved2,
|
|
IStream **ppstm);
|
|
STDMETHOD(CreateStorage)(OLECHAR const *pwcsName,
|
|
DWORD grfMode,
|
|
DWORD reserved1,
|
|
LPSTGSECURITY reserved2,
|
|
IStorage **ppstg);
|
|
STDMETHOD(OpenStorage)(OLECHAR 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)(OLECHAR const *lpszName,
|
|
IStorage *pstgDest,
|
|
OLECHAR const *lpszNewName,
|
|
DWORD grfFlags);
|
|
STDMETHOD(Commit)(DWORD grfCommitFlags);
|
|
STDMETHOD(Revert)(void);
|
|
STDMETHOD(EnumElements)(DWORD reserved1,
|
|
void *reserved2,
|
|
DWORD reserved3,
|
|
IEnumSTATSTG **ppenm);
|
|
STDMETHOD(DestroyElement)(OLECHAR const *pwcsName);
|
|
STDMETHOD(RenameElement)(OLECHAR const *pwcsOldName,
|
|
OLECHAR const *pwcsNewName);
|
|
STDMETHOD(SetElementTimes)(const OLECHAR *lpszName,
|
|
FILETIME const *pctime,
|
|
FILETIME const *patime,
|
|
FILETIME const *pmtime);
|
|
STDMETHOD(SetClass)(REFCLSID clsid);
|
|
STDMETHOD(SetStateBits)(DWORD grfStateBits, DWORD grfMask);
|
|
STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag);
|
|
|
|
|
|
// IRootStorage
|
|
STDMETHOD(SwitchToFile)(OLECHAR *ptcsFile);
|
|
|
|
#ifdef NEWPROPS
|
|
// IBlockingLock
|
|
STDMETHOD(Lock)(DWORD dwTime);
|
|
STDMETHOD(Unlock)(VOID);
|
|
#endif
|
|
|
|
#ifdef DIRECTWRITERLOCK
|
|
// IDirectWriterLock
|
|
STDMETHOD(WaitForWriteAccess)(DWORD dwTimeout);
|
|
STDMETHOD(ReleaseWriteAccess)();
|
|
STDMETHOD(HaveWriteAccess)();
|
|
#endif
|
|
|
|
// New methods
|
|
inline SCODE Validate(void) const;
|
|
inline CPubDocFile *GetPub(void) const;
|
|
inline CPerContext *GetContext(void) const;
|
|
|
|
static SCODE Unmarshal(IStream *pstm,
|
|
void **ppv,
|
|
DWORD mshlflags);
|
|
#if WIN32 >= 300
|
|
// IAccessControl
|
|
STDMETHOD(GrantAccessRights)(ULONG cCount,
|
|
ACCESS_REQUEST pAccessRequestList[]);
|
|
STDMETHOD(SetAccessRights)(ULONG cCount,
|
|
ACCESS_REQUEST pAccessRequestList[]);
|
|
STDMETHOD(ReplaceAllAccessRights)(ULONG cCount,
|
|
ACCESS_REQUEST pAccessRequestList[]);
|
|
STDMETHOD(DenyAccessRights)(ULONG cCount,
|
|
ACCESS_REQUEST pAccessRequestList[]);
|
|
STDMETHOD(RevokeExplicitAccessRights)(ULONG cCount,
|
|
TRUSTEE Trustee[]);
|
|
STDMETHOD(IsAccessPermitted)(TRUSTEE *Trustee,
|
|
DWORD grfAccessPermissions);
|
|
STDMETHOD(GetEffectiveAccessRights)(TRUSTEE *Trustee,
|
|
DWORD *pgrfAccessPermissions );
|
|
STDMETHOD(GetExplicitAccessRights)(ULONG *pcCount,
|
|
PEXPLICIT_ACCESS *pExplicitAccessList);
|
|
|
|
STDMETHOD(CommitAccessRights)(DWORD grfCommitFlags);
|
|
STDMETHOD(RevertAccessRights)();
|
|
#endif // if WIN32 >= 300
|
|
|
|
#ifdef COORD
|
|
SCODE CommitPhase1(DWORD grfCommitFlags);
|
|
SCODE CommitPhase2(DWORD grfCommitFlags, BOOL fCommit);
|
|
#endif
|
|
|
|
private:
|
|
SCODE CreateEntry(CDfName const *pdfn,
|
|
DWORD dwType,
|
|
DWORD grfMode,
|
|
void **ppv);
|
|
SCODE OpenEntry(CDfName const *pdfn,
|
|
DWORD dwType,
|
|
DWORD grfMode,
|
|
void **ppv);
|
|
SCODE MoveElementWorker(WCHAR const *pwcsName,
|
|
IStorage *pstgParent,
|
|
OLECHAR const *ptcsNewName,
|
|
DWORD grfFlags);
|
|
static DWORD MakeCopyFlags(DWORD ciidExclude,
|
|
IID const *rgiidExclude);
|
|
SCODE CopyDocFileToIStorage(PDocFile *pdfFrom,
|
|
IStorage *pstgTo,
|
|
SNBW snbExclude,
|
|
DWORD dwCopyFlags);
|
|
SCODE CopySStreamToIStream(PSStream *psstFrom, IStream *pstTo);
|
|
SCODE ConvertInternalStream(CExposedDocFile *pdfExp);
|
|
inline SCODE CheckCopyTo(void);
|
|
|
|
CBasedPubDocFilePtr _pdf;
|
|
CBasedDFBasisPtr _pdfb;
|
|
CPerContext *_ppc;
|
|
ULONG _sig;
|
|
LONG _cReferences;
|
|
#if WIN32 >= 300
|
|
IAccessControl *_pIAC;
|
|
#endif // WIN32 >= 300
|
|
|
|
#ifdef COORD
|
|
//These are holder values for an exposed two-phase commit.
|
|
ULONG _ulLock;
|
|
DFSIGNATURE _sigMSF;
|
|
ULONG _cbSizeBase;
|
|
ULONG _cbSizeOrig;
|
|
#endif
|
|
#ifdef DIRECTWRITERLOCK
|
|
HRESULT ValidateWriteAccess();
|
|
#endif
|
|
|
|
// IPropertyBagEx interface. This object forwards all IUnknown calls
|
|
// to this object (actually, to the IPropertySetStorage base class).
|
|
|
|
CPropertyBagEx _PropertyBagEx;
|
|
};
|
|
|
|
SAFE_INTERFACE_PTR(SafeCExposedDocFile, CExposedDocFile);
|
|
|
|
#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
|
|
//
|
|
// History: 20-Jan-92 DrewB Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
inline SCODE CExposedDocFile::Validate(void) const
|
|
{
|
|
olChkBlocks((DBG_FAST));
|
|
return (this == NULL || _sig != CEXPOSEDDOCFILE_SIG) ?
|
|
STG_E_INVALIDHANDLE : S_OK;
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: CExposedDocFile::GetPub, public
|
|
//
|
|
// Synopsis: Returns the public
|
|
//
|
|
// History: 26-Feb-92 DrewB Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
inline CPubDocFile *CExposedDocFile::GetPub(void) const
|
|
{
|
|
#ifdef MULTIHEAP
|
|
// The tree mutex must be taken before calling this routine
|
|
// CSafeMultiHeap smh(_ppc); // optimzation
|
|
#endif
|
|
return BP_TO_P(CPubDocFile *, _pdf);
|
|
}
|
|
|
|
inline CPerContext * CExposedDocFile::GetContext(void) const
|
|
{
|
|
return _ppc;
|
|
}
|
|
|
|
#endif
|