//+--------------------------------------------------------------------------- // // Copyright (C) 1994-1994, Microsoft Corporation. // // File: regtrans.hxx // // Contents: Watch region transformer // // Classes: CRegionTransformer // // History: 20-Jul-95 BartoszM Created // //---------------------------------------------------------------------------- #pragma once //+------------------------------------------------------------------------- // // Class: CRegionTransformer // // Purpose: Transforms old watch region into new watch region // // History: 20-Jul-95 BartoszM Created // //-------------------------------------------------------------------------- class CWatchRegion; class CTableSegment; class CTableSegList; class CWatchList; class CFwdTableSegIter; class CTableRowLocator; const LONGLONG eSigRegTrans = 0x534E415254474552i64; // "REGTRANS" class CRegionTransformer { public: CRegionTransformer (CWatchRegion* pRegion, DBROWCOUNT offFetch, ULONG_PTR cFetch, BOOL fFwdFetch) : _sigRegTrans(eSigRegTrans), _iWatch (0), _cWatch(-1), _pRegion (pRegion), _iFetchBmk (0), _iFetch(-1), _offFetch (offFetch), _cFetch (cFetch), _fFwdFetch(fFwdFetch), _pSegmentBookmark (0), _iWatchNew (0), _cWatchNew (0), _isContiguous (FALSE), _isExtendForward (FALSE), _isExtendBackward (FALSE), _pSegmentLowFetch(0), _offLowFetchInSegment(-1) { } void SetWatchPos (DBROWCOUNT iWatch) { _iWatch = iWatch; } void SetFetchBmkPos (DBROWCOUNT iFetchBmk) { _iFetchBmk = iFetchBmk; } void SetFetchBmkSegment (CTableSegment* pSeg) { _pSegmentBookmark = pSeg; } void SetFetchRowPosFromBmk(DBROWCOUNT iFetch) { _iFetch = iFetch; } void SetLowFetchPos(CTableSegment* pSegmentLowFetch, DBROWCOUNT iLowFetchRowInSeg) { _pSegmentLowFetch = pSegmentLowFetch; _offLowFetchInSegment = iLowFetchRowInSeg; } BOOL IsContiguous() const { return _isContiguous; } BOOL IsExtendForward () const { return _isExtendForward; } BOOL IsExtendBackward () const { return _isExtendBackward; } CWatchRegion* Region () { return _pRegion; } BOOL Validate (); void Transform (CTableSegList& segList, CWatchList& watchList); DBROWCOUNT GetFetchOffsetFromAnchor() const { return _offFetch; } DBROWCOUNT GetFetchOffsetFromOrigin() const { return _iFetch; } void AddToWatchPos(DBROWCOUNT cDelta); void MoveOrigin( DBROWCOUNT cDelta ); DBROWCOUNT GetFetchCount () const { return _cFetch; } BOOL GetFwdFetch() { return _fFwdFetch; } void DecrementFetchCount( CTableRowLocator & rowLocator, CFwdTableSegIter &iter, CTableSegList & list ); BOOL HasOldRegion (DBROWCOUNT iWindow, DBROWCOUNT cWindow) const { return !(iWindow + cWindow <= _iWatch || iWindow >= _iWatch + _cWatch); } BOOL HasNewRegion (DBROWCOUNT iWindow, DBROWCOUNT cWindow) const { return !(iWindow + cWindow <= _iWatchNew || iWindow >= _iWatchNew + _cWatchNew); } BOOL HasEndOldRegion (DBROWCOUNT iWindow, DBROWCOUNT cWindow) const { return _iWatch + _cWatch > iWindow && _iWatch + _cWatch <= iWindow + cWindow; } BOOL HasEndNewRegion (DBROWCOUNT iWindow, DBROWCOUNT cWindow) const { return _iWatchNew + _cWatchNew > iWindow && _iWatchNew + _cWatchNew <= iWindow + cWindow; } inline void DumpState(); BOOL IsWatched() const { return 0 != _pRegion; } #ifdef CIEXTMODE void CiExtDump(void *ciExtSelf); #endif private: BOOL ValidateMove (); BOOL ValidateExtend(); //----------------------------------------------- // This MUST be the first variable in this class. //----------------------------------------------- const LONGLONG _sigRegTrans; // Watch region parameters DBROWCOUNT _iWatch; DBROWCOUNT _cWatch; CWatchRegion* _pRegion; // Fetch region parameters DBROWCOUNT _iFetchBmk; DBROWCOUNT _iFetch; DBROWCOUNT _offFetch; DBROWCOUNT _cFetch; BOOL _fFwdFetch; // Is direction of fetching rows forward ? CTableSegment* _pSegmentBookmark; // Properties of the transformation DBROWCOUNT _iWatchNew; DBROWCOUNT _cWatchNew; BOOL _isContiguous; BOOL _isExtendForward; BOOL _isExtendBackward; // lowest position in the fetch set CTableSegment* _pSegmentLowFetch; DBROWCOUNT _offLowFetchInSegment; }; //+--------------------------------------------------------------------------- // // Member: CRegionTransformer::AddToWatchPos // // Synopsis: For backward fetches, it adds to the relative position of // the watch position. _iWatch must always be WRT to the // beginning of the lowest fetch segment. // // Arguments: [cDelta] - // // History: 8-08-95 srikants Created // // Notes: // //---------------------------------------------------------------------------- inline void CRegionTransformer::AddToWatchPos( DBROWCOUNT cDelta ) { Win4Assert( cDelta >= 0 ); Win4Assert( _iWatch >= 0 ); tbDebugOut(( DEB_REGTRANS, "CRegTransformer::AddToWatchPos - _iWatch %ld _iWatchNew %ld cDelta %ld\n", _iWatch, _iWatchNew, cDelta )); _iWatch += cDelta; _iWatchNew += cDelta; } #if CIDBG==1 inline void CRegionTransformer::DumpState() { tbDebugOut(( DEB_REGTRANS, "CRegionTransformer = 0x%X\n", this )); tbDebugOut(( DEB_REGTRANS | DEB_NOCOMPNAME, " _iWatch=%d \t\t_cWatch=%d\n", _iWatch, _cWatch )); tbDebugOut(( DEB_REGTRANS | DEB_NOCOMPNAME, " _iFetchBmk=%d \t_iFetch=%d \t_offFetch=%d \t_cFetch=%d \n", _iFetchBmk, _iFetch, _offFetch, _cFetch )); tbDebugOut(( DEB_REGTRANS | DEB_NOCOMPNAME, " _iWatchNew=%d \t_cWatchNew=%d \t_isContiguous=%d \n", _iWatchNew, _cWatchNew, _isContiguous )); tbDebugOut(( DEB_REGTRANS | DEB_NOCOMPNAME, " _isExtendForward=%d \t_isExtendBackward=%d\n", _isExtendForward, _isExtendBackward )); tbDebugOut(( DEB_REGTRANS | DEB_NOCOMPNAME, " _pSegmentLowFetch=0x%X \t\t_offLowFetchInSegment=%d\n", _pSegmentLowFetch, _offLowFetchInSegment )); } #else inline void CRegionTransformer::DumpState() { } #endif // CIDBG=1