windows-nt/Source/XPSP1/NT/admin/activec/samples/sdksamples/taskpads/enumtask.cpp

94 lines
1.9 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
// EnumTASK.cpp: implementation of the CEnumTASK class.
//
//////////////////////////////////////////////////////////////////////
#include "EnumTASK.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CEnumTASK::CEnumTASK(MMC_TASK *pTaskList, ULONG nTasks)
: m_pTaskList(pTaskList), m_TaskCount(nTasks), m_CurrTask(0)
{
}
CEnumTASK::~CEnumTASK()
{
if (m_pTaskList)
delete [] m_pTaskList;
}
STDMETHODIMP CEnumTASK::QueryInterface(REFIID riid, LPVOID *ppv)
{
if (!ppv)
return E_FAIL;
*ppv = NULL;
if (IsEqualIID(riid, IID_IUnknown))
*ppv = static_cast<IEnumTASK *>(this);
else if (IsEqualIID(riid, IID_IEnumTASK))
*ppv = static_cast<IEnumTASK *>(this);
if (*ppv)
{
reinterpret_cast<IUnknown *>(*ppv)->AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CEnumTASK::AddRef()
{
return InterlockedIncrement((LONG *)&m_cref);
}
STDMETHODIMP_(ULONG) CEnumTASK::Release()
{
if (InterlockedDecrement((LONG *)&m_cref) == 0)
{
delete this;
return 0;
}
return m_cref;
}
HRESULT CEnumTASK::Next(
/* [in] */ ULONG celt,
/* [length_is][size_is][out] */ MMC_TASK __RPC_FAR *rgelt,
/* [out] */ ULONG __RPC_FAR *pceltFetched)
{
*pceltFetched = 0;
if (m_CurrTask < m_TaskCount) {
if (rgelt != NULL) {
CopyMemory(rgelt, &m_pTaskList[m_CurrTask++], sizeof(MMC_TASK));
*pceltFetched = 1;
}
}
return (*pceltFetched != 0) ? S_OK : S_FALSE;
}
HRESULT CEnumTASK::Skip(
/* [in] */ ULONG celt)
{
return E_NOTIMPL;
}
HRESULT CEnumTASK::Reset( void)
{
m_CurrTask = 0;
return S_OK;
}
HRESULT CEnumTASK::Clone(
/* [out] */ IEnumTASK __RPC_FAR *__RPC_FAR *ppenum)
{
return E_NOTIMPL;
}