//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1992. // // File: difat.hxx // // Contents: Double-indirect Fat class headers // // Classes: CDIFat // CDIFatVector // // Functions: // // History: 02-Sep-92 PhilipLa Created. // //-------------------------------------------------------------------------- #ifndef __DIFAT_HXX__ #define __DIFAT_HXX__ //+------------------------------------------------------------------------- // // Class: CDIFat (dif) // // Purpose: Double Indirect Fat class for MSF // // Interface: See below. // // History: 11-May-92 PhilipLa Created. // //-------------------------------------------------------------------------- class CDIFat { public: CDIFat(); CDIFat(CDIFat *pfatOld); inline ~CDIFat(); VOID Empty(VOID); SCODE GetFatSect(const FSINDEX oSect, SECT *psect); SCODE SetFatSect(const FSINDEX oSect, const SECT sect); SCODE GetSect(const FSINDEX oSect, SECT *psect); SCODE Init(CMStream *pmsParent, const FSINDEX cFatSect); inline void InitCopy(CDIFat *pfatOld); SCODE InitConvert(CMStream *pmsParent, SECT sectMax); SCODE InitNew(CMStream *pmsParent); SCODE Lookup(const SECT sect, SECT *psectRet); SCODE Fixup(CMStream * pmsShadow); SCODE Remap(const FSINDEX oSect, SECT *psectReturn); SCODE RemapSelf(VOID); SCODE Flush(void); #ifdef DIFAT_LOOKUP_ARRAY inline void CacheUnmarkedSect(SECT sectNew, SECT sectMark, SECT sectFree); #endif inline void SetParent(CMStream *pms); private: CFatVector _fv; CBasedMStreamPtr _pmsParent; FSINDEX _cfsTable; #ifdef DIFAT_LOOKUP_ARRAY #define DIFAT_ARRAY_SIZE 8 BOOL _fDoingFixup; #ifdef LARGE_DOCFILE ULONG _cUnmarked; #else USHORT _cUnmarked; #endif SECT _sectUnmarked[DIFAT_ARRAY_SIZE]; SECT _sectMarkTo[DIFAT_ARRAY_SIZE]; SECT _sectFree[DIFAT_ARRAY_SIZE]; #endif SCODE Resize(FSINDEX fsiSize); inline VOID SectToPair( SECT sect, FSINDEX *pipfs, FSOFFSET *pisect) const; SECT PairToSect(FSINDEX ipfs, FSOFFSET isect) const; }; //+------------------------------------------------------------------------- // // Method: CDIFat::~CDIFat, public // // Synopsis: CDIFat destructor // // History: 11-May-92 PhilipLa Created. // //-------------------------------------------------------------------------- inline CDIFat::~CDIFat() { msfDebugOut((DEB_ITRACE, "In CDIFat destructor\n")); msfDebugOut((DEB_ITRACE, "Out CDIFat destructor\n")); } //+------------------------------------------------------------------------- // // Method: CDIFat::InitCopy, public // // Synopsis: Init function for copying // // Arguments: [pfatOld] -- reference to CDIFat to be copied. // // Returns: S_OK if call completed OK. // // Algorithm: *Finish This* // // History: 11-May-92 PhilipLa Created. // // Notes: // //-------------------------------------------------------------------------- inline void CDIFat::InitCopy(CDIFat *pfatOld) { msfDebugOut((DEB_ITRACE, "In CDIFat copy constructor\n")); _pmsParent = pfatOld->_pmsParent; _cfsTable = pfatOld->_cfsTable; _fv.InitCommon(pfatOld->_fv.GetSectBlock(), pfatOld->_fv.GetSectTable()); _fv.InitCopy(&pfatOld->_fv); msfDebugOut((DEB_ITRACE, "Out CDIFat copy constructor\n")); } inline VOID CDIFat::SectToPair(FSINDEX sect, FSINDEX *pipfs, FSOFFSET *pisect) const { msfAssert(sect >= CSECTFAT); sect = sect - CSECTFAT; *pipfs = (FSINDEX)(sect / _fv.GetSectTable()); *pisect = (FSOFFSET)(sect % _fv.GetSectTable()); } inline SECT CDIFat::PairToSect(FSINDEX ipfs, FSOFFSET isect) const { return ipfs * _fv.GetSectTable() + isect + CSECTFAT; } inline void CDIFat::SetParent(CMStream *pms) { _pmsParent = P_TO_BP(CBasedMStreamPtr, pms); _fv.SetParent(pms); } #ifdef DIFAT_LOOKUP_ARRAY inline void CDIFat::CacheUnmarkedSect(SECT sectNew, SECT sectMark, SECT sectFree) { if (_cUnmarked < DIFAT_ARRAY_SIZE) { _sectUnmarked[_cUnmarked] = sectNew; _sectMarkTo[_cUnmarked] = sectMark; _sectFree[_cUnmarked] = sectFree; } _cUnmarked++; } #endif #endif //__DIFAT_HXX__