206 lines
5.9 KiB
C++
206 lines
5.9 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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;
|
||
|
}
|
||
|
|