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.
|
|
//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: TaskEnum.cpp
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 11/19/1997 RaviR Created
//____________________________________________________________________________
//
#include "stdafx.h"
#include "taskenum.h"
CTaskEnumerator::~CTaskEnumerator() { POSITION pos = m_list.GetHeadPosition(); while (pos) { STaskEnums& rte = m_list.GetNext(pos); rte.pET->Release(); }
m_list.RemoveAll(); }
bool CTaskEnumerator::AddTaskEnumerator( const CLSID& clsid, IEnumTASK* pEnumTASK) { ASSERT(pEnumTASK != NULL); if (pEnumTASK == NULL) return false; STaskEnums te; te.clsid = clsid; te.pET = pEnumTASK;
m_list.AddTail(te); pEnumTASK->AddRef();
if (m_posCurr == NULL) m_posCurr = m_list.GetHeadPosition(); return true; }
STDMETHODIMP CTaskEnumerator::Next( ULONG celt, MMC_TASK *rgelt, ULONG *pceltFetched) { ASSERT(celt == 1); if (celt != 1) return E_INVALIDARG; ASSERT(rgelt != NULL); if (rgelt == NULL) return E_POINTER; // init
if (pceltFetched != NULL) *pceltFetched = 0;
if (m_posCurr == NULL) return S_FALSE;
HRESULT hr = S_FALSE;
while (m_posCurr != NULL) { STaskEnums& rte = m_list.GetAt(m_posCurr); ASSERT(&rte != NULL);
ULONG celtFetched = 0; hr = rte.pET->Next(1, rgelt, &celtFetched); ASSERT(SUCCEEDED(hr)); if (pceltFetched) *pceltFetched = celtFetched;
#ifdef DBG
if (hr == S_FALSE) { ASSERT(celtFetched == 0); } #endif // DBG
if (hr == S_OK) { MMC_ITASK* pTASK = reinterpret_cast<MMC_ITASK*>(rgelt); hr = ::StringFromCLSID(rte.clsid, &(pTASK->szClsid)); ASSERT(SUCCEEDED(hr)); break; } else if (FAILED(hr)) { // continue if the snapin failed enum tasks
hr = S_FALSE; }
m_list.GetNext(m_posCurr); }
return hr; }
STDMETHODIMP CTaskEnumerator::Reset() { POSITION pos = m_list.GetHeadPosition(); while (pos != NULL && pos != m_posCurr) { STaskEnums& rte = m_list.GetNext(pos); ASSERT(&rte != NULL); rte.pET->Reset(); }
m_posCurr = m_list.GetHeadPosition(); return S_OK; }
|