|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1992.
//
// File: dl.hxx
//
// Contents: Delta list headers for streams
//
// Classes: SDeltaBlock
// CDeltaList
//
// History: 28-Jul-92 PhilipLa Created.
//
//--------------------------------------------------------------------------
#ifndef __DL_HXX__
#define __DL_HXX__
#define DL_GET 0
#define DL_CREATE 1
#define DL_READ 2
class CTransactedStream; SAFE_DFBASED_PTR(CBasedTransactedStreamPtr, CTransactedStream);
#define CBITPERUSHORT 16
//+-------------------------------------------------------------------------
//
// Class: SDeltaBlock (db)
//
// Purpose: A single block of delta list entries.
//
// Interface:
//
// History: 10-Jul-92 PhilipLa Created.
//
// Notes:
//
//--------------------------------------------------------------------------
struct SDeltaBlock { public: #ifndef _MAC
inline #endif
SDeltaBlock();
#ifndef _MAC
inline #endif
void *operator new(size_t size, IMalloc * const pMalloc);
inline const BOOL IsOwned(const USHORT uOffset); inline void MakeOwn(const USHORT uOffset); inline void DisOwn(const USHORT uOffset);
SECT _sect[CSECTPERBLOCK]; USHORT _fOwn[(CSECTPERBLOCK / CBITPERUSHORT)]; }; SAFE_DFBASED_PTR(CBasedDeltaBlockPtr, SDeltaBlock); SAFE_DFBASED_PTR(CBasedDeltaBlockPtrPtr, CBasedDeltaBlockPtr);
inline const BOOL SDeltaBlock::IsOwned(const USHORT uOffset) { msfAssert(uOffset < CSECTPERBLOCK); return (_fOwn[uOffset / CBITPERUSHORT] & (1 << (uOffset % CBITPERUSHORT))) != 0; }
inline void SDeltaBlock::MakeOwn(const USHORT uOffset) { msfAssert(uOffset < CSECTPERBLOCK); msfAssert(!IsOwned(uOffset)); msfAssert((uOffset / CBITPERUSHORT) < (CSECTPERBLOCK / CBITPERUSHORT));
_fOwn[uOffset / CBITPERUSHORT] |= (1 << (uOffset % CBITPERUSHORT)); }
inline void SDeltaBlock::DisOwn(const USHORT uOffset) { msfAssert(uOffset < CSECTPERBLOCK); msfAssert(IsOwned(uOffset)); msfAssert((uOffset / CBITPERUSHORT) < (CSECTPERBLOCK / CBITPERUSHORT));
_fOwn[uOffset / CBITPERUSHORT] &= ~(1 << (uOffset % CBITPERUSHORT)); }
//+-------------------------------------------------------------------------
//
// Class: CDeltaList (dl)
//
// Purpose: Delta list for transacted streans.
//
// Interface:
//
// History: 21-Jan-92 PhilipLa Created.
//
// Notes:
//
//--------------------------------------------------------------------------
class CDeltaList { public: CDeltaList(CMStream *pms, CMStream *pmsScratch);
#ifdef LARGE_STREAMS
SCODE Init(ULONGLONG ulSize, CTransactedStream *ptsParent); SCODE InitResize(ULONGLONG ulSize); #else
SCODE Init(ULONG ulSize, CTransactedStream *ptsParent); SCODE InitResize(ULONG ulSize); #endif
~CDeltaList();
SCODE GetMap(SECT sectOld, const DWORD dwFlags, SECT *psectRet);
void BeginCommit(CTransactedStream *ptsParent); void EndCommit(CDeltaList *pdlNew, DFLAGS df);
inline ILockBytes *GetDataILB(void); inline ILockBytes *GetControlILB(void);
inline CFat * GetDataFat(void); inline CFat * GetControlFat(void);
inline USHORT GetDataSectorSize(void); inline USHORT GetDataSectorShift(void);
inline USHORT GetControlSectorSize(void);
void Empty(void);
inline BOOL IsEmpty(void); inline BOOL IsInMemory(void); inline BOOL IsInStream(void);
inline BOOL IsNoScratch(void);
SCODE IsOwned(SECT sect, SECT sectMap, BOOL *fOwn);
inline CMStream * GetMStream(); SCODE ReleaseInvalidSects(SECT sectMaxValid);
private: CBasedDeltaBlockPtrPtr _apdb; ULONG _ulSize;
CBasedMStreamPtr _pmsScratch;
CBasedMStreamPtr _pms;
CBasedTransactedStreamPtr _ptsParent; SECT _sectStart;
SCODE InitStreamBlock(ULONG ul);
SCODE ReadMap(SECT *psectStart, SECT sect, SECT *psectRet); SCODE WriteMap(SECT *psectStart, SECT sect, SECT sectMap);
void FreeStream(SECT sectStart, ULONG ulSize);
SCODE FindOffset( SECT *psectStart, SECT sect, ULARGE_INTEGER *pulRet, BOOL fWrite);
SCODE DumpList(void);
#if DBG == 1
void PrintList(void); #endif
void ReleaseBlock(ULONG oBlock);
inline CBasedDeltaBlockPtr * GetNewDeltaArray(ULONG ulSize); }; SAFE_DFBASED_PTR(CBasedDeltaListPtr, CDeltaList);
//-----------------
inline CMStream * CDeltaList::GetMStream() { if (!IsNoScratch()) return _pmsScratch; else return _pms; }
//+-------------------------------------------------------------------------
//
// Method: CDeltaList::GetDataILB, public
//
// Synopsis: Return pointer to ILockBytes for storing data
//
// History: 10-Jul-92 PhilipLa Created.
//
//--------------------------------------------------------------------------
inline ILockBytes * CDeltaList::GetDataILB(void) { if (_pms) return _pms->GetILB(); else return _pmsScratch->GetILB(); }
//+-------------------------------------------------------------------------
//
// Method: CDeltaList::GetControlILB, public
//
// Synopsis: Return pointer to ILockBytes for storing control information
//
// History: 10-Jul-92 PhilipLa Created.
//
//--------------------------------------------------------------------------
inline ILockBytes * CDeltaList::GetControlILB(void) { return _pmsScratch->GetILB(); }
//+-------------------------------------------------------------------------
//
// Method: CDeltaList::GetDataFat, public
//
// Synopsis: Return pointer to fat to use for storing stream data
//
// History: 10-Jul-92 PhilipLa Created.
//
//--------------------------------------------------------------------------
inline CFat * CDeltaList::GetDataFat(void) { if (_pms) return _pmsScratch->GetMiniFat(); else return _pmsScratch->GetFat(); }
//+-------------------------------------------------------------------------
//
// Method: CDeltaList::GetControlFat, public
//
// Synopsis: Return pointer to fat to use for storing control information
//
// History: 10-Jul-92 PhilipLa Created.
//
//--------------------------------------------------------------------------
inline CFat * CDeltaList::GetControlFat(void) { return _pmsScratch->GetFat(); }
//+-------------------------------------------------------------------------
//
// Method: CDeltaList::GetDataSectorSize, public
//
// Synopsis: Return sector size for storing stream data
//
// History: 10-Jul-92 PhilipLa Created.
//
//--------------------------------------------------------------------------
inline USHORT CDeltaList::GetDataSectorSize(void) { if (_pms) return _pms->GetSectorSize(); else return _pmsScratch->GetSectorSize(); }
//+-------------------------------------------------------------------------
//
// Method: CDeltaList::GetDataSectorShift, public
//
// Synopsis: Return sector size for storing stream data
//
// History: 10-Jul-92 PhilipLa Created.
//
//--------------------------------------------------------------------------
inline USHORT CDeltaList::GetDataSectorShift(void) { if (_pms) return _pms->GetSectorShift(); else return _pmsScratch->GetSectorShift(); }
//+-------------------------------------------------------------------------
//
// Method: CDeltaList::GetControlSectorSize, public
//
// Synopsis: Return sector size for storing control information
//
// History: 10-Jul-92 PhilipLa Created.
//
//--------------------------------------------------------------------------
inline USHORT CDeltaList::GetControlSectorSize(void) { return _pmsScratch->GetSectorSize(); }
//+---------------------------------------------------------------------------
//
// Member: CDeltaList::IsNoScratch, public
//
// Synopsis: Return TRUE if the delta list is in no-scratch mode
//
// Arguments: None.
//
// History: 19-Nov-92 PhilipLa Created
//
//----------------------------------------------------------------------------
inline BOOL CDeltaList::IsNoScratch(void) { return (_pms != NULL); }
//+---------------------------------------------------------------------------
//
// Member: CDeltaList::IsEmpty, public
//
// Synopsis: Return TRUE if the delta list contains no changes.
//
// Arguments: None.
//
// History: 19-Nov-92 PhilipLa Created
//
//----------------------------------------------------------------------------
inline BOOL CDeltaList::IsEmpty(void) { return ((_apdb == NULL) && (_sectStart == ENDOFCHAIN)); }
//+---------------------------------------------------------------------------
//
// Member: CDeltaList::IsInMemory, public
//
// Synopsis: Return TRUE if the delta list is in memory
//
// Arguments: None.
//
// History: 19-Nov-92 PhilipLa Created
//
//----------------------------------------------------------------------------
inline BOOL CDeltaList::IsInMemory(void) { return (_apdb != NULL); }
//+---------------------------------------------------------------------------
//
// Member: CDeltaList::IsInStream, public
//
// Synopsis: Return TRUE if the delta list is in a stream
//
// Arguments: None.
//
// History: 19-Nov-92 PhilipLa Created
//
//----------------------------------------------------------------------------
inline BOOL CDeltaList::IsInStream(void) { return ((_apdb == NULL) && (_sectStart != ENDOFCHAIN)); }
#endif //__DL_HXX__
|