windows-nt/Source/XPSP1/NT/net/ias/mmc/common/enumtask.h
2020-09-26 16:20:57 +08:00

182 lines
3.2 KiB
C++

//////////////////////////////////////////////////////////////////////////////
/*++
Copyright (C) Microsoft Corporation, 1997 - 1999
Module Name:
EnumTask.h
Abstract:
This header file implements the IEnumTASKImpl template class.
This base class implements an enumerator for tasks to populate a taskpad.
This is an inline template class, there is no cpp class for implementation.
Author:
Michael A. Maguire 02/05/98
Revision History:
mmaguire 02/05/98 - created from MMC taskpad sample code
--*/
//////////////////////////////////////////////////////////////////////////////
#if !defined(_IAS_ENUM_TASKS_H_)
#define _IAS_ENUM_TASKS_H_
//////////////////////////////////////////////////////////////////////////////
// BEGIN INCLUDES
//
// where we can find what this class derives from:
//
//
//
// where we can find what this class has or uses:
//
//
// END INCLUDES
//////////////////////////////////////////////////////////////////////////////
template < class T >
class IEnumTASKImpl : public IEnumTASK
{
public:
IEnumTASKImpl()
{
ATLTRACE(_T("# IEnumTASKImpl::IEnumTASKImpl\n"));
m_refs = 0;
m_index = 0;
m_type = 0; // default group/category
}
~IEnumTASKImpl()
{
ATLTRACE(_T("# IEnumTASKImpl::~IEnumTASKImpl\n"));
}
// IUnknown implementation
public:
STDMETHOD(QueryInterface) (REFIID riid, LPVOID FAR* ppvObj)
{
ATLTRACE(_T("# IEnumTASKImpl::QueryInterface\n"));
if ( (riid == IID_IUnknown) || (riid == IID_IEnumTASK) )
{
*ppvObj = this;
((LPUNKNOWN)(*ppvObj))->AddRef();
return NOERROR;
}
*ppvObj = NULL;
return E_NOINTERFACE;
}
STDMETHOD_(ULONG, AddRef)()
{
ATLTRACE(_T("# IEnumTASKImpl::AddRef\n"));
return ++m_refs;
}
STDMETHOD_(ULONG, Release) ()
{
ATLTRACE(_T("# IEnumTASKImpl::Release\n"));
T * pT = static_cast<T*>(this);
if (--m_refs == 0)
{
delete pT;
return 0;
}
return m_refs;
}
private:
ULONG m_refs;
// IEnumTASKS implementation
public:
STDMETHOD(Next) (ULONG celt, MMC_TASK *rgelt, ULONG *pceltFetched)
{
ATLTRACE(_T("# IEnumTASKImpl::Next -- Override in your derived class\n"));
if ( NULL != pceltFetched)
{
*pceltFetched = 0;
}
return S_FALSE; // Failed to enumerate any more tasks.
}
STDMETHOD(Skip) (ULONG celt)
{
ATLTRACE(_T("# IEnumTASKImpl::Skip\n"));
m_index += celt;
return S_OK;
}
STDMETHOD(Reset)()
{
ATLTRACE(_T("# IEnumTASKImpl::Reset\n"));
m_index = 0;
return S_OK;
}
STDMETHOD(Clone)(IEnumTASK **ppEnumTASK)
{
ATLTRACE(_T("# IEnumTASKImpl::Clone\n"));
// Clone maintaining state info
T * pEnumTasks = new T();
if( pEnumTasks )
{
pEnumTasks->CopyState( (T *) this );
return pEnumTasks->QueryInterface (IID_IEnumTASK, (void **)ppEnumTASK); // can't fail
}
return E_OUTOFMEMORY;
}
STDMETHOD(CopyState)( T * pSourceT)
{
ATLTRACE(_T("# IEnumTASKImpl::CopyState\n"));
m_index = pSourceT->m_index;
m_type = pSourceT->m_type;
return S_OK;
}
protected:
ULONG m_index;
public:
STDMETHOD(Init)(IDataObject * pdo, LPOLESTR szTaskGroup)
{
ATLTRACE(_T("# IEnumTASKImpl::Init -- Override in your derived class\n"));
return S_OK;
}
protected:
int m_type; // Task grouping mechanism.
};
#endif // _IAS_ENUM_TASKS_H_