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.
306 lines
6.1 KiB
306 lines
6.1 KiB
//***************************************************************************
|
|
//
|
|
// Copyright (c) 1998-1999 Microsoft Corporation
|
|
//
|
|
// ENUMVAR.CPP
|
|
//
|
|
// alanbos 15-Aug-96 Created.
|
|
//
|
|
// Defines the implementation of IEnumVARIANT
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "precomp.h"
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CEnumVar::CEnumVar
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Constructors.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CEnumVar::CEnumVar(CSWbemObjectSet *pObject)
|
|
{
|
|
m_cRef=0;
|
|
m_pEnumObject = pObject;
|
|
m_pEnumObject->AddRef ();
|
|
InterlockedIncrement(&g_cObj);
|
|
}
|
|
|
|
CEnumVar::CEnumVar(void)
|
|
{
|
|
m_cRef=0;
|
|
m_pEnumObject = NULL;
|
|
InterlockedIncrement(&g_cObj);
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CEnumVar::~CEnumVar
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Destructor.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CEnumVar::~CEnumVar(void)
|
|
{
|
|
InterlockedDecrement(&g_cObj);
|
|
|
|
RELEASEANDNULL(m_pEnumObject)
|
|
}
|
|
|
|
//***************************************************************************
|
|
// HRESULT CEnumVar::QueryInterface
|
|
// long CEnumVar::AddRef
|
|
// long CEnumVar::Release
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Standard Com IUNKNOWN functions.
|
|
//
|
|
//***************************************************************************
|
|
|
|
STDMETHODIMP CEnumVar::QueryInterface (
|
|
|
|
IN REFIID riid,
|
|
OUT LPVOID *ppv
|
|
)
|
|
{
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid || IID_IEnumVARIANT==riid)
|
|
*ppv=this;
|
|
|
|
if (NULL!=*ppv)
|
|
{
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CEnumVar::AddRef(void)
|
|
{
|
|
InterlockedIncrement(&m_cRef);
|
|
return m_cRef;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CEnumVar::Release(void)
|
|
{
|
|
LONG cRef = InterlockedDecrement(&m_cRef);
|
|
if (0 != cRef)
|
|
{
|
|
_ASSERT(cRef > 0);
|
|
return cRef;
|
|
}
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CEnumVar::Reset
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Reset the enumeration
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// S_OK success
|
|
// S_FALSE otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CEnumVar::Reset ()
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
|
|
if (m_pEnumObject)
|
|
{
|
|
if (WBEM_S_NO_ERROR == m_pEnumObject->Reset ())
|
|
hr = S_OK;
|
|
|
|
SetWbemError (m_pEnumObject->GetSWbemServices ());
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CEnumVar::Next
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Get the next object in the enumeration
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// lTimeout Number of ms to wait for object (or WBEM_INFINITE for
|
|
// indefinite)
|
|
// ppObject On return may contain the next element (if any)
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// S_OK success
|
|
// S_FALSE not all elements could be returned
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CEnumVar::Next (
|
|
ULONG cElements,
|
|
VARIANT FAR* pVar,
|
|
ULONG FAR* pcElementFetched
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ULONG l2 = 0;
|
|
|
|
if (NULL != pcElementFetched)
|
|
*pcElementFetched = 0;
|
|
|
|
if ((NULL != pVar) && (m_pEnumObject))
|
|
{
|
|
for (ULONG l = 0; l < cElements; l++)
|
|
VariantInit (&pVar [l]);
|
|
|
|
// Retrieve the next cElements elements.
|
|
for (l2 = 0; l2 < cElements; l2++)
|
|
{
|
|
ISWbemObject *pObject = NULL;
|
|
|
|
if (SUCCEEDED(hr = m_pEnumObject->Next (INFINITE, &pObject)))
|
|
{
|
|
if (NULL == pObject)
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
// Set the object into the variant array; note that pObject
|
|
// has been addref'd as a result of the Next() call above
|
|
pVar[l2].vt = VT_DISPATCH;
|
|
pVar[l2].pdispVal = pObject;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
if (NULL != pcElementFetched)
|
|
*pcElementFetched = l2;
|
|
|
|
SetWbemError (m_pEnumObject->GetSWbemServices ());
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
return hr;
|
|
|
|
return (l2 < cElements) ? S_FALSE : S_OK;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CEnumVar::Clone
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Create a copy of this enumeration
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// ppEnum on successful return addresses the clone
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CEnumVar::Clone (
|
|
IEnumVARIANT **ppEnum
|
|
)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
if (NULL != ppEnum)
|
|
{
|
|
*ppEnum = NULL;
|
|
|
|
if (m_pEnumObject)
|
|
{
|
|
CSWbemObjectSet *pEnum = NULL;
|
|
if (WBEM_S_NO_ERROR == (hr = m_pEnumObject->CloneObjectSet (&pEnum)))
|
|
{
|
|
CEnumVar *pEnumVar = new CEnumVar (pEnum);
|
|
|
|
if (!pEnumVar)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pEnumVar->QueryInterface (IID_IEnumVARIANT, (PPVOID) ppEnum)))
|
|
delete pEnumVar;
|
|
|
|
pEnum->Release ();
|
|
}
|
|
|
|
SetWbemError (m_pEnumObject->GetSWbemServices ());
|
|
}
|
|
else
|
|
{
|
|
CEnumVar *pEnumVar = new CEnumVar;
|
|
|
|
if (!pEnumVar)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pEnumVar->QueryInterface (IID_IEnumVARIANT, (PPVOID) ppEnum)))
|
|
delete pEnumVar;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CEnumVar::Skip
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Create a copy of this enumeration
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// ppEnum on successful return addresses the clone
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// S_OK success
|
|
// S_FALSE end of sequence reached prematurely
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CEnumVar::Skip(
|
|
ULONG cElements
|
|
)
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
|
|
if (m_pEnumObject)
|
|
{
|
|
hr = m_pEnumObject->Skip (cElements, INFINITE);
|
|
SetWbemError (m_pEnumObject->GetSWbemServices ());
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|