//*************************************************************************** // // File: // // Module: MS SNMP Provider // // Purpose: // // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // //*************************************************************************** #include #include "csmir.h" #include "smir.h" #include "handles.h" #include "classfac.h" #include "enum.h" #include "textdef.h" #include "helper.h" #include "bstring.h" #ifdef ICECAP_PROFILE #include #endif CEnumSmirMod :: CEnumSmirMod( CSmir *a_Smir ) { //zero the reference count m_cRef=0; //set the index to the first element m_Index=0; //open the smir - create it if you can't open it IWbemServices * moServ = NULL ; IWbemContext *moContext = NULL ; SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext); res= CSmirAccess :: Open(a_Smir,&moServ); if ((S_FALSE==res)||(NULL == moServ)) { //we have a problem if ( moContext ) moContext->Release () ; return; } //I have now opened the smir namespace so look at the module namespaces IEnumWbemClassObject *pEnum = NULL ; //enumerate all of the namespaces that have a __CLASS of MODULE CBString t_BStr (MODULE_NAMESPACE_NAME); SCODE sRes = moServ->CreateInstanceEnum(t_BStr.GetString (), RESERVED_WBEM_FLAG,moContext, &pEnum); if ( moContext ) moContext->Release () ; moServ->Release(); if (FAILED(sRes)||(NULL==pEnum)) { //we have another problem or we have no modules to enumerate return; } ULONG uCount=1; IWbemClassObject *pSmirMosClassObject = NULL ; ULONG puReturned; //OK we have some so loop over the namespaces for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pSmirMosClassObject,&puReturned);) { ISmirModHandle *pTModule = NULL ; SCODE result = g_pClassFactoryHelper->CreateInstance(CLSID_SMIR_ModHandle, IID_ISMIR_ModHandle,(PVOID *)&pTModule); if (FAILED(result)||(NULL == pTModule)) { //problem! pSmirMosClassObject->Release(); pEnum->Release(); //add some trace break; } /*things are looking good; we have the handle to the instance so get the info *some of there properties may be blank so be defensive (SysAllocStrig does *most of this for us) */ //extract the properties *((CSmirModuleHandle*)pTModule) << pSmirMosClassObject; pSmirMosClassObject->Release(); pSmirMosClassObject=NULL; m_IHandleArray.Add(pTModule); } pEnum->Release(); /*as soon as this returns the caller (me) will addref and pass the *interface back to the [real] caller. => I will have to guard against *someone releasing the interface whilst I'm using it. */ } CEnumSmirMod :: CEnumSmirMod(IEnumModule *pSmirMod) { //zero the reference count m_cRef=0; //set the index to the first element m_Index=0; if (NULL == pSmirMod) { return; } ULONG uCount=1; ISmirModHandle *pModule = NULL ; ULONG puReturned = 0; //OK loop over the module namespaces for(pSmirMod->Reset();S_OK==pSmirMod->Next(uCount,&pModule,&puReturned);) { ISmirModHandle *pTModule = NULL ; SCODE result = pModule->QueryInterface(IID_ISMIR_ModHandle,(void**)&pTModule ); pModule->Release(); if(S_OK != result) { //this is not going to happen! I know which interface it is. return ; } /*things are looking good; we have the handle to the instance so *add it to the array */ m_IHandleArray.Add(pTModule); } } CEnumSmirMod :: ~CEnumSmirMod () { /*let the EnumObjectArray empty the module array and delete the *modules I created */ } /* * CEnumSmirMod::QueryInterface * * Purpose: * Manages the interfaces for this object which supports the * IUnknown interface. * * Parameters: * riid REFIID of the interface to return. * ppv PPVOID in which to store the pointer. * * Return Value: * SCODE NOERROR on success, E_NOINTERFACE if the * interface is not supported. */ STDMETHODIMP CEnumSmirMod::QueryInterface(IN REFIID riid, OUT PPVOID ppv) { SetStructuredExceptionHandler seh; try { //Always NULL the out-parameters *ppv=NULL; if (IID_IUnknown==riid) *ppv=this; if (IID_ISMIR_ModuleEnumerator==riid) *ppv=this; if (NULL==*ppv) { return ResultFromScode(E_NOINTERFACE); } //AddRef any interface we'll return. ((LPUNKNOWN)*ppv)->AddRef(); return NOERROR; } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } SCODE CEnumSmirMod::Clone(IN IEnumModule **ppenum) { SetStructuredExceptionHandler seh; try { if(NULL == ppenum) return E_INVALIDARG; int ModIndex = m_Index; PENUMSMIRMOD pTmpEnumSmirMod = new CEnumSmirMod(this); m_Index = ModIndex; //we have an enumerator so get the interface to pass back if(NULL == pTmpEnumSmirMod) { return ResultFromScode(E_OUTOFMEMORY); } pTmpEnumSmirMod->QueryInterface(IID_ISMIR_ModuleEnumerator,(void**)ppenum); return ResultFromScode(S_OK); } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } /* * CEnumSmirGroup::QueryInterface * * Purpose: * Manages the interfaces for this object which supports the * IUnknowninterface. * * Parameters: * riid REFIID of the interface to return. * ppv PPVOID in which to store the pointer. * * Return Value: * SCODE NOERROR on success, E_NOINTERFACE if the * interface is not supported. */ STDMETHODIMP CEnumSmirGroup::QueryInterface(IN REFIID riid, OUT PPVOID ppv) { SetStructuredExceptionHandler seh; try { //Always NULL the out-parameters *ppv=NULL; if (IID_IUnknown==riid) *ppv=this; if (IID_ISMIR_GroupEnumerator==riid) *ppv=this; if (NULL==*ppv) return ResultFromScode(E_NOINTERFACE); //AddRef any interface we'll return. ((LPUNKNOWN)*ppv)->AddRef(); return NOERROR; } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } SCODE CEnumSmirGroup::Clone(OUT IEnumGroup **ppenum) { SetStructuredExceptionHandler seh; try { if (NULL == ppenum) return E_INVALIDARG; int GroupIndex = m_Index; PENUMSMIRGROUP pTmpEnumSmirGroup = new CEnumSmirGroup(this); m_Index = GroupIndex; //we have an enumerator so get the interface to pass back if(NULL == pTmpEnumSmirGroup) { return ResultFromScode(E_OUTOFMEMORY); } pTmpEnumSmirGroup->QueryInterface(IID_ISMIR_GroupEnumerator,(void**)ppenum); return ResultFromScode(S_OK); } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } CEnumSmirGroup :: ~CEnumSmirGroup () { /*let the EnumObjectArray empty the module array and delete the *modules I created */ } CEnumSmirGroup :: CEnumSmirGroup ( IN CSmir *a_Smir , IN ISmirModHandle *hModule ) { m_cRef=0; //set the index to the first element m_Index=0; //fill in the path etc if(NULL!=hModule) { IWbemServices * moServ = NULL ; IWbemContext *moContext = NULL ; SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext); res= CSmirAccess :: Open(a_Smir,&moServ,hModule); if ((S_FALSE==res)||(NULL == (void*)moServ)) { if ( moContext ) moContext->Release () ; //we have a problem return; } //I have now opened the module namespace so look at the group namespaces IEnumWbemClassObject *pEnum = NULL ; CBString t_BStr (GROUP_NAMESPACE_NAME); SCODE sRes = moServ->CreateInstanceEnum ( t_BStr.GetString (), RESERVED_WBEM_FLAG, moContext, &pEnum ); if ( moContext ) moContext->Release () ; moServ->Release(); if (FAILED(sRes)||(NULL == pEnum)) { //there are no instances return; } ULONG uCount=1; ULONG puReturned = 0 ; IWbemClassObject *pSmirMosClassObject = NULL ; pEnum->Reset(); while(S_OK==pEnum->Next(-1,uCount,&pSmirMosClassObject,&puReturned)) { ISmirGroupHandle *pTGroup = NULL ; SCODE result = g_pClassFactoryHelper->CreateInstance(CLSID_SMIR_GroupHandle, IID_ISMIR_GroupHandle, (PVOID *)&pTGroup); if (FAILED(result)||(NULL == pTGroup)) { //we have a problem pSmirMosClassObject->Release(); break; } //save the module name BSTR szModuleName = NULL ; hModule->GetName(&szModuleName); pTGroup->SetModuleName(szModuleName); SysFreeString(szModuleName); //extract the properties *((CSmirGroupHandle*)pTGroup) << pSmirMosClassObject; //release this resource here because we are in a loop pSmirMosClassObject->Release(); m_IHandleArray.Add(pTGroup); } pEnum->Release(); } else { //open the smir and enumerate the modules ISmirInterrogator *pInterrogativeInt = NULL ; SCODE result = a_Smir->QueryInterface ( IID_ISMIR_Interrogative, ( void ** ) &pInterrogativeInt ) ; if (S_OK != result) { if(NULL != pInterrogativeInt) pInterrogativeInt->Release(); return ; } IEnumModule *pEnumSmirMod = NULL ; //ok now let's use the interrogative interface result = pInterrogativeInt->EnumModules(&pEnumSmirMod); //now use the enumerator if((S_OK != result)||(NULL == pEnumSmirMod)) { pInterrogativeInt->Release(); //no modules return; } ISmirModHandle *phModule = NULL ; for(int iCount=0;S_OK==pEnumSmirMod->Next(1, &phModule, NULL);iCount++) { //we have the module so get the groups via the enumerator IEnumGroup *pEnumSmirGroup = NULL ; result = pInterrogativeInt->EnumGroups(&pEnumSmirGroup,phModule); //now use the enumerator if((S_OK == result)&&(pEnumSmirGroup)) { ISmirGroupHandle *phGroup = NULL ; for(int iCount=0;S_OK==pEnumSmirGroup->Next(1, &phGroup, NULL);iCount++) { m_IHandleArray.Add(phGroup); } } phModule->Release(); pEnumSmirGroup->Release(); } pEnumSmirMod->Release(); pInterrogativeInt->Release(); } } CEnumSmirGroup :: CEnumSmirGroup(IN IEnumGroup *pSmirGroup) { //zero the reference count m_cRef=0; //set the index to the first element m_Index=0; if(NULL == pSmirGroup) { //bad args return; } ULONG uCount=1; ISmirGroupHandle *pGroup = NULL ; ULONG puReturned; //OK loop over the group namespaces for(pSmirGroup->Reset();S_OK==pSmirGroup->Next(uCount,&pGroup,&puReturned);) { ISmirGroupHandle *pTGroup =NULL ; SCODE result = pGroup->QueryInterface(IID_ISMIR_ModHandle,(void**)&pTGroup ); pGroup->Release(); if(S_OK != result) { //this is not going to happen! I know which interface it is. return ; } /*things are looking good; we have the handle to the instance so *add it to out array */ m_IHandleArray.Add(pTGroup); } } /* * CEnumSmirClass::QueryInterface * * Purpose: * Manages the interfaces for this object which supports the * IUnknowninterface. * * Parameters: * riid REFIID of the interface to return. * ppv PPVOID in which to store the pointer. * * Return Value: * SCODE NOERROR on success, E_NOINTERFACE if the * interface is not supported. */ STDMETHODIMP CEnumSmirClass :: QueryInterface(IN REFIID riid, OUT PPVOID ppv) { SetStructuredExceptionHandler seh; try { //Always NULL the out-parameters *ppv=NULL; if (IID_IUnknown==riid) *ppv=this; if (IID_ISMIR_ClassEnumerator==riid) *ppv=this; if (NULL==*ppv) return ResultFromScode(E_NOINTERFACE); //AddRef any interface we'll return. ((LPUNKNOWN)*ppv)->AddRef(); return NOERROR; } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } STDMETHODIMP CEnumSmirClass::Clone(IEnumClass **ppenum) { SetStructuredExceptionHandler seh; try { if(NULL == ppenum) return E_INVALIDARG; int ClassIndex = m_Index; PENUMSMIRCLASS pTmpEnumSmirClass = new CEnumSmirClass(this); m_Index = ClassIndex; //we have an enumerator so get the interface to pass back if(NULL == pTmpEnumSmirClass) { return ResultFromScode(E_OUTOFMEMORY); } if(NOERROR == pTmpEnumSmirClass->QueryInterface(IID_ISMIR_ClassEnumerator,(void**)ppenum)) return S_OK; return E_UNEXPECTED; } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } CEnumSmirClass :: CEnumSmirClass(IEnumClass *pSmirClass) { //zero the reference count m_cRef=0; //set the index to the first element m_Index=0; ULONG uCount=1; ISmirClassHandle *pClass = NULL ; ULONG puReturned; //OK loop through the enumerator for(pSmirClass->Reset();S_OK==pSmirClass->Next(uCount,&pClass,&puReturned);) { ISmirClassHandle *pTClass = NULL ; SCODE result = pClass->QueryInterface(IID_ISMIR_ClassHandle,(void**)&pTClass ); pClass->Release(); if(S_OK != result) { //this is not going to happen! I know which interface it is. return ; } /*things are looking good; we have the handle to the instance so *add it to out array */ m_IHandleArray.Add(pTClass); } } /*enumerate all of the classes in the smir */ CEnumSmirClass :: CEnumSmirClass( CSmir *a_Smir , ISmirDatabase *pSmir, DWORD dwCookie ) { //zero the reference count m_cRef=0; //set the index to the first element m_Index=0; //open the smir IWbemServices *moServ = NULL ; //pointer to the provider IWbemContext *moContext = NULL ; SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext); res= CSmirAccess :: Open(a_Smir,&moServ); if ((S_FALSE==res)||(moServ == NULL)) { if ( moContext ) moContext->Release () ; //we have a problem return; } IEnumWbemClassObject *pEnum = NULL ; CBString t_Bstr(HMOM_SNMPOBJECTTYPE_STRING); SCODE sRes = moServ->CreateClassEnum ( t_Bstr.GetString(), WBEM_FLAG_SHALLOW, moContext, &pEnum ); if ( moContext ) moContext->Release () ; moServ->Release(); if (FAILED(sRes)||(NULL==pEnum)) { //problem or we have no classes to enumerate return ; } //we have some classes so add them to the enumerator ULONG uCount=1; IWbemClassObject *pSmirMosClassObject = NULL ; ULONG puReturned = 0 ; //loop over the classes for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pSmirMosClassObject,&puReturned);) { ISmirClassHandle *pTClass = NULL ; //got one so wrap it to go res = g_pClassFactoryHelper->CreateInstance(CLSID_SMIR_ClassHandle, IID_ISMIR_ClassHandle, (PVOID *)&pTClass); if (FAILED(res)) { //we have a problem pSmirMosClassObject->Release(); return; } pTClass->SetWBEMClass(pSmirMosClassObject); //drop it in the enumeration array m_IHandleArray.Add(pTClass); //if this is an async enumeration signal the connectable object pSmirMosClassObject->Release(); } pEnum->Release(); } CEnumSmirClass :: CEnumSmirClass( CSmir *a_Smir , ISmirDatabase *pSmir, ISmirGroupHandle *hGroup, DWORD dwCookie ) { //zero the reference count m_cRef=0; //set the index to the first element m_Index=0; if(((CSmirGroupHandle*)hGroup)==NULL) { return; } //open the smir IWbemServices *moServ = NULL ; //pointer to the provider IWbemContext *moContext = NULL ; SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext); res= CSmirAccess :: Open(a_Smir,&moServ,hGroup,CSmirAccess::eModule); if ((S_FALSE==res)||(moServ == NULL)) { if ( moContext ) moContext->Release () ; //we have a problem return; } BSTR szTmpGroupName = NULL ; //the group name BSTR szTmpModuleName = NULL ; //the module name hGroup->GetName(&szTmpGroupName); //the group name hGroup->GetModuleName(&szTmpModuleName); //the module name /*query for *associators of {\\.\root\default\SMIR\:Group=""} */ CString sQuery(CString(SMIR_ASSOC_QUERY_STR1) +CString(OPEN_BRACE_STR) +CString(SMIR_NAMESPACE_FROM_ROOT) +CString(BACKSLASH_STR) +CString(szTmpModuleName) +CString(COLON_STR) +CString(GROUP_NAMESPACE_NAME) +CString(EQUALS_STR) +CString(QUOTE_STR) +CString(szTmpGroupName) +CString(QUOTE_STR) +CString(CLOSE_BRACE_STR) ); BSTR szQuery = sQuery.AllocSysString(); IEnumWbemClassObject *pEnum = NULL ; CBString t_QueryFormat (SMIR_ASSOC_QUERY1_TYPE); SCODE sRes = moServ->ExecQuery ( t_QueryFormat.GetString (), szQuery, 0, moContext, &pEnum ); SysFreeString(szQuery); if ( moContext ) moContext->Release () ; moServ->Release(); if (FAILED(sRes)||(NULL==pEnum)) { //problem or we have no classes to enumerate SysFreeString(szTmpGroupName); SysFreeString(szTmpModuleName); return ; } ULONG uCount=1; IWbemClassObject *pSmirMosClassObject = NULL ; ULONG puReturned = 0; //loop over the classes for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pSmirMosClassObject,&puReturned);) { ISmirClassHandle *pTClass = NULL ; //got one so wrap it to go res = g_pClassFactoryHelper->CreateInstance(CLSID_SMIR_ClassHandle, IID_ISMIR_ClassHandle, (PVOID *)&pTClass); if (FAILED(res)) { //we have a problem SysFreeString(szTmpGroupName); SysFreeString(szTmpModuleName); pSmirMosClassObject->Release(); return; } //save the module name pTClass->SetModuleName(szTmpModuleName); //save the group name pTClass->SetGroupName(szTmpGroupName); pTClass->SetWBEMClass(pSmirMosClassObject); //drop it in the enumeration array m_IHandleArray.Add(pTClass); //if this is an async enumeration signal the connectable object pSmirMosClassObject->Release(); } SysFreeString(szTmpModuleName); SysFreeString(szTmpGroupName); pEnum->Release(); } CEnumSmirClass :: CEnumSmirClass( CSmir *a_Smir , ISmirDatabase *pSmir, ISmirModHandle *hModule, DWORD dwCookie ) { m_cRef=0; //set the index to the first element m_Index=0; IWbemServices *moServ = NULL ; //pointer to the provider IWbemContext *moContext = NULL ; SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext); res= CSmirAccess :: Open(a_Smir,&moServ); //I have now opened the smir namespace so look at the classes IEnumWbemClassObject *pEnum = 0; BSTR szTmpModuleName = NULL; hModule->GetName(&szTmpModuleName); /*query for *associators of {\\.\root\default\SMIR:Module="RFC1213_MIB"} where AssocClass=ModuleToClassAssociator */ CString sQuery(CString(SMIR_ASSOC_QUERY_STR1) +CString(OPEN_BRACE_STR) +CString(SMIR_NAMESPACE_FROM_ROOT) +CString(COLON_STR) +CString(MODULE_NAMESPACE_NAME) +CString(EQUALS_STR) +CString(QUOTE_STR) +CString(szTmpModuleName) +CString(QUOTE_STR) +CString(CLOSE_BRACE_STR) +CString(SMIR_ASSOC_QUERY_STR3) +CString(EQUALS_STR) +CString(SMIR_MODULE_ASSOC_CLASS_NAME) ); BSTR szQuery = sQuery.AllocSysString(); CBString t_QueryFormat (SMIR_ASSOC_QUERY1_TYPE); SCODE sRes = moServ->ExecQuery ( t_QueryFormat.GetString (), szQuery, RESERVED_WBEM_FLAG, moContext, &pEnum ); SysFreeString(szQuery); if ( moContext ) moContext->Release () ; moServ->Release(); if (FAILED(sRes)||(NULL==pEnum)) { //problem or we have no classes to enumerate SysFreeString(szTmpModuleName); return ; } VARIANT pVal; VariantInit(&pVal); ULONG uCount=1; IWbemClassObject *pSmirMosClassObject = NULL ; ULONG puReturned = 0; for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pSmirMosClassObject,&puReturned);) { BSTR szTmpGroupName = NULL; //the group name (set when we find it) //find the group that this class belongs to (could be more than one group) //... //ok we have a class in the correct module so add it to the enumeration ISmirClassHandle *pTClass = NULL ; res = g_pClassFactoryHelper->CreateInstance(CLSID_SMIR_ClassHandle, IID_ISMIR_ClassHandle, (PVOID *)&pTClass); if (FAILED(res)) { //we have a problem SysFreeString(szTmpModuleName); pSmirMosClassObject->Release(); return; } //save the module name pTClass->SetModuleName(szTmpModuleName); pTClass->SetWBEMClass(pSmirMosClassObject); //drop it in the enumeration array m_IHandleArray.Add(pTClass); pSmirMosClassObject->Release(); } SysFreeString(szTmpModuleName); pEnum->Release(); } /* * CEnumSmir::Next * CEnumSmir::Skip * CEnumSmir::Reset * * Enumerator methods. */ #pragma warning (disable:4018) SCODE CEnumSmirMod::Next(IN ULONG celt, OUT ISmirModHandle **phModule, OUT ULONG * pceltFetched) { SetStructuredExceptionHandler seh; try { if (NULL!=pceltFetched) *pceltFetched=0; if(celt>0) { //check that the arguments make sense if ((celt > 1)&&(NULL == pceltFetched)) return ResultFromScode(S_FALSE); //get the number of elements in the zero based array int iSize = m_IHandleArray.GetSize(); //get all of the elements requested or until we hit the end of the array int iLoop; for(iLoop=0; (iLoopAddRef(); if (NULL != pceltFetched) (*pceltFetched)++; } } //return based on the number requested return (iLoop==(celt-1))? ResultFromScode(S_FALSE): ResultFromScode(S_OK); } //he asked for 0 and that is what he got return ResultFromScode(S_OK); } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } #pragma warning (disable:4018) SCODE CEnumSmirMod::Skip(IN ULONG celt) { SetStructuredExceptionHandler seh; try { if ((m_Index+celt)0) { //check that the arguments make sense if ((celt > 1)&&(NULL == pceltFetched)) return ResultFromScode(S_FALSE); //get the number of elements in the zero based array int iSize = m_IHandleArray.GetSize(); //get all of the elements requested or until we hit the end of the array int iLoop; for(iLoop=0; (iLoopAddRef(); if (NULL != pceltFetched) (*pceltFetched)++; } } //return based on the number requested return (iLoop==(celt-1))? ResultFromScode(S_FALSE): ResultFromScode(S_OK); } //he asked for 0 and that is what he got return ResultFromScode(S_OK); } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } #pragma warning (disable:4018) SCODE CEnumSmirGroup::Skip(IN ULONG celt) { SetStructuredExceptionHandler seh; try { if ((m_Index+celt)0) { //check that the arguments make sense if ((celt > 1)&&(NULL == pceltFetched)) return ResultFromScode(S_FALSE); //get the number of elements in the zero based array int iSize = m_IHandleArray.GetSize(); //get all of the elements requested or until we hit the end of the array int iLoop; for(iLoop=0; (iLoopAddRef(); if (NULL != pceltFetched) (*pceltFetched)++; } } //return based on the number requested return (iLoop==(celt-1))? ResultFromScode(S_FALSE): ResultFromScode(S_OK); } //he asked for 0 and that is what he got return ResultFromScode(S_OK); } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } #pragma warning (disable:4018) SCODE CEnumSmirClass::Skip(IN ULONG celt) { SetStructuredExceptionHandler seh; try { if ((m_Index+celt)AddRef(); return NOERROR; } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } SCODE CEnumNotificationClass::Clone(IEnumNotificationClass **ppenum) { SetStructuredExceptionHandler seh; try { if(NULL == ppenum) return E_INVALIDARG; int ClassIndex = m_Index; PENUMNOTIFICATIONCLASS pTmpEnumNotificationClass = new CEnumNotificationClass(this); m_Index = ClassIndex; //we have an enumerator so get the interface to pass back if(NULL == pTmpEnumNotificationClass) { return ResultFromScode(E_OUTOFMEMORY); } if(NOERROR == pTmpEnumNotificationClass->QueryInterface(IID_ISMIR_EnumNotificationClass,(void**)ppenum)) return S_OK; return E_UNEXPECTED; } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } CEnumNotificationClass :: CEnumNotificationClass(IEnumNotificationClass *pSmirClass) { //zero the reference count m_cRef=0; //set the index to the first element m_Index=0; ULONG uCount=1; ISmirNotificationClassHandle *pClass = NULL ; ULONG puReturned; //OK loop through the enumerator for(pSmirClass->Reset();S_OK==pSmirClass->Next(uCount,&pClass,&puReturned);) { ISmirNotificationClassHandle *pTClass = NULL ; SCODE result = pClass->QueryInterface(IID_ISMIR_NotificationClassHandle,(void**)&pTClass ); pClass->Release(); if(S_OK != result) { //this is not going to happen! I know which interface it is. return ; } /*things are looking good; we have the handle to the instance so *add it to out array */ m_IHandleArray.Add(pTClass); } } /*enumerate all of the classes in the smir */ CEnumNotificationClass :: CEnumNotificationClass ( CSmir *a_Smir , ISmirDatabase *pSmir, DWORD dwCookie ) { //zero the reference count m_cRef=0; //set the index to the first element m_Index=0; //open the smir IWbemServices *moServ = NULL ; //pointer to the provider IWbemContext *moContext = NULL ; SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext); res= CSmirAccess :: Open(a_Smir,&moServ); if ((S_FALSE==res)||(moServ == NULL)) { if ( moContext ) moContext->Release () ; //we have a problem return; } //I have now opened the smir namespace so look at the classes IEnumWbemClassObject *pEnum = NULL; CBString t_Bstr(HMOM_SNMPNOTIFICATIONTYPE_STRING); SCODE sRes = moServ->CreateClassEnum ( t_Bstr.GetString(), WBEM_FLAG_SHALLOW, moContext, &pEnum ); if ( moContext ) moContext->Release () ; moServ->Release(); if (FAILED(sRes)||(NULL==pEnum)) { //problem or we have no classes to enumerate return ; } //we have some classes so add them to the enumerator ULONG uCount=1; IWbemClassObject *pSmirMosClassObject = NULL ; ULONG puReturned; //loop over the classes for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pSmirMosClassObject,&puReturned);) { ISmirNotificationClassHandle *pTClass; //got one so wrap it to go res = g_pClassFactoryHelper->CreateInstance(CLSID_SMIR_NotificationClassHandle, IID_ISMIR_NotificationClassHandle, (PVOID *)&pTClass); if (FAILED(res)) { //we have a problem pSmirMosClassObject->Release(); return; } pTClass->SetWBEMNotificationClass(pSmirMosClassObject); //drop it in the enumeration array m_IHandleArray.Add(pTClass); //if this is an async enumeration signal the connectable object pSmirMosClassObject->Release(); } pEnum->Release(); } CEnumNotificationClass :: CEnumNotificationClass ( IN CSmir *a_Smir , ISmirDatabase *pSmir, ISmirModHandle *hModule, DWORD dwCookie ) { m_cRef=0; //set the index to the first element m_Index=0; IWbemServices *moServ = NULL ; //pointer to the provider IWbemContext *moContext = NULL ; SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext); res= CSmirAccess :: Open(a_Smir,&moServ); //I have now opened the smir namespace so look at the classes if ( ! SUCCEEDED ( res ) ) { if ( moContext ) moContext->Release () ; return ; } IEnumWbemClassObject *pEnum = NULL ; BSTR szTmpModuleName = NULL ; hModule->GetName(&szTmpModuleName); /*query for *associators of {\\.\root\default\SMIR:Module="RFC1213_MIB"} where AssocClass=ModToNotificationClassAssoc */ CString sQuery(CString(SMIR_ASSOC_QUERY_STR1) +CString(OPEN_BRACE_STR) +CString(SMIR_NAMESPACE_FROM_ROOT) +CString(COLON_STR) +CString(MODULE_NAMESPACE_NAME) +CString(EQUALS_STR) +CString(QUOTE_STR) +CString(szTmpModuleName) +CString(QUOTE_STR) +CString(CLOSE_BRACE_STR) +CString(SMIR_ASSOC_QUERY_STR3) +CString(EQUALS_STR) +CString(SMIR_MODULE_ASSOC_NCLASS_NAME) ); BSTR szQuery = sQuery.AllocSysString(); CBString t_QueryFormat (SMIR_ASSOC_QUERY1_TYPE); SCODE sRes = moServ->ExecQuery ( t_QueryFormat.GetString (), szQuery, RESERVED_WBEM_FLAG, moContext, &pEnum ); SysFreeString(szQuery); if ( moContext ) moContext->Release () ; moServ->Release(); if (FAILED(sRes)||(NULL==pEnum)) { //problem or we have no classes to enumerate return ; } VARIANT pVal; VariantInit(&pVal); ULONG uCount=1; IWbemClassObject *pSmirMosClassObject = NULL ; ULONG puReturned = 0; HRESULT enumResult = S_OK; for(pEnum->Reset();S_OK==(enumResult = pEnum->Next(-1,uCount,&pSmirMosClassObject,&puReturned));) { BSTR szTmpGroupName = NULL; //the group name (set when we find it) //find the group that this class belongs to (could be more than one group) //... //ok we have a class in the correct module so add it to the enumeration ISmirNotificationClassHandle *pTClass = NULL ; res = g_pClassFactoryHelper->CreateInstance(CLSID_SMIR_NotificationClassHandle, IID_ISMIR_NotificationClassHandle, (PVOID *)&pTClass); if (FAILED(res)) { //we have a problem SysFreeString(szTmpModuleName); pSmirMosClassObject->Release(); return; } //save the module name pTClass->SetModule(szTmpModuleName); pTClass->SetWBEMNotificationClass(pSmirMosClassObject); //drop it in the enumeration array m_IHandleArray.Add(pTClass); pSmirMosClassObject->Release(); } SysFreeString(szTmpModuleName); pEnum->Release(); } /* * CEnumNotificationClass::Next * CEnumNotificationClass::Skip * CEnumNotificationClass::Reset * */ #pragma warning (disable:4018) SCODE CEnumNotificationClass::Next(IN ULONG celt, OUT ISmirNotificationClassHandle **phClass, OUT ULONG * pceltFetched) { SetStructuredExceptionHandler seh; try { if (NULL!=pceltFetched) *pceltFetched=0; if(celt>0) { //check that the arguments make sense if ((celt > 1)&&(NULL == pceltFetched)) return ResultFromScode(S_FALSE); //get the number of elements in the zero based array int iSize = m_IHandleArray.GetSize(); //get all of the elements requested or until we hit the end of the array int iLoop; for(iLoop=0; (iLoopAddRef(); if (NULL != pceltFetched) (*pceltFetched)++; } } //return based on the number requested return (iLoop==(celt-1))? ResultFromScode(S_FALSE): ResultFromScode(S_OK); } //he asked for 0 and that is what he got return ResultFromScode(S_OK); } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } #pragma warning (disable:4018) SCODE CEnumNotificationClass::Skip(IN ULONG celt) { SetStructuredExceptionHandler seh; try { if ((m_Index+celt)AddRef(); return NOERROR; } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } SCODE CEnumExtNotificationClass::Clone(IEnumExtNotificationClass **ppenum) { SetStructuredExceptionHandler seh; try { if(NULL == ppenum) return E_INVALIDARG; int ClassIndex = m_Index; PENUMEXTNOTIFICATIONCLASS pTmpEnumNotificationClass = new CEnumExtNotificationClass(this); m_Index = ClassIndex; //we have an enumerator so get the interface to pass back if(NULL == pTmpEnumNotificationClass) { return ResultFromScode(E_OUTOFMEMORY); } if(NOERROR == pTmpEnumNotificationClass->QueryInterface(IID_ISMIR_EnumExtNotificationClass,(void**)ppenum)) return S_OK; return E_UNEXPECTED; } catch(Structured_Exception e_SE) { return 0; } catch(Heap_Exception e_HE) { return 0; } catch(...) { return 0; } } CEnumExtNotificationClass :: CEnumExtNotificationClass(IEnumExtNotificationClass *pSmirClass) { //zero the reference count m_cRef=0; //set the index to the first element m_Index=0; ULONG uCount=1; ISmirExtNotificationClassHandle *pClass = NULL ; ULONG puReturned; //OK loop through the enumerator for(pSmirClass->Reset();S_OK==pSmirClass->Next(uCount,&pClass,&puReturned);) { ISmirExtNotificationClassHandle *pTClass = NULL ; SCODE result = pClass->QueryInterface(IID_ISMIR_ExtNotificationClassHandle,(void**)&pTClass ); pClass->Release(); if(S_OK != result) { //this is not going to happen! I know which interface it is. return ; } /*things are looking good; we have the handle to the instance so *add it to out array */ m_IHandleArray.Add(pTClass); } } /*enumerate all of the classes in the smir */ CEnumExtNotificationClass :: CEnumExtNotificationClass( CSmir *a_Smir , ISmirDatabase *pSmir, DWORD dwCookie ) { //zero the reference count m_cRef=0; //set the index to the first element m_Index=0; //open the smir IWbemServices *moServ = NULL ; //pointer to the provider IWbemContext *moContext = NULL ; SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext); res= CSmirAccess :: Open(a_Smir,&moServ); if ((S_FALSE==res)||(moServ == NULL)) { //we have a problem if ( moContext ) moContext->Release () ; return; } //I have now opened the smir namespace so look at the classes IEnumWbemClassObject *pEnum = NULL ; CBString t_Bstr(HMOM_SNMPEXTNOTIFICATIONTYPE_STRING); SCODE sRes = moServ->CreateClassEnum ( t_Bstr.GetString(), WBEM_FLAG_SHALLOW, moContext, &pEnum ); if ( moContext ) moContext->Release () ; moServ->Release(); if (FAILED(sRes)||(NULL==pEnum)) { //problem or we have no classes to enumerate return ; } //we have some classes so add them to the enumerator ULONG uCount=1; IWbemClassObject *pSmirMosClassObject = NULL ; ULONG puReturned; //loop over the classes for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pSmirMosClassObject,&puReturned);) { ISmirExtNotificationClassHandle *pTClass = NULL ; //got one so wrap it to go res = g_pClassFactoryHelper->CreateInstance(CLSID_SMIR_ExtNotificationClassHandle, IID_ISMIR_ExtNotificationClassHandle, (PVOID *)&pTClass); if (FAILED(res)) { //we have a problem pSmirMosClassObject->Release(); return; } pTClass->SetWBEMExtNotificationClass(pSmirMosClassObject); //drop it in the enumeration array m_IHandleArray.Add(pTClass); pSmirMosClassObject->Release(); } pEnum->Release(); } CEnumExtNotificationClass :: CEnumExtNotificationClass ( CSmir *a_Smir , ISmirDatabase *pSmir, ISmirModHandle *hModule, DWORD dwCookie ) { m_cRef=0; //set the index to the first element m_Index=0; IWbemServices *moServ = NULL ; //pointer to the provider IWbemContext *moContext = NULL ; SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext); res= CSmirAccess :: Open(a_Smir,&moServ); if ( ! SUCCEEDED ( res ) ) { if ( moContext ) moContext->Release () ; return ; } //I have now opened the smir namespace so look at the classes IEnumWbemClassObject *pEnum = NULL ; BSTR szTmpModuleName = NULL; hModule->GetName(&szTmpModuleName); /*query for *associators of {\\.\root\default\SMIR:Module="RFC1213_MIB"} where AssocClass=ModToExtNotificationClassAssoc */ CString sQuery(CString(SMIR_ASSOC_QUERY_STR1) +CString(OPEN_BRACE_STR) +CString(SMIR_NAMESPACE_FROM_ROOT) +CString(COLON_STR) +CString(MODULE_NAMESPACE_NAME) +CString(EQUALS_STR) +CString(QUOTE_STR) +CString(szTmpModuleName) +CString(QUOTE_STR) +CString(CLOSE_BRACE_STR) +CString(SMIR_ASSOC_QUERY_STR3) +CString(EQUALS_STR) +CString(SMIR_MODULE_ASSOC_EXTNCLASS_NAME) ); BSTR szQuery = sQuery.AllocSysString(); CBString t_QueryFormat (SMIR_ASSOC_QUERY1_TYPE); SCODE sRes = moServ->ExecQuery ( t_QueryFormat.GetString (), szQuery, RESERVED_WBEM_FLAG, moContext, &pEnum ); SysFreeString(szQuery); if ( moContext ) moContext->Release () ; moServ->Release(); if (FAILED(sRes)||(NULL==pEnum)) { //problem or we have no classes to enumerate return ; } VARIANT pVal; VariantInit(&pVal); ULONG uCount=1; IWbemClassObject *pSmirMosClassObject = NULL ; ULONG puReturned = 0; for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pSmirMosClassObject,&puReturned);) { BSTR szTmpGroupName = NULL; //the group name (set when we find it) //find the group that this class belongs to (could be more than one group) //... //ok we have a class in the correct module so add it to the enumeration ISmirExtNotificationClassHandle *pTClass = NULL ; res = g_pClassFactoryHelper->CreateInstance(CLSID_SMIR_ExtNotificationClassHandle, IID_ISMIR_ExtNotificationClassHandle, (PVOID *)&pTClass); if (FAILED(res)) { //we have a problem SysFreeString(szTmpModuleName); pSmirMosClassObject->Release(); return; } //save the module name pTClass->SetModule(szTmpModuleName); pTClass->SetWBEMExtNotificationClass(pSmirMosClassObject); //drop it in the enumeration array m_IHandleArray.Add(pTClass); pSmirMosClassObject->Release(); } SysFreeString(szTmpModuleName); pEnum->Release(); } /* * CEnumNotificationClass::Next * CEnumNotificationClass::Skip * CEnumNotificationClass::Reset * */ #pragma warning (disable:4018) SCODE CEnumExtNotificationClass::Next(IN ULONG celt, OUT ISmirExtNotificationClassHandle **phClass, OUT ULONG * pceltFetched) { SetStructuredExceptionHandler seh; try { if (NULL!=pceltFetched) *pceltFetched=0; if(celt>0) { //check that the arguments make sense if ((celt > 1)&&(NULL == pceltFetched)) return ResultFromScode(S_FALSE); //get the number of elements in the zero based array int iSize = m_IHandleArray.GetSize(); //get all of the elements requested or until we hit the end of the array int iLoop; for(iLoop=0; (iLoopAddRef(); if (NULL != pceltFetched) (*pceltFetched)++; } } //return based on the number requested return (iLoop==(celt-1))? ResultFromScode(S_FALSE): ResultFromScode(S_OK); } //he asked for 0 and that is what he got return ResultFromScode(S_OK); } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } #pragma warning (disable:4018) SCODE CEnumExtNotificationClass::Skip(IN ULONG celt) { SetStructuredExceptionHandler seh; try { if ((m_Index+celt)