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.
|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995.
//
// File: DisBmk.hxx
//
// Contents: Inline wrapper for distributed bookmark.
//
// Classes: CDistributedBookmark
//
// History: 05-Jun-95 KyleP Created
//
//----------------------------------------------------------------------------
#pragma once
//+---------------------------------------------------------------------------
//
// Class: CDistributedBookmark
//
// Purpose: Inline wrapper for distributed bookmark.
//
// History: 05-Jun-95 KyleP Created.
//
// Notes: A distributed bookmark is organized as follows:
// Offset 0: Index of 'primary' cursor (length sizeof(ULONG))
// Offset 4: Bookmark for child cursor 0 (length n)
// Offset 4 + (i*n): Bookmark for child cursor i (length n)
//
// Each child bookmark must be fixed length, and the same length.
//
//----------------------------------------------------------------------------
class CDistributedBookmark { public:
inline CDistributedBookmark( DBBKMARK cbBookmark, BYTE const * pbBookmark, DBBKMARK cbTotal, unsigned cCursor );
inline unsigned Index() const;
inline BYTE const * Get() const; inline BYTE const * Get( unsigned iChild ) const; inline DBBKMARK GetSize() const;
inline BOOL IsValid( unsigned iChild ) const;
private:
DBBKMARK _cbChild;
DBBKMARK _cbBookmark; BYTE const * _pbBookmark; };
//+---------------------------------------------------------------------------
//
// Member: CDistributedBookmark::CDistributedBookmark, public
//
// Synopsis: Initializes and validates bookmark.
//
// Arguments: [cbBookmark] -- Size of [pbBookmark].
// [pbBookmark] -- Pointer to bookmark.
// [cbTotal] -- Size of fully formed bookmark.
// [cCursor] -- Number of child cursors.
//
// History: 05-Jun-95 KyleP Created.
// 24-Jan-97 KrishnaN Modified to conform with 1.0 spec
//
//----------------------------------------------------------------------------
inline CDistributedBookmark::CDistributedBookmark( DBBKMARK cbBookmark, BYTE const * pbBookmark, DBBKMARK cbTotal, unsigned cCursor ) : _cbChild( (cbTotal - sizeof(ULONG)) / cCursor ), _cbBookmark( cbBookmark ), _pbBookmark( pbBookmark ) { //
// We only support fixed length bookmarks with equal size components and
// the special bookmarks (beginning, end, and null).
//
if ( 0 == _cbBookmark) { // Legal, though weird...
_cbChild = 0; return; // no need to check further.
}
if ( _cbBookmark != cbTotal ) { if ( _cbBookmark == 1 ) { if (*_pbBookmark != DBBMK_FIRST && *_pbBookmark != DBBMK_LAST ) THROW( CException( DB_E_BADBOOKMARK ) );
_cbChild = 1; } else THROW( CException( DB_E_BADBOOKMARK ) ); } }
//+---------------------------------------------------------------------------
//
// Member: CDistributedBookmark::Index, public
//
// Returns: Index of primary cursor.
//
// History: 05-Jun-95 KyleP Created.
//
//----------------------------------------------------------------------------
inline unsigned CDistributedBookmark::Index() const { Win4Assert( _cbBookmark > 1 );
return *(ULONG UNALIGNED *)_pbBookmark; }
//+---------------------------------------------------------------------------
//
// Member: CDistributedBookmark::Get, public
//
// Returns: Bookmark of primary cursor.
//
// History: 05-Jun-95 KyleP Created.
//
//----------------------------------------------------------------------------
inline BYTE const * CDistributedBookmark::Get() const { if ( _cbBookmark <= 1 ) return _pbBookmark; else return _pbBookmark + sizeof(ULONG) + Index() * _cbChild; }
//+---------------------------------------------------------------------------
//
// Member: CDistributedBookmark::Get, public
//
// Arguments: [iChild] -- Bookmark fetched for this child.
//
// Returns: Bookmark of cursor [iChild].
//
// History: 05-Jun-95 KyleP Created.
//
//----------------------------------------------------------------------------
inline BYTE const * CDistributedBookmark::Get( unsigned iChild ) const { if ( _cbBookmark <= 1 ) return _pbBookmark; else return _pbBookmark + sizeof(ULONG) + iChild * _cbChild; }
//+---------------------------------------------------------------------------
//
// Member: CDistributedBookmark::GetSize, public
//
// Returns: Size of child bookmark.
//
// History: 05-Jun-95 KyleP Created.
//
//----------------------------------------------------------------------------
inline DBBKMARK CDistributedBookmark::GetSize() const { return _cbChild; }
//+---------------------------------------------------------------------------
//
// Member: CDistributedBookmark::IsValid, public
//
// Arguments: [iChild] -- Bookmark fetched for this child.
//
// Returns: TRUE if bookmark for [iChild] is valid (not all 0xFF).
//
// History: 05-Jun-95 KyleP Created.
//
//----------------------------------------------------------------------------
inline BOOL CDistributedBookmark::IsValid( unsigned iChild ) const { if ( _cbBookmark <= 1 ) return TRUE;
BYTE const * pb = Get( iChild );
for ( unsigned i = 0; i < _cbChild; i++ ) if ( pb[i] != 0xFF ) break;
return i != _cbChild; }
|