windows-nt/Source/XPSP1/NT/com/ole32/stg/h/difat.hxx
2020-09-26 16:20:57 +08:00

188 lines
4.4 KiB
C++

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