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

415 lines
11 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: simpdf.hxx
//
// Contents: Headers for SimpDocfile
//
// Classes:
//
// Functions:
//
// History: 04-Aug-94 PhilipLa Created
//
//----------------------------------------------------------------------------
#ifndef __SIMPDF_HXX__
#define __SIMPDF_HXX__
#include <dfnlist.hxx>
#include <header.hxx>
#if DBG == 1
DECLARE_DEBUG(simp);
#endif
#if DBG == 1
#define simpDebugOut(x) simpInlineDebugOut x
#define simpAssert(e) Win4Assert(e)
#define simpVerify(e) Win4Assert(e)
#else
#define simpDebugOut(x)
#define simpAssert(e)
#define simpVerify(e) (e)
#endif
#define SECTORSIZE 512
//+---------------------------------------------------------------------------
//
// Struct: SSimpDocfileHints
//
// Purpose: Hints for SimpDocfile
//
// History: 04-Aug-94 PhilipLa Created
//
//----------------------------------------------------------------------------
struct SSimpDocfileHints
{
ULONG cStreams;
ULONG ulSize;
};
//+---------------------------------------------------------------------------
//
// Class: CSimpStorage
//
// Purpose:
//
// Interface:
//
// History: 04-Aug-94 PhilipLa Created
//
// Notes:
//
//----------------------------------------------------------------------------
interface CSimpStorage:
public IStorage,
public IMarshal,
public CPropertySetStorage
{
public:
inline CSimpStorage();
inline ~CSimpStorage();
SCODE Init(WCHAR const *pwcsName, SSimpDocfileHints *psdh);
#ifdef SECURE_SIMPLE_MODE
void ReleaseCurrentStream(ULONG ulHighWater);
#else
void ReleaseCurrentStream(void);
#endif
// From IUnknown
STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj);
STDMETHOD_(ULONG,AddRef)(void);
STDMETHOD_(ULONG,Release)(void);
// 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);
// 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);
STDMETHOD(ReleaseMarshalData)(IStream *pStm);
STDMETHOD(DisconnectObject)(DWORD dwReserved);
protected:
SID BuildTree(CDirEntry *ade, SID sidStart, ULONG cStreams);
LONG _cReferences;
HANDLE _hFile;
BOOL _fDirty;
CMSFHeader _hdr;
BYTE *_pbBuf;
SECT _sectMax;
CLSID _clsid;
CDfNameList *_pdfl;
CDfNameList *_pdflCurrent;
ULONG _cStreams;
};
//+---------------------------------------------------------------------------
//
// Member: CSimpStorage::CSimpStorage, public
//
// Synopsis: Constructor
//
// History: 04-Aug-94 PhilipLa Created
//
//----------------------------------------------------------------------------
inline CSimpStorage::CSimpStorage()
: CPropertySetStorage( MAPPED_STREAM_CREATE ),
_hdr(SECTORSHIFT512)
{
_cReferences = 1;
_pbBuf = NULL;
_sectMax = 0;
_pdfl = NULL;
_hFile = INVALID_HANDLE_VALUE;
_fDirty = FALSE;
_pdflCurrent = NULL;
_cStreams = 0;
CPropertySetStorage::Init( static_cast<IStorage*>(this),
/*IBlockingLock*/NULL,
FALSE ); // fControlLifetimes (=> don't AddRef)
}
//+---------------------------------------------------------------------------
//
// Member: CSimpStorage::~CSimpStorage, public
//
// Synopsis: Destructor
//
// History: 04-Aug-94 PhilipLa Created
//
//----------------------------------------------------------------------------
inline CSimpStorage::~CSimpStorage()
{
delete _pbBuf;
while (_pdfl != NULL)
{
CDfNameList *pdfl = _pdfl;
_pdfl = pdfl->GetNext();
delete pdfl;
}
}
SCODE DfCreateSimpDocfile(WCHAR const *pwcsName,
DWORD grfMode,
DWORD reserved,
IStorage **ppstgOpen);
SCODE DfOpenSimpDocfile(WCHAR const *pwcsName,
DWORD grfMode,
DWORD reserved,
IStorage **ppstgOpen);
//+---------------------------------------------------------------------------
//
// Class: CSimpStorageOpen
//
// Purpose: allow simple mode reads
//
// Interface: IStorage, IMarshal
//
// History: 04-Aug-96 HenryLee Created
//
// Notes: overrides CSimpStorage methods
//
//----------------------------------------------------------------------------
class CSimpStorageOpen : public CSimpStorage
{
public:
inline CSimpStorageOpen();
inline ~CSimpStorageOpen();
inline void ReleaseCurrentStream();
SCODE Init(WCHAR const *pwcsName, DWORD grfMode, SSimpDocfileHints *psdh);
SCODE ValidateHeader (CMSFHeader &hdr);
SCODE ValidateDirectory (BYTE *pByte, ULONG ulDirLength);
SCODE ValidateFat (SECT *pSect, ULONG ulFatLength);
SCODE ValidateDIFat (SECT *pSect, ULONG ulDIFatLength, SECT sectStart);
STDMETHOD_(ULONG,Release)(void); // override virtual function
STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag);
STDMETHOD(OpenStream)(OLECHAR const *pwcsName,
void *reserved1,
DWORD grfMode,
DWORD reserved2,
IStream **ppstm);
STDMETHOD(CreateStream)(OLECHAR const *pwcsName,
DWORD grfMode,
DWORD reserved1,
DWORD reserved2,
IStream **ppstm);
STDMETHOD(EnumElements)(DWORD reserved1,
void *reserved2,
DWORD reserved3,
IEnumSTATSTG **ppenm);
STDMETHOD(SetClass)(REFCLSID clsid);
protected:
DWORD _grfMode;
DWORD _grfStateBits;
WCHAR _awcsName[MAX_PATH];
};
//+---------------------------------------------------------------------------
//
// Member: CSimpStorageOpen::CSimpStorageOpen, public
//
// Synopsis: Constructor
//
// History: 04-May-96 HenryLee Created
//
//----------------------------------------------------------------------------
inline CSimpStorageOpen::CSimpStorageOpen()
{
}
//+---------------------------------------------------------------------------
//
// Member: CSimpStorageOpen::~CSimpStorageOpen, public
//
// Synopsis: Destructor
//
// History: 04-May-96 HenryLee Created
//
//----------------------------------------------------------------------------
inline CSimpStorageOpen::~CSimpStorageOpen()
{
}
//+---------------------------------------------------------------------------
//
// Member: CSimpStorageOpen::ReleaseCurrentStream, public
//
// Synopsis: releases current stream so other opens can occur
//
// History: 04-May-96 HenryLee Created
//
//----------------------------------------------------------------------------
inline void CSimpStorageOpen::ReleaseCurrentStream()
{
_pdflCurrent = NULL;
}
//+---------------------------------------------------------------------------
//
// Class: CSimpEnumSTATSTG
//
// Purpose: allow simple mode read enumeration
//
// Interface: IEnumSTATSTG
//
// History: 04-Aug-96 HenryLee Created
//
// Notes: Skip is not supported
//
//----------------------------------------------------------------------------
class CSimpEnumSTATSTG : public IEnumSTATSTG
{
public:
inline CSimpEnumSTATSTG (CDfNameList *pdfl, CDfNameList *pdflCurrent);
inline ~CSimpEnumSTATSTG ();
STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj);
STDMETHOD_(ULONG,AddRef)(void);
STDMETHOD_(ULONG,Release)(void);
STDMETHOD(Next)(ULONG celt, STATSTG FAR *rgelt, ULONG *pceltFetched);
STDMETHOD(Skip)(ULONG celt);
STDMETHOD(Reset)(void);
STDMETHOD(Clone)(IEnumSTATSTG **ppenm);
protected:
ULONG _cReferences;
CDfNameList *_pdfl;
CDfNameList *_pdflCurrent;
};
//+---------------------------------------------------------------------------
//
// Member: CSimpEnumSTATSTG::CSimpEnumSTATSTG, public
//
// Synopsis: Constructor
//
// History: 04-May-96 HenryLee Created
//
//----------------------------------------------------------------------------
inline CSimpEnumSTATSTG::CSimpEnumSTATSTG (CDfNameList *pdfl,
CDfNameList *pdflCurrent) :
_pdfl(pdfl), _pdflCurrent(pdflCurrent), _cReferences(1)
{
}
//+---------------------------------------------------------------------------
//
// Member: CSimpEnumSTATSTG::~CSimpEnumSTATSTG, public
//
// Synopsis: Destructor
//
// History: 04-May-96 HenryLee Created
//
//----------------------------------------------------------------------------
inline CSimpEnumSTATSTG::~CSimpEnumSTATSTG ()
{
}
#define SIMP_VALIDATE(x) if (FAILED(sc = CExpParameterValidate::x)) {simpDebugOut((DEB_ERROR, "Error %lX at %s:%d\n", sc, __FILE__, __LINE__)); return sc;}
#endif // #ifndef __SIMPDF_HXX__