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.
159 lines
3.9 KiB
159 lines
3.9 KiB
//---------------------------------------------------------------------------
|
|
// Bookmark.cpp : CVDBookmark implementation
|
|
//
|
|
// Copyright (c) 1996 Microsoft Corporation, All Rights Reserved
|
|
// Developed by Sheridan Software Systems, Inc.
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
#include "bookmark.h"
|
|
|
|
SZTHISFILE
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// CVDBookmark - Constructor
|
|
//
|
|
CVDBookmark::CVDBookmark()
|
|
{
|
|
|
|
VariantInit((VARIANT*)&m_varBookmark);
|
|
m_pBookmark = NULL;
|
|
|
|
Reset();
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// ~CVDBookmark - Destructor
|
|
//
|
|
CVDBookmark::~CVDBookmark()
|
|
{
|
|
|
|
SAFEARRAY * psa = NULL;
|
|
|
|
if ((VT_ARRAY | VT_UI1) == V_VT(&m_varBookmark))
|
|
psa = V_ARRAY(&m_varBookmark);
|
|
|
|
if (psa && m_pBookmark)
|
|
SafeArrayUnaccessData(psa);
|
|
|
|
VariantClear((VARIANT*)&m_varBookmark);
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// Reset
|
|
//
|
|
void CVDBookmark::Reset()
|
|
{
|
|
m_cbBookmark = 0;
|
|
m_hRow = 0;
|
|
SetBookmark(VDBOOKMARKSTATUS_BEGINNING);
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// SetBookmark
|
|
//
|
|
HRESULT CVDBookmark::SetBookmark(WORD wStatus, HROW hRow, BYTE* pBookmark, ULONG cbBookmark)
|
|
{
|
|
|
|
SAFEARRAY * psa = NULL;
|
|
|
|
switch (wStatus)
|
|
{
|
|
case VDBOOKMARKSTATUS_BEGINNING:
|
|
cbBookmark = CURSOR_DB_BMK_SIZE;
|
|
pBookmark = (BYTE*)&CURSOR_DBBMK_BEGINNING;
|
|
break;
|
|
case VDBOOKMARKSTATUS_END:
|
|
cbBookmark = CURSOR_DB_BMK_SIZE;
|
|
pBookmark = (BYTE*)&CURSOR_DBBMK_END;
|
|
break;
|
|
case VDBOOKMARKSTATUS_CURRENT:
|
|
break;
|
|
case VDBOOKMARKSTATUS_INVALID:
|
|
return S_OK;
|
|
default:
|
|
ASSERT_(FALSE);
|
|
return E_FAIL;
|
|
}
|
|
|
|
// initialize status flag
|
|
m_wStatus = VDBOOKMARKSTATUS_INVALID;
|
|
|
|
// get pointer to existing safe array
|
|
if ((VT_ARRAY | VT_UI1) == V_VT(&m_varBookmark))
|
|
psa = V_ARRAY(&m_varBookmark);
|
|
|
|
if (psa)
|
|
{
|
|
// if len changed and new len not = zero then redim array
|
|
if (cbBookmark && cbBookmark != m_cbBookmark)
|
|
{
|
|
long lUbound;
|
|
HRESULT hr = SafeArrayGetUBound(psa, 1, &lUbound);
|
|
ASSERT_(!hr);
|
|
if ((ULONG)lUbound + 1 != cbBookmark) // confirm array needs rediming
|
|
{
|
|
if (psa && m_pBookmark)
|
|
SafeArrayUnaccessData(psa); // release old lock
|
|
SAFEARRAYBOUND sab;
|
|
sab.lLbound = 0;
|
|
sab.cElements = cbBookmark;
|
|
hr = SafeArrayRedim(psa, &sab);
|
|
ASSERT_(!hr);
|
|
if SUCCEEDED(hr)
|
|
SafeArrayAccessData(psa, (void**)&m_pBookmark);
|
|
else
|
|
return hr;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
// if no existing array create one if passed in length not zero
|
|
if (cbBookmark && pBookmark)
|
|
{
|
|
SAFEARRAYBOUND sab;
|
|
sab.lLbound = 0;
|
|
sab.cElements = cbBookmark;
|
|
psa = SafeArrayCreate(VT_UI1, 1, &sab);
|
|
// if create was successful intital VARIANT structure
|
|
if (psa)
|
|
{
|
|
V_VT(&m_varBookmark) = VT_ARRAY | VT_UI1;
|
|
V_ARRAY(&m_varBookmark) = psa;
|
|
SafeArrayAccessData(psa, (void**)&m_pBookmark);
|
|
}
|
|
else
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
// if everthing ok then copy bookmark data into safe array
|
|
if (psa && m_pBookmark && pBookmark && cbBookmark)
|
|
memcpy(m_pBookmark, pBookmark, cbBookmark);
|
|
|
|
m_wStatus = wStatus;
|
|
m_cbBookmark = cbBookmark;
|
|
m_hRow = hRow;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// IsSameBookmark - compares bookmark data
|
|
//
|
|
BOOL CVDBookmark::IsSameBookmark(CVDBookmark * pbm)
|
|
{
|
|
ASSERT_(pbm);
|
|
|
|
if (!pbm ||
|
|
VDBOOKMARKSTATUS_INVALID == pbm->GetStatus() ||
|
|
VDBOOKMARKSTATUS_INVALID == m_wStatus)
|
|
return FALSE;
|
|
|
|
if (pbm->GetBookmarkLen() == m_cbBookmark &&
|
|
memcmp(pbm->GetBookmark(), m_pBookmark, m_cbBookmark) == 0)
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
|
|
}
|
|
|