Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

237 lines
6.9 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1995.
  5. //
  6. // File: laywrap.hxx
  7. //
  8. // Contents: RootStorage wrapper for Layout docfile
  9. //
  10. // Classes: CLayoutRootStorage
  11. //
  12. // Functions:
  13. //
  14. // History: 13-Feb-95 SusiA Created
  15. //
  16. //----------------------------------------------------------------------------
  17. #ifndef __LAYWRAP_HXX__
  18. #define __LAYWRAP_HXX__
  19. #include "laylkb.hxx"
  20. typedef struct tagSTORAGELIST
  21. {
  22. OLECHAR *pwcsStgName;
  23. IStorage *pStg;
  24. struct tagSTORAGELIST *pnext;
  25. } STORAGELIST;
  26. typedef struct tagSTREAMLIST
  27. {
  28. OLECHAR *pwcsStmName;
  29. IStream *pStm;
  30. BOOL fDone;
  31. LARGE_INTEGER cOffset;
  32. struct tagSTREAMLIST *pnext;
  33. } STREAMLIST;
  34. //+---------------------------------------------------------------------------
  35. //
  36. // Class: CLayoutRootStorage
  37. //
  38. // Purpose: Wrap root storage objects for Layout Docfiles
  39. //
  40. // Interface:
  41. //
  42. // History: 28-Dec-95 SusiA Created
  43. //
  44. // Notes:
  45. //
  46. //----------------------------------------------------------------------------
  47. class CLayoutRootStorage:
  48. public IStorage,
  49. public IRootStorage,
  50. public ILayoutStorage
  51. {
  52. public:
  53. inline CLayoutRootStorage(IStorage *pstg, CLayoutLockBytes *pllkb);
  54. inline ~CLayoutRootStorage(void);
  55. // IUnknown
  56. STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj);
  57. STDMETHOD_(ULONG, AddRef)(void);
  58. STDMETHOD_(ULONG, Release)(void);
  59. // IStorage
  60. STDMETHOD(CreateStream)(OLECHAR const *pwcsName,
  61. DWORD grfMode,
  62. DWORD reserved1,
  63. DWORD reserved2,
  64. IStream **ppstm);
  65. STDMETHOD(OpenStream)(OLECHAR const *pwcsName,
  66. void *reserved1,
  67. DWORD grfMode,
  68. DWORD reserved2,
  69. IStream **ppstm);
  70. STDMETHOD(CreateStorage)(OLECHAR const *pwcsName,
  71. DWORD grfMode,
  72. DWORD reserved1,
  73. LPSTGSECURITY reserved2,
  74. IStorage **ppstg);
  75. STDMETHOD(OpenStorage)(OLECHAR const *pwcsName,
  76. IStorage *pstgPriority,
  77. DWORD grfMode,
  78. SNB snbExclude,
  79. DWORD reserved,
  80. IStorage **ppstg);
  81. STDMETHOD(CopyTo)(DWORD ciidExclude,
  82. IID const *rgiidExclude,
  83. SNB snbExclude,
  84. IStorage *pstgDest);
  85. STDMETHOD(MoveElementTo)(OLECHAR const *lpszName,
  86. IStorage *pstgDest,
  87. OLECHAR const *lpszNewName,
  88. DWORD grfFlags);
  89. STDMETHOD(Commit)(DWORD grfCommitFlags);
  90. STDMETHOD(Revert)(void);
  91. STDMETHOD(EnumElements)(DWORD reserved1,
  92. void *reserved2,
  93. DWORD reserved3,
  94. IEnumSTATSTG **ppenm);
  95. STDMETHOD(DestroyElement)(OLECHAR const *pwcsName);
  96. STDMETHOD(RenameElement)(OLECHAR const *pwcsOldName,
  97. OLECHAR const *pwcsNewName);
  98. STDMETHOD(SetElementTimes)(const OLECHAR *lpszName,
  99. FILETIME const *pctime,
  100. FILETIME const *patime,
  101. FILETIME const *pmtime);
  102. STDMETHOD(SetClass)(REFCLSID clsid);
  103. STDMETHOD(SetStateBits)(DWORD grfStateBits, DWORD grfMask);
  104. STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag);
  105. // IRootStorage
  106. STDMETHOD(SwitchToFile)(OLECHAR *ptcsFile);
  107. //ILayoutStorage
  108. STDMETHOD (LayoutScript)( StorageLayout *pStorageLayout,
  109. DWORD nEntries,
  110. DWORD glfInterleavedFlag);
  111. STDMETHOD (BeginMonitor)(void);
  112. STDMETHOD (EndMonitor)(void);
  113. STDMETHOD (ReLayoutDocfile)(OLECHAR *pwcsNewDfName);
  114. STDMETHOD (ReLayoutDocfileOnILockBytes)(ILockBytes *pILockBytes);
  115. #if (DBG==1)
  116. STDMETHOD (GetScript)(TCHAR **pwcsScriptFileName);
  117. #endif
  118. private:
  119. STDMETHOD (ProcessItem)( StorageLayout *pLayoutItem, BOOL *fStmDone );
  120. STDMETHOD (ProcessRepeatLoop)( StorageLayout *pStorageLayout,
  121. DWORD nEntries,
  122. int * nRepeatStart);
  123. STDMETHOD (ProcessLayout)( StorageLayout *pStorageLayout,
  124. DWORD nEntries,
  125. DWORD glfInterleavedFlag);
  126. STDMETHOD (ProcessOpen)(OLECHAR *pwcsElementPathName,
  127. DWORD dwType,
  128. void **ppIStgStm,
  129. LARGE_INTEGER cOffset);
  130. void FreeStmList( STREAMLIST *pStmList);
  131. void FreeStgList( STORAGELIST *pStgList);
  132. LONG _cReferences;
  133. IStorage *_pRealStg;
  134. CLayoutLockBytes *_pllkb;
  135. STORAGELIST *_pStgList;
  136. STREAMLIST *_pStmList;
  137. };
  138. inline CLayoutRootStorage::CLayoutRootStorage(IStorage *pstg,
  139. CLayoutLockBytes *pllkb)
  140. {
  141. _cReferences = 1;
  142. _pRealStg = pstg;
  143. _pRealStg->AddRef();
  144. _pllkb = pllkb;
  145. _pllkb->AddRef();
  146. _pStmList = NULL;
  147. _pStgList = NULL;
  148. }
  149. inline CLayoutRootStorage::~CLayoutRootStorage(void)
  150. {
  151. if (_pRealStg != NULL)
  152. _pRealStg->Release();
  153. if (_pllkb != NULL)
  154. _pllkb->Release();
  155. if (_pStmList != NULL)
  156. FreeStmList(_pStmList);
  157. if (_pStgList != NULL)
  158. FreeStgList(_pStgList);
  159. }
  160. SCODE StgLayoutDocfile(HANDLE hOld,
  161. OLECHAR const *pwcsNewDfName,
  162. OLECHAR const *pwcsScriptName);
  163. SCODE ProcessControl(SECT *psProcessed,
  164. MAPFILE *pvOld,
  165. ULONG *pcsectControl);
  166. SCODE ProcessScript(SECT *psProcessed,
  167. MAPFILE *psOriginal,
  168. ULONG csectFile,
  169. ULONG csectOriginal,
  170. ULONG csectControl,
  171. SECT sectRangeLocks,
  172. ULONG *pcsectProcessed);
  173. SCODE CopyData(MAPFILE *pvNew,
  174. MAPFILE *pvOld,
  175. SECT *psScript,
  176. ULONG cSectFile,
  177. ULONG cbSectorSize);
  178. SCODE RemapHeader(MAPFILE *pvNew,
  179. SECT *pScript,
  180. ULONG csectFile);
  181. SCODE RemapDIF(MAPFILE *pvNew,
  182. SECT *pScript,
  183. ULONG csectFile,
  184. ULONG cbSectorSize);
  185. SCODE RemapFat(MAPFILE *pvNew,
  186. MAPFILE *pvOld,
  187. SECT *pScript,
  188. ULONG csectFile,
  189. ULONG cbSectorSize);
  190. SCODE RemapDirectory(MAPFILE *pvNew,
  191. SECT *pScript,
  192. ULONG csectFile,
  193. ULONG cbSectorSize);
  194. #endif // #ifndef __LAYWRAP_HXX__