// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
// EnumWbemClassObject.cpp : Implementation of CEnumWbemClassObject
#include "stdafx.h"
#include "WMISearchCtrl.h"
#include "EnumWbemClassObject.h"


/////////////////////////////////////////////////////////////////////////////
// CEnumWbemClassObject

HRESULT CEnumWbemClassObject::Reset( void) {
 
	m_curIndex = 0;

	return S_OK;
}
        
/////////////////////////////////////////////////////////////////////////////
HRESULT CEnumWbemClassObject::Next(/* [in] */ long lTimeout,
								   /* [in] */ ULONG uCount,
								   /* [length_is][size_is][out] */ IWbemClassObject __RPC_FAR *__RPC_FAR *apObjects,
								   /* [out] */ ULONG __RPC_FAR *puReturned){

	//ignore lTimeout for now: I don't know how to deal with it correctly :(
	*puReturned = 0;

	if (m_arObjs.GetSize() == 0) {
		*apObjects = NULL;
		return WBEM_S_FALSE;
	}

	//determine last index you are going to bring
	ULONG uLast = min ((m_curIndex + uCount - 1), m_arObjs.GetUpperBound());

	for (int i = m_curIndex;  i <= uLast;  
		i++, apObjects++, m_curIndex++ ) {
		
			if (m_arObjs.GetAt(i) == NULL) {
				return WBEM_S_FALSE;
			}

			*apObjects = (IWbemClassObject *)m_arObjs[i];
			(*puReturned)++;
	}			
			
	return S_OK;
}

/////////////////////////////////////////////////////////////////////////////
HRESULT CEnumWbemClassObject::NextAsync( 
	/* [in] */ ULONG uCount,
	/* [in] */ IWbemObjectSink __RPC_FAR *pSink) {
	return E_NOTIMPL;
}

/////////////////////////////////////////////////////////////////////////////
HRESULT CEnumWbemClassObject::Clone( 
	/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum){
	return E_NOTIMPL;
}

/////////////////////////////////////////////////////////////////////////////
HRESULT CEnumWbemClassObject::Skip( long lTimeout,
									ULONG nCount){
	//do not support Timeout for now
	
	if ((m_curIndex + nCount) > m_arObjs.GetUpperBound()) {
		m_curIndex = m_arObjs.GetUpperBound();
		return WBEM_S_FALSE;
	}

	m_curIndex += nCount;

	return S_OK;
}


/////////////////////////////////////////////////////////////////////////////
HRESULT  CEnumWbemClassObject::Init(void) {
	
	m_arObjs.RemoveAll();
	m_curIndex = 0;
	return S_OK;
}

/////////////////////////////////////////////////////////////////////////////
HRESULT  CEnumWbemClassObject::AddItem(IWbemClassObject * pItem) {
	
	try {
		m_arObjs.Add((void *) pItem);
	}
	catch (CMemoryException) {
		return E_OUTOFMEMORY;
	}
	return S_OK;

}

/////////////////////////////////////////////////////////////////////////////
HRESULT   CEnumWbemClassObject::GetCount(ULONG * puCount) {
	*puCount = m_arObjs.GetSize();
	return S_OK;
}