Source code of Windows XP (NT5)
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.

781 lines
20 KiB

  1. //+--------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1992.
  5. //
  6. // File: publicdf.hxx
  7. //
  8. // Contents: Public DocFile header
  9. //
  10. // Classes: CPubDocFile
  11. //
  12. // History: 20-Jan-92 DrewB Created
  13. //
  14. //---------------------------------------------------------------
  15. #ifndef __PUBDF_HXX__
  16. #define __PUBDF_HXX__
  17. #include <dfmsp.hxx>
  18. #include <chinst.hxx>
  19. #include <ole.hxx>
  20. #include <revert.hxx>
  21. #include <dfbasis.hxx>
  22. #include <pdocfile.hxx>
  23. #include <tlsets.hxx>
  24. class PDocFile;
  25. class CPubStream;
  26. class CRootPubDocFile;
  27. // XS member flags
  28. #define XSM_NOTHING 0x00000000
  29. #define XSM_DELETEIFUNTOUCHED 0x00000001
  30. #define XSM_DELETEONCOMMIT 0x00000002
  31. #define XSM_DELETED 0x00000004
  32. #define XSM_UNCOMMITTED 0x00000008
  33. // XS operations
  34. #define XSO_REVERT 1
  35. #define XSO_RELEASE 2
  36. //PubDocFile bitfield:
  37. // PF_DIRTY indicates dirty state of docfile
  38. // PF_PREPARED is set if the Docfile has enough space for an overwrite
  39. // commit (after a PrepareForOverwrite or SwitchToFile) and
  40. // is reset after a successful commit.
  41. #define PF_DIRTY 1
  42. #define PF_PREPARED 2
  43. //+--------------------------------------------------------------
  44. //
  45. // Class: CPubDocFile (df)
  46. //
  47. // Purpose: Public DocFile class
  48. //
  49. // Interface: See below
  50. //
  51. // History: 20-Jan-92 DrewB Created
  52. // MikeHill Made Commit virtual
  53. //
  54. //---------------------------------------------------------------
  55. class CPubDocFile : public PRevertable
  56. {
  57. public:
  58. CPubDocFile(CPubDocFile *pdfParent,
  59. PDocFile *pdf,
  60. DFLAGS const df,
  61. DFLUID luid,
  62. CDFBasis *pdfb,
  63. CDfName const *pdfn,
  64. UINT cTransactedDepth,
  65. CMStream *pmsBase);
  66. void vdtor(void);
  67. inline void vAddRef(void);
  68. inline void vDecRef(void);
  69. void vRelease(void);
  70. // PRevertable
  71. void RevertFromAbove(void);
  72. #ifdef NEWPROPS
  73. SCODE FlushBufferedData(int recursionlevel);
  74. #endif
  75. inline void EmptyCache ();
  76. SCODE Stat(STATSTGW *pstatstg, DWORD grfStatFlag);
  77. #ifdef COORD
  78. SCODE CommitPhase1(DWORD const dwFlags,
  79. ULONG *pulLock,
  80. DFSIGNATURE *psigMSF,
  81. ULONG *pcbSizeBase,
  82. ULONG *pcbSizeOrig);
  83. SCODE CommitPhase2(DWORD const dwFlags,
  84. BOOL fCommit,
  85. ULONG ulLock,
  86. DFSIGNATURE sigMSF,
  87. ULONG cbSizeBase,
  88. ULONG cbSizeOrig);
  89. #endif
  90. SCODE Commit(DWORD const dwFlags);
  91. SCODE Revert(void);
  92. SCODE DestroyEntry(CDfName const *pdfnName,
  93. BOOL fClean);
  94. SCODE RenameEntry(CDfName const *pdfnName,
  95. CDfName const *pdfnNewName);
  96. SCODE SetElementTimes(CDfName const *pdfnName,
  97. FILETIME const *pctime,
  98. FILETIME const *patime,
  99. FILETIME const *pmtime);
  100. SCODE SetClass(REFCLSID clsid);
  101. SCODE SetStateBits(DWORD grfStateBits, DWORD grfMask);
  102. SCODE CreateDocFile(CDfName const *pdfnName,
  103. DFLAGS const df,
  104. CPubDocFile **ppdfDocFile);
  105. SCODE GetDocFile(CDfName const *pdfnName,
  106. DFLAGS const df,
  107. CPubDocFile **ppdfDocFile);
  108. SCODE CreateStream(CDfName const *pdfnName,
  109. DFLAGS const df,
  110. CPubStream **ppdstStream);
  111. SCODE GetStream(CDfName const *pdfnName,
  112. DFLAGS const df,
  113. CPubStream **ppdstStream);
  114. inline SCODE FindGreaterEntry(CDfName const *pdfnKey,
  115. SIterBuffer *pib,
  116. STATSTGW *pstat,
  117. BOOL fProps);
  118. void AddChild(PRevertable *prv);
  119. void ReleaseChild(PRevertable *prv);
  120. SCODE IsEntry(CDfName const *pdfnName, SEntryBuffer *peb);
  121. BOOL IsAtOrAbove(CPubDocFile *pdf);
  122. void AddXSMember(PTSetMember *ptsmRequestor,
  123. PTSetMember *ptsmAdd,
  124. DFLUID luid);
  125. inline void InsertXSMember(PTSetMember *ptsm);
  126. inline void RemoveXSMember(PTSetMember *ptsm);
  127. inline PTSetMember *FindXSMember(CDfName const *pdfn,
  128. DFLUID luidTree);
  129. inline void RenameChild(CDfName const *pdfnOld,
  130. DFLUID luidTree,
  131. CDfName const *pdfnNew);
  132. inline void DestroyChild(DFLUID luid);
  133. inline BOOL IsRoot(void) const;
  134. #ifdef COORD
  135. inline BOOL IsCoord(void) const;
  136. inline CRootPubDocFile * GetRoot(void);
  137. #endif
  138. inline CPubDocFile *GetParent(void) const;
  139. inline LONG GetRefCount(void) const;
  140. inline PDocFile *GetDF(void) const;
  141. inline void SetDF(PDocFile *pdf);
  142. inline SCODE CheckReverted(void) const;
  143. inline UINT GetTransactedDepth(void) const;
  144. inline void SetClean(void);
  145. inline BOOL IsDirty(void) const;
  146. inline void SetDirty(void);
  147. inline void SetDirtyBit(void);
  148. inline CMStream * GetBaseMS(void);
  149. inline CDFBasis * GetBasis(void);
  150. inline CDfName *GetName(void);
  151. static SCODE Validate(CPubDocFile *pdf);
  152. #if DBG == 1
  153. void VerifyXSMemberBases();
  154. #endif
  155. protected:
  156. void ChangeXs(DFLUID const luidTree,
  157. DWORD const dwOp);
  158. SCODE PrepareForOverwrite(void);
  159. #ifdef LARGE_DOCFILE
  160. SCODE GetCommitSize(ULONGLONG *pulSize);
  161. #else
  162. SCODE GetCommitSize(ULONG *pulSize);
  163. #endif
  164. SCODE Consolidate(DWORD dwFlags);
  165. SCODE IsSingleWriter(void);
  166. SCODE CopyLStreamToLStream(ILockBytes *plstFrom,
  167. ILockBytes *plstTo);
  168. CTSSet _tss;
  169. CBasedPubDocFilePtr _pdfParent;
  170. CBasedDocFilePtr _pdf;
  171. CChildInstanceList _cilChildren;
  172. UINT _cTransactedDepth;
  173. WORD _wFlags;
  174. CBasedMStreamPtr _pmsBase;
  175. DFSIGNATURE _sigMSF;
  176. LONG _cReferences;
  177. CBasedDFBasisPtr _pdfb;
  178. };
  179. // already defined in dfbasis.hxx
  180. //SAFE_DFBASED_PTR(CBasedPubDocFilePtr, CPubDocFile);
  181. //+--------------------------------------------------------------
  182. //
  183. // Member: CPubDocFile::GetDF, public
  184. //
  185. // Synopsis: Returns _pdf
  186. //
  187. // History: 22-Jan-92 DrewB Created
  188. //
  189. //---------------------------------------------------------------
  190. inline PDocFile *CPubDocFile::GetDF(void) const
  191. {
  192. return BP_TO_P(PDocFile *, _pdf);
  193. }
  194. //+--------------------------------------------------------------
  195. //
  196. // Member: CPubDocFile::SetDF, public
  197. //
  198. // Synopsis: Sets _pdf
  199. //
  200. // History: 26-Aug-92 DrewB Created
  201. //
  202. //---------------------------------------------------------------
  203. inline void CPubDocFile::SetDF(PDocFile *pdf)
  204. {
  205. _pdf = P_TO_BP(CBasedDocFilePtr, pdf);
  206. }
  207. //+--------------------------------------------------------------
  208. //
  209. // Member: CPubDocFile::AddRef, public
  210. //
  211. // Synopsis: Changes the ref count
  212. //
  213. // History: 26-Feb-92 DrewB Created
  214. //
  215. //---------------------------------------------------------------
  216. inline void CPubDocFile::vAddRef(void)
  217. {
  218. InterlockedIncrement(&_cReferences);
  219. }
  220. //+---------------------------------------------------------------------------
  221. //
  222. // Member: CPubDocFile::vDecRef, public
  223. //
  224. // Synopsis: Decrement the ref count
  225. //
  226. // History: 07-Feb-94 DrewB Created
  227. //
  228. //----------------------------------------------------------------------------
  229. inline void CPubDocFile::vDecRef(void)
  230. {
  231. LONG lRet;
  232. olAssert(_cReferences > 0);
  233. lRet = InterlockedDecrement(&_cReferences);
  234. if (lRet == 0)
  235. vdtor();
  236. }
  237. //+--------------------------------------------------------------
  238. //
  239. // Member: CPubDocFile::IsRoot, public
  240. //
  241. // Synopsis: Returns _pdfParent == NULL
  242. //
  243. // History: 02-Mar-92 DrewB Created
  244. //
  245. //---------------------------------------------------------------
  246. inline BOOL CPubDocFile::IsRoot(void) const
  247. {
  248. return _pdfParent == NULL;
  249. }
  250. #ifdef COORD
  251. inline BOOL CPubDocFile::IsCoord(void) const
  252. {
  253. return P_COORD(_df);
  254. }
  255. inline CRootPubDocFile * CPubDocFile::GetRoot(void)
  256. {
  257. olAssert(IsRoot() || IsCoord());
  258. if (IsRoot())
  259. {
  260. return (CRootPubDocFile *)this;
  261. }
  262. else
  263. {
  264. return (CRootPubDocFile *)(BP_TO_P(CPubDocFile *, _pdfParent));
  265. }
  266. }
  267. #endif
  268. //+--------------------------------------------------------------
  269. //
  270. // Member: CPubDocFile::GetParent, public
  271. //
  272. // Synopsis: Returns _pdfParent
  273. //
  274. // History: 02-Mar-92 DrewB Created
  275. //
  276. //---------------------------------------------------------------
  277. inline CPubDocFile *CPubDocFile::GetParent(void) const
  278. {
  279. return BP_TO_P(CPubDocFile *, _pdfParent);
  280. }
  281. //+--------------------------------------------------------------
  282. //
  283. // Member: CPubDocFile::GetRefCount, public
  284. //
  285. // Synopsis: Returns the ref count
  286. //
  287. // History: 09-Apr-93 DrewB Created
  288. //
  289. //---------------------------------------------------------------
  290. inline LONG CPubDocFile::GetRefCount(void) const
  291. {
  292. return _cReferences;
  293. }
  294. //+---------------------------------------------------------------------------
  295. //
  296. // Member: CPubDocFile::GetTransactedDepth, public
  297. //
  298. // Synopsis: Returns the transaction depth
  299. //
  300. // History: 06-Nov-92 DrewB Created
  301. //
  302. //----------------------------------------------------------------------------
  303. inline UINT CPubDocFile::GetTransactedDepth(void) const
  304. {
  305. return _cTransactedDepth;
  306. }
  307. //+---------------------------------------------------------------------------
  308. //
  309. // Member: CPubDocFile::SetClean, public
  310. //
  311. // Synopsis: Resets the dirty flag
  312. //
  313. // History: 11-Nov-92 DrewB Created
  314. //
  315. //----------------------------------------------------------------------------
  316. inline void CPubDocFile::SetClean(void)
  317. {
  318. _wFlags = (_wFlags & ~PF_DIRTY);
  319. }
  320. //+---------------------------------------------------------------------------
  321. //
  322. // Member: CPubDocFile::IsDirty, public
  323. //
  324. // Synopsis: Returns the dirty flag
  325. //
  326. // History: 11-Nov-92 DrewB Created
  327. //
  328. //----------------------------------------------------------------------------
  329. inline BOOL CPubDocFile::IsDirty(void) const
  330. {
  331. return (_wFlags & PF_DIRTY);
  332. }
  333. //+---------------------------------------------------------------------------
  334. //
  335. // Member: CPubDocFile::SetDirty, public
  336. //
  337. // Synopsis: Sets the dirty flag and all parents' dirty flags
  338. //
  339. // History: 11-Nov-92 DrewB Created
  340. //
  341. //----------------------------------------------------------------------------
  342. inline void CPubDocFile::SetDirty(void)
  343. {
  344. CPubDocFile *ppdf = this;
  345. olAssert((this != NULL) && aMsg("Attempted to dirty parent of root"));
  346. do
  347. {
  348. ppdf->SetDirtyBit();
  349. if (P_TRANSACTED(ppdf->GetDFlags()))
  350. {
  351. // We don't propagate the dirty bit past transacted storages
  352. break;
  353. }
  354. ppdf = ppdf->GetParent();
  355. } while (ppdf != NULL);
  356. }
  357. //+---------------------------------------------------------------------------
  358. //
  359. // Member: CPubDocFile::SetDirtyBit, public
  360. //
  361. // Synopsis: Sets the dirty flag
  362. //
  363. // History: 11-Nov-92 DrewB Created
  364. //
  365. //----------------------------------------------------------------------------
  366. inline void CPubDocFile::SetDirtyBit(void)
  367. {
  368. _wFlags = _wFlags | PF_DIRTY;
  369. }
  370. //+--------------------------------------------------------------
  371. //
  372. // Member: CPubDocFile::Revert, public
  373. //
  374. // Synopsis: Reverts transacted changes
  375. //
  376. // Returns: Appropriate status code
  377. //
  378. // History: 20-Jan-92 DrewB Created
  379. //
  380. //---------------------------------------------------------------
  381. inline SCODE CPubDocFile::Revert(void)
  382. {
  383. SCODE sc;
  384. if (SUCCEEDED(sc = CheckReverted()) && P_TRANSACTED(_df))
  385. {
  386. _cilChildren.DeleteByName(NULL);
  387. ChangeXs(DF_NOLUID, XSO_REVERT);
  388. #if DBG == 1
  389. VerifyXSMemberBases();
  390. #endif
  391. SetClean();
  392. _wFlags = _wFlags & ~PF_PREPARED;
  393. }
  394. return sc;
  395. }
  396. //+--------------------------------------------------------------
  397. //
  398. // Member: CPubDocFile::ReleaseChild, private
  399. //
  400. // Synopsis: Releases a child instance
  401. //
  402. // Arguments: [prv] - Child instance
  403. //
  404. // History: 03-Feb-92 DrewB Created
  405. //
  406. //---------------------------------------------------------------
  407. inline void CPubDocFile::ReleaseChild(PRevertable *prv)
  408. {
  409. olAssert(SUCCEEDED(CheckReverted()));
  410. _cilChildren.RemoveRv(prv);
  411. }
  412. //+--------------------------------------------------------------
  413. //
  414. // Member: CPubDocFile::AddChild, public
  415. //
  416. // Synopsis: Adds a child instance
  417. //
  418. // Arguments: [prv] - Child
  419. //
  420. // History: 03-Mar-92 DrewB Created
  421. //
  422. //---------------------------------------------------------------
  423. inline void CPubDocFile::AddChild(PRevertable *prv)
  424. {
  425. olAssert(SUCCEEDED(CheckReverted()));
  426. _cilChildren.Add(prv);
  427. }
  428. //+--------------------------------------------------------------
  429. //
  430. // Member: CPubDocFile::IsEntry, public
  431. //
  432. // Synopsis: Checks whether the given name is an entry or not
  433. //
  434. // Arguments: [dfnName] - Name of element
  435. // [peb] - Entry buffer to fill in
  436. //
  437. // Returns: Appropriate status code
  438. //
  439. // Modifies: [peb]
  440. //
  441. // History: 17-Mar-92 DrewB Created
  442. //
  443. //---------------------------------------------------------------
  444. inline SCODE CPubDocFile::IsEntry(CDfName const *dfnName,
  445. SEntryBuffer *peb)
  446. {
  447. SCODE sc;
  448. if (SUCCEEDED(sc = CheckReverted()))
  449. sc = _pdf->IsEntry(dfnName, peb);
  450. return sc;
  451. }
  452. //+--------------------------------------------------------------
  453. //
  454. // Member: CPubDocFile::IsAtOrAbove, public
  455. //
  456. // Synopsis: Determines whether the given public is an ancestor
  457. // of this public
  458. //
  459. // Arguments: [pdf] - Docfile to check
  460. //
  461. // Returns: TRUE or FALSE
  462. //
  463. // History: 07-Jul-92 DrewB Created
  464. //
  465. //---------------------------------------------------------------
  466. inline BOOL CPubDocFile::IsAtOrAbove(CPubDocFile *pdf)
  467. {
  468. CPubDocFile *pdfPar = this;
  469. olAssert(SUCCEEDED(CheckReverted()));
  470. // MAC compiler can't support natural form with two returns
  471. do
  472. {
  473. if (pdfPar == pdf)
  474. break;
  475. }
  476. while (pdfPar = BP_TO_P(CPubDocFile *, pdfPar->_pdfParent));
  477. return pdfPar == pdf;
  478. }
  479. //+--------------------------------------------------------------
  480. //
  481. // Member: CPubDocFile::CheckReverted, private
  482. //
  483. // Synopsis: Returns STG_E_REVERTED if reverted
  484. //
  485. // History: 30-Jan-92 DrewB Created
  486. //
  487. //---------------------------------------------------------------
  488. inline SCODE CPubDocFile::CheckReverted(void) const
  489. {
  490. #ifndef COORD
  491. return P_REVERTED(_df) ? STG_E_REVERTED : S_OK;
  492. #else
  493. return P_REVERTED(_df) ? STG_E_REVERTED :
  494. (P_COMMITTING(_df) ? STG_E_ABNORMALAPIEXIT : S_OK);
  495. #endif
  496. }
  497. //+---------------------------------------------------------------------------
  498. //
  499. // Member: CPubDocFile::InsertXSMember, public
  500. //
  501. // Synopsis: Puts an XSM into the XS
  502. //
  503. // Arguments: [ptsm] - XSM
  504. //
  505. // History: 23-Nov-92 DrewB Created
  506. //
  507. //----------------------------------------------------------------------------
  508. inline void CPubDocFile::InsertXSMember(PTSetMember *ptsm)
  509. {
  510. olAssert(_tss.FindName(ptsm->GetDfName(), ptsm->GetTree()) == NULL);
  511. ptsm->AddRef();
  512. _tss.AddMember(ptsm);
  513. }
  514. //+---------------------------------------------------------------------------
  515. //
  516. // Member: CPubDocFile::RemoveXSMember, public
  517. //
  518. // Synopsis: Removes an XSM from the XS
  519. //
  520. // Arguments: [ptsm] - XSM
  521. //
  522. // History: 23-Nov-92 DrewB Created
  523. //
  524. //----------------------------------------------------------------------------
  525. inline void CPubDocFile::RemoveXSMember(PTSetMember *ptsm)
  526. {
  527. olAssert(_tss.FindName(ptsm->GetDfName(), ptsm->GetTree()) != NULL);
  528. _tss.RemoveMember(ptsm);
  529. ptsm->Release();
  530. }
  531. //+--------------------------------------------------------------
  532. //
  533. // Member: CPubDocFile::FindXSMember, public
  534. //
  535. // Synopsis: Looks up an XS member
  536. //
  537. // Arguments: [pdfn] - Name of object to find
  538. // [luidTree] - Tree to look in
  539. //
  540. // Returns: Member or NULL
  541. //
  542. // History: 29-Jan-92 DrewB Created
  543. // 28-Oct-92 AlexT Convert to name
  544. //
  545. //---------------------------------------------------------------
  546. inline PTSetMember *CPubDocFile::FindXSMember(CDfName const *pdfn,
  547. DFLUID luidTree)
  548. {
  549. olDebugOut((DEB_ITRACE, "In CPubDocFile::FindXSMember:%p(%p)\n",
  550. this, pdfn));
  551. olAssert(pdfn != NULL && aMsg("Can't find XSM with NULL name"));
  552. PTSetMember *ptsm = _tss.FindName(pdfn, luidTree);
  553. olDebugOut((DEB_ITRACE, "Out CPubDocFile::FindXSMember => %p\n", ptsm));
  554. return ptsm;
  555. }
  556. //+--------------------------------------------------------------
  557. //
  558. // Member: CPubDocFile::DestroyChild, public
  559. //
  560. // Synopsis: Destroy a child
  561. //
  562. // Arguments: [luid] - Name of child to destroy
  563. //
  564. // History: 29-Jan-92 DrewB Created
  565. //
  566. //---------------------------------------------------------------
  567. inline void CPubDocFile::DestroyChild(DFLUID luid)
  568. {
  569. olAssert(luid != DF_NOLUID);
  570. ChangeXs(luid, XSO_RELEASE);
  571. }
  572. //+--------------------------------------------------------------
  573. //
  574. // Member: CPubDocFile::RenameChild, public
  575. //
  576. // Synopsis: Rename a child
  577. //
  578. // Arguments: [pdfnOld] - Current name
  579. // [luidTree] - Tree to look in
  580. // [pdfnNew] - New name
  581. //
  582. // History: 28-Oct-92 AlexT Created
  583. //
  584. //---------------------------------------------------------------
  585. inline void CPubDocFile::RenameChild(
  586. CDfName const *pdfnOld,
  587. DFLUID luidTree,
  588. CDfName const *pdfnNew)
  589. {
  590. _tss.RenameMember(pdfnOld, luidTree, pdfnNew);
  591. }
  592. //+---------------------------------------------------------------------------
  593. //
  594. // Member: CPubDocFile::GetBaseMS, public
  595. //
  596. // Synopsis: Return pointer to base multistream
  597. //
  598. // History: 11-Feb-93 PhilipLa Created
  599. //
  600. //----------------------------------------------------------------------------
  601. inline CMStream * CPubDocFile::GetBaseMS(void)
  602. {
  603. return BP_TO_P(CMStream *, _pmsBase);
  604. }
  605. //+---------------------------------------------------------------------------
  606. //
  607. // Member: CPubDocFile::GetName, public
  608. //
  609. // Synopsis: Returns a pointer to the name of this storage
  610. //
  611. // Returns: CDfName *
  612. //
  613. // History: 30-Nov-93 DrewB Created
  614. //
  615. //----------------------------------------------------------------------------
  616. inline CDfName *CPubDocFile::GetName(void)
  617. {
  618. return &_dfn;
  619. }
  620. //+---------------------------------------------------------------------------
  621. //
  622. // Member: CPubDocFile::FindGreaterEntry, public
  623. //
  624. // Synopsis: Returns the next greater child
  625. //
  626. // Arguments: [pdfnKey] - Previous key
  627. // [pib] - Fast iterator buffer
  628. // [pstat] - Full iterator buffer
  629. // [fProps] - Return properties or normal entries
  630. //
  631. // Returns: Appropriate status code
  632. //
  633. // Modifies: [pib] or [pstat]
  634. //
  635. // History: 16-Apr-93 DrewB Created
  636. //
  637. // Notes: Either [pib] or [pstat] must be NULL
  638. //
  639. //----------------------------------------------------------------------------
  640. inline SCODE CPubDocFile::FindGreaterEntry(CDfName const *pdfnKey,
  641. SIterBuffer *pib,
  642. STATSTGW *pstat,
  643. BOOL fProps)
  644. {
  645. olAssert((pib == NULL) != (pstat == NULL));
  646. olAssert(SUCCEEDED(CheckReverted()));
  647. return _pdf->FindGreaterEntry(pdfnKey, pib, pstat);
  648. }
  649. //+---------------------------------------------------------------------------
  650. //
  651. // Member: CPubDocFile::GetBasis, public
  652. //
  653. // Synopsis: Returns DfBasis
  654. //
  655. //----------------------------------------------------------------------------
  656. inline CDFBasis* CPubDocFile::GetBasis(void)
  657. {
  658. return BP_TO_P(CDFBasis*, _pdfb);
  659. }
  660. //+--------------------------------------------------------------
  661. //
  662. // Member: CPubDocFile::EmptyCache, public
  663. //
  664. // Synopsis: empties the stream caches
  665. //
  666. // History: 03-Aug-99 HenryLee Created
  667. //
  668. //---------------------------------------------------------------
  669. inline void CPubDocFile::EmptyCache()
  670. {
  671. _cilChildren.EmptyCache();
  672. }
  673. #endif