238 lines
6.7 KiB
C++
238 lines
6.7 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995.
|
|
//
|
|
// File: laywrap.hxx
|
|
//
|
|
// Contents: RootStorage wrapper for Layout docfile
|
|
//
|
|
// Classes: CLayoutRootStorage
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 13-Feb-95 SusiA Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifndef __LAYWRAP_HXX__
|
|
#define __LAYWRAP_HXX__
|
|
|
|
#include "laylkb.hxx"
|
|
|
|
typedef struct tagSTORAGELIST
|
|
{
|
|
OLECHAR *pwcsStgName;
|
|
IStorage *pStg;
|
|
struct tagSTORAGELIST *pnext;
|
|
} STORAGELIST;
|
|
|
|
typedef struct tagSTREAMLIST
|
|
{
|
|
OLECHAR *pwcsStmName;
|
|
IStream *pStm;
|
|
BOOL fDone;
|
|
LARGE_INTEGER cOffset;
|
|
struct tagSTREAMLIST *pnext;
|
|
} STREAMLIST;
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CLayoutRootStorage
|
|
//
|
|
// Purpose: Wrap root storage objects for Layout Docfiles
|
|
//
|
|
// Interface:
|
|
//
|
|
// History: 28-Dec-95 SusiA Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CLayoutRootStorage:
|
|
public IStorage,
|
|
public IRootStorage,
|
|
public ILayoutStorage
|
|
{
|
|
public:
|
|
inline CLayoutRootStorage(IStorage *pstg, CLayoutLockBytes *pllkb);
|
|
inline ~CLayoutRootStorage(void);
|
|
// 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);
|
|
// IRootStorage
|
|
STDMETHOD(SwitchToFile)(OLECHAR *ptcsFile);
|
|
|
|
//ILayoutStorage
|
|
STDMETHOD (LayoutScript)( StorageLayout *pStorageLayout,
|
|
DWORD nEntries,
|
|
DWORD glfInterleavedFlag);
|
|
|
|
STDMETHOD (BeginMonitor)(void);
|
|
|
|
STDMETHOD (EndMonitor)(void);
|
|
|
|
STDMETHOD (ReLayoutDocfile)(OLECHAR *pwcsNewDfName);
|
|
|
|
STDMETHOD (ReLayoutDocfileOnILockBytes)(ILockBytes *pILockBytes);
|
|
|
|
#if (DBG==1)
|
|
STDMETHOD (GetScript)(TCHAR **pwcsScriptFileName);
|
|
#endif
|
|
|
|
private:
|
|
STDMETHOD (ProcessItem)( StorageLayout *pLayoutItem, BOOL *fStmDone );
|
|
|
|
STDMETHOD (ProcessRepeatLoop)( StorageLayout *pStorageLayout,
|
|
DWORD nEntries,
|
|
int * nRepeatStart);
|
|
|
|
STDMETHOD (ProcessLayout)( StorageLayout *pStorageLayout,
|
|
DWORD nEntries,
|
|
DWORD glfInterleavedFlag);
|
|
|
|
STDMETHOD (ProcessOpen)(OLECHAR *pwcsElementPathName,
|
|
DWORD dwType,
|
|
void **ppIStgStm,
|
|
LARGE_INTEGER cOffset);
|
|
|
|
void FreeStmList( STREAMLIST *pStmList);
|
|
|
|
void FreeStgList( STORAGELIST *pStgList);
|
|
|
|
|
|
LONG _cReferences;
|
|
IStorage *_pRealStg;
|
|
CLayoutLockBytes *_pllkb;
|
|
|
|
STORAGELIST *_pStgList;
|
|
STREAMLIST *_pStmList;
|
|
|
|
};
|
|
|
|
inline CLayoutRootStorage::CLayoutRootStorage(IStorage *pstg,
|
|
CLayoutLockBytes *pllkb)
|
|
{
|
|
_cReferences = 1;
|
|
_pRealStg = pstg;
|
|
_pRealStg->AddRef();
|
|
_pllkb = pllkb;
|
|
_pllkb->AddRef();
|
|
_pStmList = NULL;
|
|
_pStgList = NULL;
|
|
|
|
}
|
|
|
|
inline CLayoutRootStorage::~CLayoutRootStorage(void)
|
|
{
|
|
if (_pRealStg != NULL)
|
|
_pRealStg->Release();
|
|
|
|
if (_pllkb != NULL)
|
|
_pllkb->Release();
|
|
|
|
if (_pStmList != NULL)
|
|
FreeStmList(_pStmList);
|
|
|
|
if (_pStgList != NULL)
|
|
FreeStgList(_pStgList);
|
|
|
|
}
|
|
|
|
|
|
SCODE StgLayoutDocfile(HANDLE hOld,
|
|
OLECHAR const *pwcsNewDfName,
|
|
OLECHAR const *pwcsScriptName);
|
|
|
|
|
|
SCODE ProcessControl(SECT *psProcessed,
|
|
MAPFILE *pvOld,
|
|
ULONG *pcsectControl);
|
|
|
|
SCODE ProcessScript(SECT *psProcessed,
|
|
MAPFILE *psOriginal,
|
|
ULONG csectFile,
|
|
ULONG csectOriginal,
|
|
ULONG csectControl,
|
|
SECT sectRangeLocks,
|
|
ULONG *pcsectProcessed);
|
|
|
|
SCODE CopyData(MAPFILE *pvNew,
|
|
MAPFILE *pvOld,
|
|
SECT *psScript,
|
|
ULONG cSectFile,
|
|
ULONG cbSectorSize);
|
|
|
|
SCODE RemapHeader(MAPFILE *pvNew,
|
|
SECT *pScript,
|
|
ULONG csectFile);
|
|
|
|
SCODE RemapDIF(MAPFILE *pvNew,
|
|
SECT *pScript,
|
|
ULONG csectFile,
|
|
ULONG cbSectorSize);
|
|
|
|
SCODE RemapFat(MAPFILE *pvNew,
|
|
MAPFILE *pvOld,
|
|
SECT *pScript,
|
|
ULONG csectFile,
|
|
ULONG cbSectorSize);
|
|
|
|
SCODE RemapDirectory(MAPFILE *pvNew,
|
|
SECT *pScript,
|
|
ULONG csectFile,
|
|
ULONG cbSectorSize);
|
|
|
|
#endif // #ifndef __LAYWRAP_HXX__
|