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