ENUM.CPP
//******************************************************************************************* 
// 
// Filename : Enum.cpp 
// 
//Implementation for CEnumCabObjs 
// 
// Copyright 1994 - 1998 Microsoft Corporation. All rights reserved 
// 
//******************************************************************************************* 
 
#include "pch.h" 
 
#include "thisdll.h" 
#include "enum.h" 
 
// *** IUnknown methods *** 
STDMETHODIMP CEnumCabObjs::QueryInterface( 
   REFIID riid,  
   LPVOID FAR* ppvObj) 
{ 
*ppvObj = NULL; 
 
LPUNKNOWN pObj; 
  
if (riid == IID_IUnknown) 
{ 
pObj = (IUnknown*)((IEnumIDList*)this);  
} 
else if (riid == IID_IEnumIDList) 
{ 
pObj = (IUnknown*)((IEnumIDList*)this);  
} 
else 
{ 
   return(E_NOINTERFACE); 
} 
 
pObj->AddRef(); 
*ppvObj = pObj; 
 
return(NOERROR); 
} 
 
 
STDMETHODIMP_(ULONG) CEnumCabObjs::AddRef(void) 
{ 
return(m_cRef.AddRef()); 
} 
 
 
STDMETHODIMP_(ULONG) CEnumCabObjs::Release(void) 
{ 
if (!m_cRef.Release()) 
{ 
   delete this; 
return(0); 
} 
 
return(m_cRef.GetRef()); 
} 
 
 
// *** IEnumIDList methods *** 
STDMETHODIMP CEnumCabObjs::Next(ULONG celt, 
      LPITEMIDLIST *rgelt, 
      ULONG *pceltFetched) 
{ 
*rgelt = NULL; 
if (pceltFetched) 
{ 
*pceltFetched = 0; 
} 
 
HRESULT hRes = m_pcfThis->InitItems(); 
if (FAILED(hRes)) 
{ 
return(hRes); 
} 
 
for ( ; ; ++m_iCount) 
{ 
if (m_iCount >= m_pcfThis->m_lItems.GetCount()) 
{ 
return(S_FALSE); 
} 
 
LPCABITEM pit = m_pcfThis->m_lItems[m_iCount]; 
 
if ((m_uFlags&(SHCONTF_FOLDERS|SHCONTF_NONFOLDERS)) 
!= (SHCONTF_FOLDERS|SHCONTF_NONFOLDERS)) 
{ 
DWORD gfInOut = SFGAO_FOLDER; 
if (FAILED(m_pcfThis->GetAttributesOf(1, (LPCITEMIDLIST *)&pit, &gfInOut))) 
{ 
continue; 
} 
if (!(m_uFlags&SHCONTF_FOLDERS) && (gfInOut&SFGAO_FOLDER)) 
{ 
continue; 
} 
if ((m_uFlags&SHCONTF_FOLDERS) && !(gfInOut&SFGAO_FOLDER)) 
{ 
continue; 
} 
} 
 
if (!(m_uFlags&SHCONTF_INCLUDEHIDDEN) 
&& (pit->uFileAttribs&(FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))) 
{ 
continue; 
} 
 
break; 
} 
 
*rgelt = ILClone((LPCITEMIDLIST)m_pcfThis->m_lItems[m_iCount]); 
 
++m_iCount; 
 
if (*rgelt) 
{ 
if (pceltFetched) 
{ 
*pceltFetched = 1; 
} 
 
return(S_OK); 
} 
 
return(E_OUTOFMEMORY); 
} 
 
 
STDMETHODIMP CEnumCabObjs::Skip(ULONG celt) 
{ 
return(E_NOTIMPL); 
} 
 
 
STDMETHODIMP CEnumCabObjs::Reset() 
{ 
m_iCount = 0; 
 
return(NOERROR); 
} 
 
 
STDMETHODIMP CEnumCabObjs::Clone(IEnumIDList **ppenum) 
{ 
return(E_NOTIMPL); 
}