#include "inspch.h" #include "util2.h" #include "inseng.h" #include "ciffile.h" CCifEntryEnum::CCifEntryEnum(UINT dwFilter, UINT dwParentType, LPSTR pszParentID) { _cRef = 0; _uIndex = 0; _uFilter = dwFilter; if(_uFilter == 0) _uFilter = PLATFORM_ALL; _uParentType = dwParentType; if(_uParentType != PARENTTYPE_CIF) lstrcpyn(_szParentID, pszParentID, MAX_ID_LENGTH); } CCifEntryEnum::~CCifEntryEnum() { } CCifComponentEnum::CCifComponentEnum(CCifComponent **rpcomp, UINT dwFilter, UINT dwParentType, LPSTR pszParentID) : CCifEntryEnum(dwFilter, dwParentType, pszParentID) { _rpComp = rpcomp; } CCifComponentEnum::~CCifComponentEnum() { } //************ IUnknown implementation *************** STDMETHODIMP_(ULONG) CCifComponentEnum::AddRef() { return(_cRef++); } STDMETHODIMP_(ULONG) CCifComponentEnum::Release() { ULONG temp = --_cRef; if(temp == 0) delete this; return temp; } STDMETHODIMP CCifComponentEnum::QueryInterface(REFIID riid, void **ppv) { *ppv = NULL; if(riid == IID_IUnknown) *ppv = (IEnumCifComponents *)this; if(*ppv == NULL) return E_NOINTERFACE; AddRef(); return NOERROR; } STDMETHODIMP CCifComponentEnum::Next(ICifComponent **pp) { *pp = NULL; HRESULT hr = E_FAIL; CCifComponent *pcomp; for(pcomp = _rpComp[_uIndex]; pcomp != 0; pcomp = _rpComp[++_uIndex]) { // check filters if(_rpComp[_uIndex]->GetPlatform() & _uFilter) { char szID[MAX_ID_LENGTH]; BOOL bParentOK = FALSE; // platform is ok if(_uParentType == PARENTTYPE_GROUP) { pcomp->GetGroup(szID, sizeof(szID)); if(lstrcmpi(_szParentID, szID) == 0) bParentOK = TRUE; } else if(_uParentType == PARENTTYPE_MODE) { // look though the modes for one that matches for(int i = 0; SUCCEEDED(pcomp->GetMode(i, szID, sizeof(szID))); i++) { if(lstrcmpi(szID, _szParentID) == 0) bParentOK = TRUE; } } else bParentOK = TRUE; if(bParentOK) { hr = NOERROR; *pp = (ICifComponent *) pcomp; _uIndex++; // increment _uIndex so next call to Next keeps moving break; } } } return hr; } STDMETHODIMP CCifComponentEnum::Reset() { _uIndex = 0; return NOERROR; } //***************** CCifGroupEnum ***************************** CCifGroupEnum::CCifGroupEnum(CCifGroup **rpgrp, UINT dwFilter) : CCifEntryEnum(dwFilter, PARENTTYPE_CIF, NULL) { _rpGroup = rpgrp; } CCifGroupEnum::~CCifGroupEnum() { } //************ IUnknown implementation *************** STDMETHODIMP_(ULONG) CCifGroupEnum::AddRef() { return(_cRef++); } STDMETHODIMP_(ULONG) CCifGroupEnum::Release() { ULONG temp = --_cRef; if(temp == 0) delete this; return temp; } STDMETHODIMP CCifGroupEnum::QueryInterface(REFIID riid, void **ppv) { *ppv = NULL; if(riid == IID_IUnknown) *ppv = (IEnumCifGroups *)this; if(*ppv == NULL) return E_NOINTERFACE; AddRef(); return NOERROR; } STDMETHODIMP CCifGroupEnum::Next(ICifGroup **pp) { HRESULT hr = E_FAIL; CCifGroup *pgrp; *pp = NULL; for(pgrp = _rpGroup[_uIndex]; pgrp != 0; pgrp = _rpGroup[++_uIndex]) { hr = NOERROR; *pp = (ICifGroup *) pgrp; _uIndex++; // increment _uIndex so next call to Next keeps moving break; } return hr; } STDMETHODIMP CCifGroupEnum::Reset() { _uIndex = 0; return NOERROR; } //***************** CCifModeEnum ***************************** CCifModeEnum::CCifModeEnum(CCifMode **rpmode, UINT dwFilter) : CCifEntryEnum(dwFilter, PARENTTYPE_CIF, NULL) { _rpMode = rpmode; } CCifModeEnum::~CCifModeEnum() { } //************ IUnknown implementation *************** STDMETHODIMP_(ULONG) CCifModeEnum::AddRef() { return(_cRef++); } STDMETHODIMP_(ULONG) CCifModeEnum::Release() { ULONG temp = --_cRef; if(temp == 0) delete this; return temp; } STDMETHODIMP CCifModeEnum::QueryInterface(REFIID riid, void **ppv) { *ppv = NULL; if(riid == IID_IUnknown) *ppv = (IEnumCifModes *)this; if(*ppv == NULL) return E_NOINTERFACE; AddRef(); return NOERROR; } STDMETHODIMP CCifModeEnum::Next(ICifMode **pp) { HRESULT hr = E_FAIL; CCifMode *pmode; *pp = NULL; for(pmode = _rpMode[_uIndex]; pmode != 0; pmode = _rpMode[++_uIndex]) { hr = NOERROR; *pp = (ICifMode *) pmode; _uIndex++; // increment _uIndex so next call to Next keeps moving break; } return hr; } STDMETHODIMP CCifModeEnum::Reset() { _uIndex = 0; return NOERROR; }