Leaked source code of windows server 2003
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.
 
 
 
 
 
 

172 lines
4.2 KiB

//
// epval.cpp
//
// CEnumPropertyValue
//
#include "private.h"
#include "epval.h"
DBG_ID_INSTANCE(CEnumPropertyValue);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// SHARED_TFPROPERTYVAL_ARRAY
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//+---------------------------------------------------------------------------
//
// SAA_New
//
//----------------------------------------------------------------------------
SHARED_TFPROPERTYVAL_ARRAY *SAA_New(ULONG cAttrVals)
{
SHARED_TFPROPERTYVAL_ARRAY *paa;
paa = (SHARED_TFPROPERTYVAL_ARRAY *)cicMemAlloc(sizeof(SHARED_TFPROPERTYVAL_ARRAY)+sizeof(TF_PROPERTYVAL)*cAttrVals-sizeof(TF_PROPERTYVAL));
if (paa != NULL)
{
paa->cRef = 1;
paa->cAttrVals = cAttrVals;
// clear out the attrs so VariantClear is safe
memset(paa->rgAttrVals, 0, cAttrVals*sizeof(TF_PROPERTYVAL));
}
return paa;
}
//+---------------------------------------------------------------------------
//
// SAA_Release
//
//----------------------------------------------------------------------------
void SAA_Release(SHARED_TFPROPERTYVAL_ARRAY *paa)
{
ULONG i;
Assert(paa->cRef > 0);
if (--paa->cRef == 0)
{
for (i=0; i<paa->cAttrVals; i++)
{
VariantClear(&paa->rgAttrVals[i].varValue);
}
cicMemFree(paa);
}
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// CEnumPropertyValue
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//+---------------------------------------------------------------------------
//
// Clone
//
//----------------------------------------------------------------------------
STDAPI CEnumPropertyValue::Clone(IEnumTfPropertyValue **ppEnum)
{
CEnumPropertyValue *pClone;
if (ppEnum == NULL)
return E_INVALIDARG;
*ppEnum = NULL;
if ((pClone = new CEnumPropertyValue) == NULL)
return E_OUTOFMEMORY;
pClone->_ulCur = _ulCur;
pClone->_paa = _paa;
SAA_AddRef(pClone->_paa);
*ppEnum = pClone;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Next
//
//----------------------------------------------------------------------------
STDAPI CEnumPropertyValue::Next(ULONG ulCount, TF_PROPERTYVAL *prgValues, ULONG *pcFetched)
{
ULONG cFetched;
ULONG ulCurOld;
ULONG ulSize;
if (pcFetched == NULL)
{
pcFetched = &cFetched;
}
*pcFetched = 0;
ulCurOld = _ulCur;
if (ulCount > 0 && prgValues == NULL)
return E_INVALIDARG;
ulSize = _paa->cAttrVals;
while (_ulCur < ulSize && *pcFetched < ulCount)
{
QuickVariantInit(&prgValues->varValue);
prgValues->guidId = _paa->rgAttrVals[_ulCur].guidId;
if (VariantCopy(&prgValues->varValue, &_paa->rgAttrVals[_ulCur].varValue) != S_OK)
goto ErrorExit;
prgValues++;
*pcFetched = *pcFetched + 1;
_ulCur++;
}
return *pcFetched == ulCount ? S_OK : S_FALSE;
ErrorExit:
while (--_ulCur > ulCurOld)
{
prgValues--;
VariantClear(&prgValues->varValue);
}
return E_OUTOFMEMORY;
}
//+---------------------------------------------------------------------------
//
// Reset
//
//----------------------------------------------------------------------------
STDAPI CEnumPropertyValue::Reset()
{
_ulCur = 0;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Skip
//
//----------------------------------------------------------------------------
STDAPI CEnumPropertyValue::Skip(ULONG ulCount)
{
_ulCur += ulCount;
return (_ulCur < _paa->cAttrVals) ? S_OK : S_FALSE;
}