143 lines
3.8 KiB
C++
143 lines
3.8 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
|
//
|
|
// File: caccess.cxx
|
|
//
|
|
// Contents: Microsoft OleDB/OleDS Data Source Object for ADSI
|
|
//
|
|
// Implementation of the Extended Buffer Object used for storing
|
|
// accessor handles.
|
|
//
|
|
// History: 10-01-96 shanksh Created.
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "oleds.hxx"
|
|
#pragma hdrstop
|
|
|
|
|
|
// --------------------------- C E X T B U F F E R ---------------------------
|
|
//
|
|
// Implementation class for the Extended Buffer object.
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CExtBuff::CExtBuff
|
|
//
|
|
// @mfunc CExtBuff constructor.
|
|
//
|
|
// @rdesc NONE
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CExtBuff::CExtBuff(
|
|
void
|
|
)
|
|
{
|
|
_cItem = 0;
|
|
_cItemMax = 0;
|
|
_rgItem = NULL;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CExtBuff::~CExtBuff
|
|
//
|
|
// @mfunc CExtBuff destructor.
|
|
//
|
|
// @rdesc NONE
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CExtBuff::~CExtBuff(
|
|
void
|
|
)
|
|
{
|
|
if (_rgItem)
|
|
FreeADsMem(_rgItem);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// FInit::CExtBuff
|
|
//
|
|
// CExtBuff initialization (memory allocation for the default item
|
|
// happens here).
|
|
//
|
|
// @rdesc Did the Initialization Succeed
|
|
// @flag TRUE | Initialization succeeded
|
|
// @flag FALSE | Initializtion failed
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL CExtBuff::FInit(
|
|
ULONG cbItem, // size of items to store
|
|
VOID *pvItemDefault // points to a default value to return
|
|
// when an element asked for doesn't exist
|
|
)
|
|
{
|
|
ULONG_PTR hItemDefault;
|
|
|
|
ADsAssert(cbItem);
|
|
ADsAssert(HIWORD(cbItem) == 0);
|
|
|
|
_cbItem = cbItem;
|
|
_rgItem = (BYTE *)AllocADsMem((CEXTBUFFER_DITEM*_cbItem));
|
|
|
|
if (_rgItem == NULL)
|
|
return FALSE;
|
|
|
|
_cItemMax = CEXTBUFFER_DITEM;
|
|
|
|
// It's the first insertion so hItemDefault is always 0 and consequently
|
|
// we don't need to store it.
|
|
if (pvItemDefault)
|
|
return (InsertIntoExtBuffer(pvItemDefault, hItemDefault) == NOERROR);
|
|
else
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// CExtBuff::InsertIntoExtBuffer
|
|
//
|
|
// @mfunc Stores an item in the Extended Buffer.
|
|
//
|
|
// @rdesc Returns one of the following values:
|
|
// @flag S_OK | insertion succeeded,
|
|
// @flag E_OUTOFMEMORY | insertion failed because of memory allocation
|
|
// failure
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CExtBuff::InsertIntoExtBuffer(
|
|
VOID *pvItem, // pointer to item to be stored
|
|
ULONG_PTR &hItem // points to where the item handle is returned
|
|
)
|
|
{
|
|
// If the buffer capacity is exhausted it needs to be reallocated. Buffer capacity
|
|
// is increased by a fixed quantum.
|
|
if (_cItem == _cItemMax) {
|
|
BYTE *pbTmp;
|
|
|
|
pbTmp = (BYTE *)ReallocADsMem(
|
|
_rgItem,
|
|
_cItemMax * _cbItem,
|
|
(_cItemMax +CEXTBUFFER_DITEM)*_cbItem
|
|
);
|
|
if (pbTmp == NULL)
|
|
RRETURN (E_OUTOFMEMORY);
|
|
|
|
// Buffer capacity increased.
|
|
_cItemMax += CEXTBUFFER_DITEM;
|
|
_rgItem = pbTmp;
|
|
}
|
|
|
|
// Copy the item.
|
|
memcpy( (_rgItem + _cItem*_cbItem), (BYTE *)pvItem, _cbItem );
|
|
_cItem++;
|
|
|
|
// Index of the item constitues its handle.
|
|
hItem = _cItem -1;
|
|
|
|
return NOERROR;
|
|
}
|
|
|