//*************************************************************************** // // File: // // Module: MS SNMP Provider // // Purpose: // // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // //*************************************************************************** #include "precomp.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "classfac.h" #include "clasprov.h" #include "creclass.h" #include "guids.h" #ifdef CORRELATOR_INIT SnmpCorrelation :: SnmpCorrelation ( SnmpSession &session , SnmpClassEventObject *eventObject ) : CCorrelator ( session ) , m_session ( &session ) , m_eventObject ( eventObject ) #else //CORRELATOR_INIT SnmpCorrelation :: SnmpCorrelation ( SnmpSession &session , SnmpClassEventObject *eventObject, ISmirInterrogator *a_ISmirInterrogator ) : CCorrelator ( session, a_ISmirInterrogator ) , m_session ( &session ) , m_eventObject ( eventObject ) #endif //CORRELATOR_INIT { } SnmpCorrelation :: ~SnmpCorrelation () { m_session->DestroySession () ; } void SnmpCorrelation :: Correlated ( IN const CCorrelator_Info &info , IN ISmirGroupHandle *phGroup , IN const char* objectId ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L" SnmpCorrelation :: Correlated ( IN const CCorrelator_Info &info , IN ISmirGroupHandle *phGroup , IN const char* objectId )" ) ; ) switch ( info.GetInfo () ) { case CCorrelator_Info :: ECorrSuccess: { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L" Successful correlation" ) ; ) if ( phGroup ) { phGroup->AddRef () ; m_eventObject->ReceiveGroup ( phGroup ) ; } else { } } break ; case CCorrelator_Info :: ECorrSnmpError: { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L" Unsuccessful correlation" ) ; ) m_eventObject->ReceiveError ( info ) ; } break ; default: { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L" Unknown Correlation Status" ) ; ) } break ; } if ( phGroup ) phGroup->Release () ; DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L" Returning from SnmpCorrelation :: Correlated ( IN const CCorrelator_Info &info , IN ISmirGroupHandle *phGroup , IN const char* objectId )" ) ; ) } void SnmpCorrelation :: Finished ( IN const BOOL Complete ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L" SnmpCorrelation :: Finished ( IN const BOOL Complete )" ) ; ) m_eventObject->ReceiveComplete () ; DestroyCorrelator () ; DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L" Returning from SnmpCorrelation :: Finished ( IN const BOOL Complete )" ) ; ) } SnmpClassEventObject :: SnmpClassEventObject ( CImpClasProv *provider , IWbemContext *a_Context ) : m_provider ( provider ) , m_correlate ( TRUE ) , m_synchronousComplete ( FALSE ) , m_correlator ( NULL ) , m_namespaceObject ( NULL ) , m_inCallstack ( FALSE ) , m_Context ( a_Context ) , m_GroupsReceived ( 0 ), m_Interrogator ( NULL ) { if ( m_provider ) m_provider->AddRef () ; if ( m_Context ) { m_Context->AddRef () ; /* * Look for correlation flag in Context */ VARIANT t_Variant ; VariantInit ( & t_Variant ) ; HRESULT result = m_Context->GetValue ( WBEM_CLASS_CORRELATE_CONTEXT_PROP , 0 , & t_Variant ) ; if ( SUCCEEDED ( result ) & ( t_Variant.vt != VT_EMPTY ) ) { if ( t_Variant.vt == VT_BOOL ) m_correlate = t_Variant.boolVal ; VariantClear ( & t_Variant ) ; } } HRESULT result = CoCreateInstance ( CLSID_SMIR_Database , NULL , CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , IID_ISMIR_Interrogative , ( void ** ) &m_Interrogator ); if ( SUCCEEDED ( result ) ) { ISMIRWbemConfiguration *smirConfiguration = NULL ; result = m_Interrogator->QueryInterface ( IID_ISMIRWbemConfiguration , ( void ** ) & smirConfiguration ) ; if ( SUCCEEDED ( result ) ) { result = smirConfiguration->Authenticate ( NULL, NULL, NULL, NULL, 0 , NULL, FALSE ) ; if ( SUCCEEDED ( result ) ) { smirConfiguration->SetContext ( m_Context ) ; smirConfiguration->Release () ; } } else { m_Interrogator->Release () ; m_synchronousComplete = TRUE ; m_errorObject.SetStatus ( WBEM_SNMP_E_PROVIDER_FAILURE ) ; m_errorObject.SetWbemStatus ( WBEM_E_PROVIDER_FAILURE ) ; m_errorObject.SetMessage ( L"QueryInterface on ISmirInterrogator Failed" ) ; } } else { m_synchronousComplete = TRUE ; m_errorObject.SetStatus ( WBEM_SNMP_E_PROVIDER_FAILURE ) ; m_errorObject.SetWbemStatus ( WBEM_E_PROVIDER_FAILURE ) ; m_errorObject.SetMessage ( L"CoCreateInstance on ISmirInterrogator Failed" ) ; } } SnmpClassEventObject :: ~SnmpClassEventObject () { if ( m_provider ) m_provider->Release () ; if ( m_namespaceObject ) m_namespaceObject->Release () ; if ( m_Context ) m_Context->Release () ; if ( m_Interrogator ) m_Interrogator->Release () ; } BOOL SnmpClassEventObject :: GetClass ( WbemSnmpErrorObject &a_errorObject , IWbemClassObject **classObject , BSTR a_Class ) { HRESULT result = m_Interrogator->GetWBEMClass ( classObject , a_Class ) ; if ( SUCCEEDED ( result ) ) { } else { a_errorObject.SetStatus ( WBEM_SNMP_E_NOT_FOUND ) ; a_errorObject.SetWbemStatus ( WBEM_E_NOT_FOUND ) ; a_errorObject.SetMessage ( L"Failed to get class definition from SMIR" ) ; } return result ; } BOOL SnmpClassEventObject :: GetSnmpNotifyStatusObject ( IWbemClassObject **notifyObject ) { IWbemClassObject *notificationClassObject = NULL ; IWbemClassObject *errorObject = NULL ; BOOL status = TRUE ; WbemSnmpErrorObject errorStatusObject ; if ( notificationClassObject = m_provider->GetSnmpNotificationObject ( errorStatusObject ) ) { HRESULT result = notificationClassObject->SpawnInstance ( 0 , notifyObject ) ; if ( SUCCEEDED ( result ) ) { VARIANT variant ; VariantInit ( &variant ) ; variant.vt = VT_I4 ; variant.lVal = m_errorObject.GetWbemStatus () ; result = (*notifyObject)->Put ( WBEM_PROPERTY_STATUSCODE , 0 , & variant , 0 ) ; VariantClear ( &variant ) ; if ( SUCCEEDED ( result ) ) { variant.vt = VT_I4 ; variant.lVal = m_errorObject.GetStatus () ; result = (*notifyObject)->Put ( WBEM_PROPERTY_SNMPSTATUSCODE , 0 , & variant , 0 ) ; VariantClear ( &variant ) ; if ( SUCCEEDED ( result ) ) { if ( m_errorObject.GetMessage () ) { variant.vt = VT_BSTR ; variant.bstrVal = SysAllocString ( m_errorObject.GetMessage () ) ; result = (*notifyObject)->Put ( WBEM_PROPERTY_SNMPSTATUSMESSAGE , 0 , & variant , 0 ) ; VariantClear ( &variant ) ; if ( ! SUCCEEDED ( result ) ) { (*notifyObject)->Release () ; status = GetNotifyStatusObject ( notifyObject ) ; } } } else { (*notifyObject)->Release () ; status = GetNotifyStatusObject ( notifyObject ) ; } } else { (*notifyObject)->Release () ; status = GetNotifyStatusObject ( notifyObject ) ; } notificationClassObject->Release () ; } else { status = GetNotifyStatusObject ( notifyObject ) ; } } else { status = GetNotifyStatusObject ( notifyObject ) ; } return status ; } BOOL SnmpClassEventObject :: GetNotifyStatusObject ( IWbemClassObject **notifyObject ) { IWbemClassObject *notificationClassObject = NULL ; IWbemClassObject *errorObject = NULL ; BOOL status = TRUE ; WbemSnmpErrorObject errorStatusObject ; if ( notificationClassObject = m_provider->GetNotificationObject ( errorStatusObject ) ) { HRESULT result = notificationClassObject->SpawnInstance ( 0 , notifyObject ) ; if ( SUCCEEDED ( result ) ) { VARIANT variant ; VariantInit ( &variant ) ; variant.vt = VT_I4 ; variant.lVal = m_errorObject.GetWbemStatus () ; result = (*notifyObject)->Put ( WBEM_PROPERTY_STATUSCODE , 0 , & variant , 0 ) ; if ( SUCCEEDED ( result ) ) { if ( m_errorObject.GetMessage () ) { variant.vt = VT_BSTR ; variant.bstrVal = SysAllocString ( m_errorObject.GetMessage () ) ; result = (*notifyObject)->Put ( WBEM_PROPERTY_SNMPSTATUSMESSAGE , 0 , & variant , 0 ) ; VariantClear ( &variant ) ; if ( ! SUCCEEDED ( result ) ) { status = FALSE ; (*notifyObject)->Release () ; (*notifyObject)=NULL ; } } } else { status = FALSE ; (*notifyObject)->Release () ; (*notifyObject)=NULL ; } VariantClear ( &variant ) ; notificationClassObject->Release () ; } else { status = FALSE ; } } else { status = FALSE ; } return status ; } BOOL SnmpClassEventObject :: GetAgentTransport ( WbemSnmpErrorObject &a_errorObject , IWbemQualifierSet *namespaceQualifierObject , wchar_t *&agentTransport ) { BOOL status = TRUE ; agentTransport = NULL ; BSTR t_Transport = NULL ; VARIANT t_Variant ; VariantInit ( & t_Variant ) ; if ( m_Context ) { HRESULT result = m_Context->GetValue ( WBEM_QUALIFIER_AGENTTRANSPORT , 0 , & t_Variant ) ; if ( SUCCEEDED ( result ) & ( t_Variant.vt != VT_EMPTY ) ) { if ( t_Variant.vt == VT_BSTR ) { t_Transport = t_Variant.bstrVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentTransport" ) ; } } } if ( status & ! t_Transport ) { LONG attributeType ; HRESULT result = namespaceQualifierObject->Get ( WBEM_QUALIFIER_AGENTTRANSPORT , 0, &t_Variant , & attributeType ) ; if ( SUCCEEDED ( result ) ) { if ( t_Variant.vt == VT_BSTR ) { t_Transport = t_Variant.bstrVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentTransport" ) ; } } else { t_Transport = WBEM_AGENTIPTRANSPORT ; } } if ( status ) { if ( ( _wcsicmp ( t_Transport , WBEM_AGENTIPTRANSPORT ) == 0 ) || ( _wcsicmp ( t_Transport , WBEM_AGENTIPXTRANSPORT ) == 0 ) ) { agentTransport = UnicodeStringDuplicate ( t_Transport ) ; } else { /* * Transport type != IP || != IPX */ status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_TRANSPORT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Illegal value for qualifier: AgentTransport" ) ; } } VariantClear ( & t_Variant ); return status ; } BOOL SnmpClassEventObject :: GetAgentVersion ( WbemSnmpErrorObject &a_errorObject , IWbemQualifierSet *namespaceQualifierObject , wchar_t *&agentVersion ) { BOOL status = TRUE ; agentVersion = NULL ; BSTR t_Version = NULL ; VARIANT t_Variant ; VariantInit ( & t_Variant ) ; if ( m_Context ) { HRESULT result = m_Context->GetValue ( WBEM_QUALIFIER_AGENTSNMPVERSION , 0 , & t_Variant ) ; if ( SUCCEEDED ( result ) & ( t_Variant.vt != VT_EMPTY ) ) { if ( t_Variant.vt == VT_BSTR ) { t_Version = t_Variant.bstrVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentSNMPVersion" ) ; } } } if ( status & ! t_Version ) { LONG attributeType ; HRESULT result = namespaceQualifierObject->Get ( WBEM_QUALIFIER_AGENTSNMPVERSION , 0, &t_Variant , & attributeType ) ; if ( SUCCEEDED ( result ) ) { if ( t_Variant.vt == VT_BSTR ) { t_Version = t_Variant.bstrVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentSNMPVersion" ) ; } } else { t_Version = WBEM_AGENTSNMPVERSION_V1 ; } } if ( status ) { if ( ( _wcsicmp ( t_Version , WBEM_AGENTSNMPVERSION_V1 ) == 0 ) || ( _wcsicmp ( t_Version , WBEM_AGENTSNMPVERSION_V2C ) == 0 ) ) { agentVersion = UnicodeStringDuplicate ( t_Version ) ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentSNMPVersion" ) ; } } VariantClear ( & t_Variant ); return status ; } BOOL SnmpClassEventObject :: GetAgentAddress ( WbemSnmpErrorObject &a_errorObject , IWbemQualifierSet *namespaceQualifierObject , wchar_t *&agentAddress ) { BOOL status = TRUE ; agentAddress = NULL ; BSTR t_Address = NULL ; VARIANT t_Variant ; VariantInit ( & t_Variant ) ; if ( m_Context ) { HRESULT result = m_Context->GetValue ( WBEM_QUALIFIER_AGENTADDRESS , 0 , & t_Variant ) ; if ( SUCCEEDED ( result ) & ( t_Variant.vt != VT_EMPTY ) ) { if ( t_Variant.vt == VT_BSTR ) { t_Address = t_Variant.bstrVal ; if ( wcscmp ( t_Address , L"" ) == 0 ) { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentAddress" ) ; } } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentAddress" ) ; } } } if ( status & ! t_Address ) { LONG attributeType ; HRESULT result = namespaceQualifierObject->Get ( WBEM_QUALIFIER_AGENTADDRESS , 0, &t_Variant , & attributeType ) ; if ( SUCCEEDED ( result ) ) { if ( t_Variant.vt == VT_BSTR ) { t_Address = t_Variant.bstrVal ; if ( wcscmp ( t_Address , L"" ) == 0 ) { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentAddress" ) ; } } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentAddress" ) ; } } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_TRANSPORTCONTEXT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Namespace must specify valid qualifier for: AgentAddress" ) ; } } if ( status ) { agentAddress = UnicodeStringDuplicate ( t_Address ) ; } VariantClear ( & t_Variant ); return status ; } BOOL SnmpClassEventObject :: GetAgentReadCommunityName ( WbemSnmpErrorObject &a_errorObject , IWbemQualifierSet *namespaceQualifierObject , wchar_t *&agentReadCommunityName ) { BOOL status = TRUE ; agentReadCommunityName = NULL ; BSTR t_Community = NULL ; VARIANT t_Variant ; VariantInit ( & t_Variant ) ; if ( m_Context ) { HRESULT result = m_Context->GetValue ( WBEM_QUALIFIER_AGENTREADCOMMUNITYNAME , 0 , & t_Variant ) ; if ( SUCCEEDED ( result ) & ( t_Variant.vt != VT_EMPTY ) ) { if ( t_Variant.vt == VT_BSTR ) { t_Community = t_Variant.bstrVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentReadCommunityName" ) ; } } } if ( status & ! t_Community ) { LONG attributeType ; HRESULT result = namespaceQualifierObject->Get ( WBEM_QUALIFIER_AGENTREADCOMMUNITYNAME , 0, &t_Variant , & attributeType ) ; if ( SUCCEEDED ( result ) ) { if ( t_Variant.vt == VT_BSTR ) { t_Community = t_Variant.bstrVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentReadCommunityName" ) ; } } else { t_Community = WBEM_AGENTCOMMUNITYNAME ; } } if ( status ) { agentReadCommunityName = UnicodeStringDuplicate ( t_Community ) ; } VariantClear ( & t_Variant ); return status ; } BOOL SnmpClassEventObject :: GetAgentRetryCount ( WbemSnmpErrorObject &a_errorObject , IWbemQualifierSet *namespaceQualifierObject , ULONG &agentRetryCount ) { BOOL status = TRUE ; agentRetryCount = 1 ; BOOL t_RetryCount = FALSE ; VARIANT t_Variant ; VariantInit ( & t_Variant ) ; if ( m_Context ) { HRESULT result = m_Context->GetValue ( WBEM_QUALIFIER_AGENTRETRYCOUNT , 0 , & t_Variant ) ; if ( SUCCEEDED ( result ) & ( t_Variant.vt != VT_EMPTY ) ) { if ( t_Variant.vt == VT_I4 ) { t_RetryCount = TRUE ; agentRetryCount = t_Variant.lVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentRetryCount" ) ; } } } if ( status & ! t_RetryCount ) { LONG attributeType ; HRESULT result = namespaceQualifierObject->Get ( WBEM_QUALIFIER_AGENTRETRYCOUNT , 0, &t_Variant , & attributeType ) ; if ( SUCCEEDED ( result ) ) { if ( t_Variant.vt == VT_I4 ) { agentRetryCount = t_Variant.lVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentRetryCount" ) ; } } } VariantClear ( & t_Variant ); return status ; } BOOL SnmpClassEventObject :: GetAgentRetryTimeout( WbemSnmpErrorObject &a_errorObject , IWbemQualifierSet *namespaceQualifierObject , ULONG &agentRetryTimeout ) { BOOL status = TRUE ; agentRetryTimeout = 0 ; BOOL t_RetryTimeout = FALSE ; VARIANT t_Variant ; VariantInit ( & t_Variant ) ; if ( m_Context ) { HRESULT result = m_Context->GetValue ( WBEM_QUALIFIER_AGENTRETRYTIMEOUT , 0 , & t_Variant ) ; if ( SUCCEEDED ( result ) & ( t_Variant.vt != VT_EMPTY ) ) { if ( t_Variant.vt == VT_I4 ) { t_RetryTimeout = TRUE ; agentRetryTimeout = t_Variant.lVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentRetryTimeout" ) ; } } } if ( status & ! t_RetryTimeout ) { LONG attributeType ; HRESULT result = namespaceQualifierObject->Get ( WBEM_QUALIFIER_AGENTRETRYTIMEOUT , 0, &t_Variant , & attributeType ) ; if ( SUCCEEDED ( result ) ) { if ( t_Variant.vt == VT_I4 ) { agentRetryTimeout = t_Variant.lVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentRetryTimeout" ) ; } } } VariantClear ( & t_Variant ); return status ; } BOOL SnmpClassEventObject :: GetAgentMaxVarBindsPerPdu ( WbemSnmpErrorObject &a_errorObject , IWbemQualifierSet *namespaceQualifierObject , ULONG &agentVarBindsPerPdu ) { BOOL status = TRUE ; agentVarBindsPerPdu = 0 ; BOOL t_VarBinds = FALSE ; VARIANT t_Variant ; VariantInit ( & t_Variant ) ; if ( m_Context ) { HRESULT result = m_Context->GetValue ( WBEM_QUALIFIER_AGENTVARBINDSPERPDU , 0 , & t_Variant ) ; if ( SUCCEEDED ( result ) & ( t_Variant.vt != VT_EMPTY ) ) { if ( t_Variant.vt == VT_I4 ) { t_VarBinds = TRUE ; agentVarBindsPerPdu = t_Variant.lVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentVarBindPerPdu" ) ; } } } if ( status & ! t_VarBinds ) { LONG attributeType ; HRESULT result = namespaceQualifierObject->Get ( WBEM_QUALIFIER_AGENTVARBINDSPERPDU , 0, &t_Variant , & attributeType ) ; if ( SUCCEEDED ( result ) ) { if ( t_Variant.vt == VT_I4 ) { agentVarBindsPerPdu = t_Variant.lVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentVarBindPerPdu" ) ; } } } VariantClear ( & t_Variant ); return status ; } BOOL SnmpClassEventObject :: GetAgentFlowControlWindowSize ( WbemSnmpErrorObject &a_errorObject , IWbemQualifierSet *namespaceQualifierObject , ULONG &agentFlowControlWindowSize ) { BOOL status = TRUE ; agentFlowControlWindowSize = 0 ; BOOL t_WindowSize = FALSE ; VARIANT t_Variant ; VariantInit ( & t_Variant ) ; if ( m_Context ) { HRESULT result = m_Context->GetValue ( WBEM_QUALIFIER_AGENTFLOWCONTROLWINDOWSIZE , 0 , & t_Variant ) ; if ( SUCCEEDED ( result ) & ( t_Variant.vt != VT_EMPTY ) ) { if ( t_Variant.vt == VT_I4 ) { t_WindowSize = TRUE ; agentFlowControlWindowSize = t_Variant.lVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentFlowControlWindowSize" ) ; } } } if ( status & ! t_WindowSize ) { LONG attributeType ; HRESULT result = namespaceQualifierObject->Get ( WBEM_QUALIFIER_AGENTFLOWCONTROLWINDOWSIZE , 0, &t_Variant , & attributeType ) ; if ( SUCCEEDED ( result ) ) { if ( t_Variant.vt == VT_I4 ) { agentFlowControlWindowSize = t_Variant.lVal ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: AgentFlowControlWindowSize" ) ; } } } VariantClear ( & t_Variant ); return status ; } BOOL SnmpClassEventObject :: GetNamespaceObject ( WbemSnmpErrorObject &a_errorObject ) { BOOL status = TRUE ; if ( ! m_namespaceObject ) { IWbemServices *parentServer = m_provider->GetParentServer () ; wchar_t *objectPathPrefix = UnicodeStringAppend ( WBEM_NAMESPACE_EQUALS , m_provider->GetThisNamespace () ) ; wchar_t *objectPath = UnicodeStringAppend ( objectPathPrefix , WBEM_NAMESPACE_QUOTE ) ; delete [] objectPathPrefix ; BSTR t_PathStr = SysAllocString ( objectPath ) ; HRESULT result = parentServer->GetObject ( t_PathStr , 0 , m_Context , &m_namespaceObject , NULL ) ; SysFreeString ( t_PathStr ) ; if ( SUCCEEDED ( result ) ) { } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_PROVIDER_FAILURE ) ; a_errorObject.SetWbemStatus ( WBEM_E_PROVIDER_FAILURE ) ; a_errorObject.SetMessage ( L"Failed to obtain namespace object" ) ; } delete [] objectPath ; } return status ; } BOOL SnmpClassEventObject :: GetTransportInformation ( WbemSnmpErrorObject &a_errorObject , SnmpSession *&session ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L" SnmpClassEventObject :: GetTransportInformation ()" ) ; ) BOOL status = TRUE ; IWbemQualifierSet *namespaceQualifierObject ; HRESULT result = m_namespaceObject->GetQualifierSet ( &namespaceQualifierObject ) ; if ( SUCCEEDED ( result ) ) { wchar_t *agentVersion = NULL ; wchar_t *agentAddress = NULL ; wchar_t *agentTransport = NULL ; wchar_t *agentReadCommunityName = NULL ; ULONG agentRetryCount ; ULONG agentRetryTimeout ; ULONG agentMaxVarBindsPerPdu ; ULONG agentFlowControlWindowSize ; status = GetAgentVersion ( m_errorObject , namespaceQualifierObject , agentVersion ) ; if ( status ) status = GetAgentAddress ( m_errorObject , namespaceQualifierObject , agentAddress ) ; if ( status ) status = GetAgentTransport ( m_errorObject , namespaceQualifierObject , agentTransport ) ; if ( status ) status = GetAgentReadCommunityName ( m_errorObject , namespaceQualifierObject , agentReadCommunityName ) ; if ( status ) status = GetAgentRetryCount ( m_errorObject , namespaceQualifierObject , agentRetryCount ) ; if ( status ) status = GetAgentRetryTimeout ( m_errorObject , namespaceQualifierObject , agentRetryTimeout ) ; if ( status ) status = GetAgentMaxVarBindsPerPdu ( m_errorObject , namespaceQualifierObject , agentMaxVarBindsPerPdu ) ; if ( status ) status = GetAgentFlowControlWindowSize ( m_errorObject , namespaceQualifierObject , agentFlowControlWindowSize ) ; if ( status ) { char *dbcsAgentAddress = UnicodeToDbcsString ( agentAddress ) ; if ( dbcsAgentAddress ) { char *dbcsAgentReadCommunityName = UnicodeToDbcsString ( agentReadCommunityName ) ; if ( dbcsAgentReadCommunityName ) { if ( _wcsicmp ( agentTransport , WBEM_AGENTIPTRANSPORT ) == 0 ) { char *t_Address ; if ( m_provider->GetIpAddressString () && m_provider->GetIpAddressValue () && _stricmp ( m_provider->GetIpAddressString () , dbcsAgentAddress ) == 0 ) { t_Address = m_provider->GetIpAddressValue () ; } else { if ( SnmpTransportIpAddress :: ValidateAddress ( dbcsAgentAddress , SNMP_ADDRESS_RESOLVE_VALUE ) ) { t_Address = dbcsAgentAddress ; } else { if ( SnmpTransportIpAddress :: ValidateAddress ( dbcsAgentAddress , SNMP_ADDRESS_RESOLVE_NAME ) ) { t_Address = dbcsAgentAddress ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_TRANSPORTCONTEXT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Illegal IP address value or unresolvable name for AgentAddress" ) ; } } } if ( status ) { if ( _wcsicmp ( agentVersion , WBEM_AGENTSNMPVERSION_V1 ) == 0 ) { session = new SnmpV1OverIp ( t_Address , SNMP_ADDRESS_RESOLVE_NAME | SNMP_ADDRESS_RESOLVE_VALUE , dbcsAgentReadCommunityName , agentRetryCount , agentRetryTimeout , agentMaxVarBindsPerPdu , agentFlowControlWindowSize ); if ( ! ( *session ) () ) { delete session ; session = NULL ; status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TRANSPORT_ERROR ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Failed to get transport resources" ) ; } } else if ( _wcsicmp ( agentVersion , WBEM_AGENTSNMPVERSION_V2C ) == 0 ) { session = new SnmpV2COverIp ( t_Address , SNMP_ADDRESS_RESOLVE_NAME | SNMP_ADDRESS_RESOLVE_VALUE , dbcsAgentReadCommunityName , agentRetryCount , agentRetryTimeout , agentMaxVarBindsPerPdu , agentFlowControlWindowSize ); if ( ! ( *session ) () ) { delete session ; session = NULL ; status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TRANSPORT_ERROR ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Failed to get transport resources" ) ; } } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_TRANSPORTCONTEXT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Illegal value for qualifier: AgentSnmpVersion" ) ; } } } else if ( _wcsicmp ( agentTransport , WBEM_AGENTIPXTRANSPORT ) == 0 ) { if ( ! SnmpTransportIpxAddress :: ValidateAddress ( dbcsAgentAddress ) ) { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_TRANSPORTCONTEXT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Illegal value for qualifier: AgentAddress" ) ; } if ( status ) { if ( _wcsicmp ( agentVersion , WBEM_AGENTSNMPVERSION_V1 ) == 0 ) { session = new SnmpV1OverIpx ( dbcsAgentAddress , dbcsAgentReadCommunityName , agentRetryCount , agentRetryTimeout , agentMaxVarBindsPerPdu , agentFlowControlWindowSize ); if ( ! ( *session ) () ) { delete session ; session = NULL ; status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TRANSPORT_ERROR ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Failed to get transport resources" ) ; } } else if ( _wcsicmp ( agentVersion , WBEM_AGENTSNMPVERSION_V2C ) == 0 ) { session = new SnmpV2COverIpx ( dbcsAgentAddress , dbcsAgentReadCommunityName , agentRetryCount , agentRetryTimeout , agentMaxVarBindsPerPdu , agentFlowControlWindowSize ); if ( ! ( *session ) () ) { delete session ; session = NULL ; status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TRANSPORT_ERROR ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Failed to get transport resources" ) ; } } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_TRANSPORTCONTEXT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Illegal value for qualifier: AgentSnmpVersion" ) ; } } } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_TRANSPORTCONTEXT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Illegal value for qualifier: AgentTransport" ) ; } delete [] dbcsAgentReadCommunityName ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_TRANSPORTCONTEXT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Illegal value for qualifier: AgentReadCommunityName" ) ; } delete [] dbcsAgentAddress ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_TRANSPORTCONTEXT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Illegal value for qualifier: AgentAddress" ) ; } } else { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L" TransportInformation settings invalid" ) ; ) } delete [] agentTransport ; delete [] agentAddress ; delete [] agentVersion ; delete [] agentReadCommunityName ; namespaceQualifierObject->Release () ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_PROVIDER_FAILURE ) ; a_errorObject.SetWbemStatus ( WBEM_E_PROVIDER_FAILURE ) ; a_errorObject.SetMessage ( L"Failed to get class qualifier set" ) ; } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L" SnmpClassEventObject :: GetTransportInformation () with Result (%lx)" , a_errorObject.GetWbemStatus () ) ; ) return status ; } SnmpClassGetEventObject :: SnmpClassGetEventObject ( CImpClasProv *provider , BSTR Class , IWbemContext *a_Context ) : SnmpClassEventObject ( provider , a_Context ) , m_classObject ( NULL ) , m_Received ( FALSE ) , m_Class ( NULL ) { m_Class = UnicodeStringDuplicate ( Class ) ; } SnmpClassGetEventObject :: ~SnmpClassGetEventObject () { if ( m_classObject ) m_classObject->Release () ; delete [] m_Class ; } BOOL SnmpClassGetEventObject :: GetSnmpNotifyStatusObject ( IWbemClassObject **notifyObject ) { WbemSnmpErrorObject errorStatusObject ; /* * Don't ask for SnmpNotifyStatus if HMOM specifically asked for SnmpNotifyStatus, otherwise * we'll end up in a deadlock situation. */ BOOL status = TRUE ; if ( _wcsicmp ( m_Class , WBEM_CLASS_SNMPNOTIFYSTATUS ) == 0 ) { status = GetNotifyStatusObject ( notifyObject ) ; } else { IWbemClassObject *notificationClassObject = NULL ; IWbemClassObject *errorObject = NULL ; if ( notificationClassObject = m_provider->GetSnmpNotificationObject ( errorStatusObject ) ) { HRESULT result = notificationClassObject->SpawnInstance ( 0 , notifyObject ) ; if ( SUCCEEDED ( result ) ) { VARIANT variant ; VariantInit ( &variant ) ; variant.vt = VT_I4 ; variant.lVal = m_errorObject.GetWbemStatus () ; result = (*notifyObject)->Put ( WBEM_PROPERTY_STATUSCODE , 0 , & variant , 0 ) ; VariantClear ( &variant ) ; if ( SUCCEEDED ( result ) ) { variant.vt = VT_I4 ; variant.lVal = m_errorObject.GetStatus () ; result = (*notifyObject)->Put ( WBEM_PROPERTY_SNMPSTATUSCODE , 0 , & variant , 0 ) ; VariantClear ( &variant ) ; if ( SUCCEEDED ( result ) ) { if ( m_errorObject.GetMessage () ) { variant.vt = VT_BSTR ; variant.bstrVal = SysAllocString ( m_errorObject.GetMessage () ) ; result = (*notifyObject)->Put ( WBEM_PROPERTY_SNMPSTATUSMESSAGE , 0 , & variant , 0 ) ; VariantClear ( &variant ) ; if ( ! SUCCEEDED ( result ) ) { (*notifyObject)->Release () ; status = GetNotifyStatusObject ( notifyObject ) ; } } } else { (*notifyObject)->Release () ; status = GetNotifyStatusObject ( notifyObject ) ; } } else { (*notifyObject)->Release () ; status = GetNotifyStatusObject ( notifyObject ) ; } notificationClassObject->Release () ; } else { status = GetNotifyStatusObject ( notifyObject ) ; } } else { status = GetNotifyStatusObject ( notifyObject ) ; } } return status ; } BOOL SnmpClassGetEventObject :: ProcessCorrelatedClass ( WbemSnmpErrorObject &a_errorObject ) { BOOL status = TRUE ; IWbemQualifierSet *namespaceQualifierObject = NULL ; HRESULT result = m_classObject->GetQualifierSet ( &namespaceQualifierObject ) ; if ( SUCCEEDED ( result ) ) { LONG attributeType ; VARIANT variant ; VariantInit ( & variant ) ; result = namespaceQualifierObject->Get ( WBEM_QUALIFIER_GROUP_OBJECTID , 0, &variant , & attributeType ) ; if ( SUCCEEDED ( result ) ) { if ( variant.vt == VT_BSTR ) { // Get Device Transport information SnmpObjectIdentifierType objectIdentifier ( variant.bstrVal ) ; if ( objectIdentifier.IsValid () ) { SnmpSession *session ; status = GetTransportInformation ( m_errorObject , session ) ; if ( status ) { #ifdef CORRELATOR_INIT m_correlator = new SnmpCorrelation ( *session , this ) ; #else //CORRELATOR_INIT m_correlator = new SnmpCorrelation ( *session , this, m_Interrogator ) ; #endif //CORRELATOR_INIT char *groupObjectId = UnicodeToDbcsString ( variant.bstrVal ) ; if ( groupObjectId ) { m_inCallstack = TRUE ; m_correlator->Start ( groupObjectId ) ; if ( m_inCallstack == FALSE ) m_synchronousComplete = TRUE ; m_inCallstack = FALSE ; delete [] groupObjectId ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_QUALIFIER ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Illegal value for qualifier: group_objectid" ) ; } } } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: group_objectid" ) ; } } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_TYPE_MISMATCH ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Type mismatch for qualifier: group_objectid" ) ; } VariantClear ( & variant ) ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_OBJECT ) ; a_errorObject.SetWbemStatus ( WBEM_E_NOT_FOUND ) ; a_errorObject.SetMessage ( L"Class must specify valid qualifier for: group_objectid" ) ; } namespaceQualifierObject->Release () ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_OBJECT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Failed to get Class qualifier set, must specify valid qualifier for: group_objectid" ) ; } return status ; } BOOL SnmpClassGetEventObject :: ProcessClass ( WbemSnmpErrorObject &a_errorObject ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassGetEventObject :: ProcessClass ( WbemSnmpErrorObject &a_errorObject )" ) ; ) BOOL status = TRUE ; // Get Class definition from SMIR IWbemClassObject *classObject = NULL ; HRESULT result = GetClass ( m_errorObject , &m_classObject , m_Class ) ; if ( SUCCEEDED ( result ) ) { // Get Namespace object which contains Device Transport information/Also used for merge of class status = GetNamespaceObject ( a_errorObject ) ; if ( status ) { if ( _wcsicmp ( m_Class , WBEM_CLASS_SNMPMACRO ) == 0 ) { ReceiveClass ( m_classObject ) ; m_synchronousComplete = TRUE ; } else if ( _wcsicmp ( m_Class , WBEM_CLASS_SNMPOBJECTTYPE ) == 0 ) { ReceiveClass ( m_classObject ) ; m_synchronousComplete = TRUE ; } else if ( _wcsicmp ( m_Class , WBEM_CLASS_SNMPNOTIFYSTATUS ) == 0 ) { ReceiveClass ( m_classObject ) ; m_synchronousComplete = TRUE ; } else if ( _wcsicmp ( m_Class , WBEM_CLASS_SNMPNOTIFICATION ) == 0 ) { ReceiveClass ( m_classObject ) ; m_synchronousComplete = TRUE ; } else if ( _wcsicmp ( m_Class , WBEM_CLASS_SNMPEXTENDEDNOTIFICATION ) == 0 ) { ReceiveClass ( m_classObject ) ; m_synchronousComplete = TRUE ; } else if ( _wcsicmp ( m_Class , WBEM_CLASS_SNMPVARBIND ) == 0 ) { ReceiveClass ( m_classObject ) ; m_synchronousComplete = TRUE ; } else { // Determine if I need to correlate VARIANT t_Variant ; VariantInit ( & t_Variant ) ; result = m_classObject->Get ( L"__SUPERCLASS" , 0 , & t_Variant , NULL , NULL ) ; BSTR t_Parent = t_Variant.bstrVal ; if ( SUCCEEDED ( result ) && (t_Variant.vt == VT_BSTR) && (t_Parent != NULL) && (*t_Parent != L'\0')) { if ( _wcsicmp ( t_Parent , WBEM_CLASS_SNMPNOTIFICATION ) == 0 || _wcsicmp ( t_Parent , WBEM_CLASS_SNMPEXTENDEDNOTIFICATION ) == 0 ) { ReceiveClass ( m_classObject ) ; m_synchronousComplete = TRUE ; } else if (_wcsicmp ( t_Parent , WBEM_CLASS_SNMPOBJECTTYPE ) == 0) { if ( m_correlate ) { status = ProcessCorrelatedClass ( a_errorObject ) ; if ( !status ) { m_synchronousComplete = TRUE ; } } else { ReceiveClass ( m_classObject ) ; m_synchronousComplete = TRUE ; } } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_NOT_FOUND ) ; a_errorObject.SetWbemStatus ( WBEM_E_NOT_FOUND ) ; a_errorObject.SetMessage ( L"This is not a supported SNMP class." ) ; } } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_NOT_FOUND ) ; a_errorObject.SetWbemStatus ( WBEM_E_NOT_FOUND ) ; a_errorObject.SetMessage ( L"Failed to get __SUPERCLASS property. This is not an SNMP base class." ) ; } VariantClear ( & t_Variant ) ; } } } else { //no need to set an error msg etc 'cos GetClass does it. status = FALSE; } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassGetEventObject :: ProcessClass ( WbemSnmpErrorObject &a_errorObject (%lx))" , a_errorObject.GetWbemStatus () ) ; ) return status ; } void SnmpClassGetEventObject :: ReceiveGroup ( IN ISmirGroupHandle *phGroup ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassGetEventObject :: ReceiveGroup ( IN ISmirGroupHandle *phGroup )" ) ; ) ReceiveClass ( m_classObject ) ; phGroup->Release () ; DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassGetEventObject :: ReceiveGroup ( IN ISmirGroupHandle *phGroup )" ) ; ) } SnmpClassGetAsyncEventObject :: SnmpClassGetAsyncEventObject ( CImpClasProv *provider , BSTR Class , IWbemObjectSink *notify , IWbemContext *a_Context ) : SnmpClassGetEventObject ( provider , Class , a_Context ) , m_notificationHandler ( notify ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassGetAsyncEventObject :: SnmpClassGetAsyncEventObject ()" ) ; ) m_notificationHandler->AddRef () ; } SnmpClassGetAsyncEventObject :: ~SnmpClassGetAsyncEventObject () { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassGetAsyncEventObject :: ~SnmpClassGetAsyncEventObject ()" ) ; ) IWbemClassObject *notifyStatus = NULL; if ( FAILED ( m_errorObject.GetWbemStatus () ) ) { // Get Status object BOOL status = GetSnmpNotifyStatusObject ( ¬ifyStatus ) ; } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Sending Status" ) ; ) HRESULT result = m_notificationHandler->SetStatus ( 0 , m_errorObject.GetWbemStatus () , NULL , notifyStatus ) ; if ( notifyStatus ) { notifyStatus->Release () ; } m_notificationHandler->Release () ; DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassGetAsyncEventObject :: ~SnmpClassGetAsyncEventObject ()" ) ; ) } void SnmpClassGetAsyncEventObject :: Process () { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassGetAsyncEventObject :: Process ()" ) ; ) if ( ! m_synchronousComplete ) { BOOL status = ProcessClass ( m_errorObject ) ; if ( status ) { if ( m_synchronousComplete ) ReceiveComplete () ; } else { ReceiveComplete () ; } } else { ReceiveComplete () ; } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassGetAsyncEventObject :: Process ()" ) ; ) } void SnmpClassGetAsyncEventObject :: ReceiveClass ( IWbemClassObject *classObject ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassGetAsyncEventObject :: ReceiveClass ( IWbemClassObject *classObject )" ) ; ) if ( ! m_Received ) { m_Received = TRUE ; m_notificationHandler->Indicate ( 1 , & m_classObject ) ; } } void SnmpClassGetAsyncEventObject :: ReceiveComplete () { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassGetAsyncEventObject :: ReceiveComplete ()" ) ; ) if ( SUCCEEDED ( m_errorObject.GetWbemStatus () ) ) { /* * If no error specified yet then check for NOT_FOUND */ if ( ! m_Received ) { m_errorObject.SetStatus ( WBEM_SNMP_E_NOT_FOUND ) ; m_errorObject.SetWbemStatus ( WBEM_E_NOT_FOUND ) ; m_errorObject.SetMessage ( L"Class not defined" ) ; } } /* * Remove worker object from worker thread container */ DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Reaping Task" ) ; ) if ( ! m_inCallstack ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Deleting (this)" ) ; ) Complete () ; } else m_inCallstack = FALSE ; DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassGetAsyncEventObject :: Receive4 ()" ) ; ) } void SnmpClassGetAsyncEventObject :: ReceiveError ( IN const SnmpErrorReport &a_errorReport ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumEventObject :: ReceiveError ( IN const SnmpErrorReport &a_errorReport )" ) ; ) switch ( a_errorReport.GetError () ) { case Snmp_Error: { switch ( a_errorReport.GetStatus () ) { case Snmp_No_Response: { m_errorObject.SetStatus ( WBEM_SNMP_E_TRANSPORT_NO_RESPONSE ) ; m_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; m_errorObject.SetMessage ( L"No Response from device" ) ; } break; default: { m_errorObject.SetStatus ( WBEM_SNMP_E_TRANSPORT_ERROR ) ; m_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; m_errorObject.SetMessage ( L"Unknown transport failure" ) ; } break ; } } break ; default: { m_errorObject.SetStatus ( WBEM_SNMP_E_TRANSPORT_ERROR ) ; m_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; m_errorObject.SetMessage ( L"Unknown transport failure" ) ; } break ; } } SnmpClassEnumEventObject :: SnmpClassEnumEventObject ( CImpClasProv *provider , BSTR Parent , ULONG flags , IWbemContext *a_Context ) : SnmpClassEventObject ( provider , a_Context ) , m_Flags ( flags ) { m_Parent = UnicodeStringDuplicate ( Parent ) ; } BOOL SnmpClassEnumEventObject :: ProcessClass ( WbemSnmpErrorObject &a_errorObject , BSTR a_Class ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumEventObject :: ProcessClass ( WbemSnmpErrorObject &a_errorObject , BSTR a_Class = (%s) )" , a_Class ) ; ) BOOL status = TRUE ; // Get Class definition from SMIR IWbemClassObject *classObject = NULL ; HRESULT result = GetClass ( a_errorObject , &classObject , a_Class ) ; if ( SUCCEEDED ( result ) ) { // Get Namespace object which contains Device Transport information/Also used for merge of class status = GetNamespaceObject ( a_errorObject ) ; if ( status ) { ReceiveClass ( classObject ) ; } classObject->Release () ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_NOT_FOUND ) ; a_errorObject.SetWbemStatus ( WBEM_E_NOT_FOUND ) ; a_errorObject.SetMessage ( L"Class not defined" ) ; } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassEnumEventObject :: ProcessClass ( WbemSnmpErrorObject &a_errorObject , BSTR a_Class = (%s) )" , a_Class ) ; ) return status ; } SnmpClassEnumEventObject :: ~SnmpClassEnumEventObject () { delete [] m_Parent ; } BOOL SnmpClassEnumEventObject :: GetEnumeration ( WbemSnmpErrorObject &a_errorObject ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumEventObject :: GetEnumeration ( WbemSnmpErrorObject &a_errorObject )" ) ; ) BOOL status = GetNamespaceObject ( m_errorObject ) ; if ( status ) { // Determine if I need to correlate if ( m_correlate ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Performing Class Correlation" ) ; ) // Get Device Transport information SnmpSession *session ; status = GetTransportInformation ( m_errorObject , session ) ; if ( status ) { m_inCallstack = TRUE ; #ifdef CORRELATOR_INIT m_correlator = new SnmpCorrelation ( *session , this ) ; #else //CORRELATOR_INIT m_correlator = new SnmpCorrelation ( *session , this, m_Interrogator ) ; #endif //CORRELATOR_INIT m_correlator->Start ( NULL ) ; if ( m_inCallstack == FALSE ) m_synchronousComplete = TRUE ; m_inCallstack = FALSE ; } else { } } else { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Not Performing Class Correlation" ) ; ) ReceiveGroup ( NULL ) ; m_synchronousComplete = TRUE ; } } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassEnumEventObject :: GetEnumeration ( WbemSnmpErrorObject &a_errorObject )" ) ; ) return status ; } BOOL SnmpClassEnumEventObject :: GetNotificationEnumeration ( WbemSnmpErrorObject &a_errorObject ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumEventObject :: GetNotificationEnumeration ( WbemSnmpErrorObject &a_errorObject )" ) ; ) HRESULT result = S_OK ; BOOL status = GetNamespaceObject ( m_errorObject ) ; if ( status ) { IWbemClassObject *classObject = NULL ; IEnumNotificationClass *enumClass = NULL ; ISmirNotificationClassHandle *classHandle = NULL ; result = m_Interrogator->EnumAllNotificationClasses ( &enumClass ) ; if ( SUCCEEDED ( result ) ) { ULONG fetched = 0 ; enumClass->Reset () ; while ( enumClass->Next ( 1 , & classHandle , &fetched ) == WBEM_NO_ERROR ) { result = classHandle->GetWBEMNotificationClass ( & classObject ) ; if ( SUCCEEDED ( result ) ) { ReceiveClass ( classObject ) ; classObject->Release () ; } classHandle->Release () ; } enumClass->Release () ; } else { } } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassEnumEventObject :: GetNotificationEnumeration ( WbemSnmpErrorObject &a_errorObject )" ) ; ) return SUCCEEDED ( result ) ; } BOOL SnmpClassEnumEventObject :: GetExtendedNotificationEnumeration ( WbemSnmpErrorObject &a_errorObject ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumEventObject :: GetExtendedNotificationEnumeration ( WbemSnmpErrorObject &a_errorObject )" ) ; ) HRESULT result = S_OK ; BOOL status = GetNamespaceObject ( m_errorObject ) ; if ( status ) { IWbemClassObject *classObject = NULL ; IEnumExtNotificationClass *enumClass = NULL ; ISmirExtNotificationClassHandle *classHandle = NULL ; result = m_Interrogator->EnumAllExtNotificationClasses ( &enumClass ) ; if ( SUCCEEDED ( result ) ) { ULONG fetched = 0 ; enumClass->Reset () ; while ( enumClass->Next ( 1 , & classHandle , &fetched ) == WBEM_NO_ERROR ) { result = classHandle->GetWBEMExtNotificationClass ( & classObject ) ; if ( SUCCEEDED ( result ) ) { ReceiveClass ( classObject ) ; classObject->Release () ; } classHandle->Release () ; } enumClass->Release () ; } else { } } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassEnumEventObject :: GetExtendedNotificationEnumeration ( WbemSnmpErrorObject &a_errorObject )" ) ; ) return SUCCEEDED ( result ) ; } BOOL SnmpClassEnumEventObject :: ProcessEnumeration ( WbemSnmpErrorObject &a_errorObject ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumEventObject :: ProcessEnumeration ( WbemSnmpErrorObject &a_errorObject (%s) )" , m_Parent ) ; ) BOOL status = TRUE ; // Get Namespace object which contains Device Transport information/Also used for merge of class if ( m_Flags & WBEM_FLAG_SHALLOW ) { if ( ( ! m_Parent ) || _wcsicmp ( m_Parent , WBEM_CLASS_NULL ) == 0 ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPMACRO ) ; status = status && ProcessClass ( a_errorObject , WBEM_CLASS_SNMPVARBIND ) ; m_synchronousComplete = TRUE ; } else if ( _wcsicmp ( m_Parent , WBEM_CLASS_SNMPMACRO ) == 0 ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPOBJECTTYPE ) ; m_synchronousComplete = TRUE ; } else if ( _wcsicmp ( m_Parent , WBEM_CLASS_SNMPOBJECTTYPE ) == 0 ) { status = GetEnumeration ( a_errorObject ) ; } else if ( _wcsicmp ( m_Parent , WBEM_CLASS_NOTIFYSTATUS ) == 0 ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPNOTIFYSTATUS ) ; m_synchronousComplete = TRUE ; } else if ( _wcsicmp ( m_Parent , WBEM_CLASS_EXTRINSICEVENT ) == 0 ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPNOTIFICATION ) ; status = status & ProcessClass ( a_errorObject , WBEM_CLASS_SNMPEXTENDEDNOTIFICATION ) ; m_synchronousComplete = TRUE ; } else if ( _wcsicmp ( m_Parent , WBEM_CLASS_SNMPNOTIFICATION ) == 0 ) { status = GetNotificationEnumeration ( a_errorObject ) ; m_synchronousComplete = TRUE ; } else if ( _wcsicmp ( m_Parent , WBEM_CLASS_SNMPEXTENDEDNOTIFICATION ) == 0 ) { status = GetExtendedNotificationEnumeration ( a_errorObject ) ; m_synchronousComplete = TRUE ; } else { // Get Class definition from SMIR IWbemClassObject *classObject = NULL ; HRESULT result = GetClass ( a_errorObject , &classObject , m_Parent ) ; if ( SUCCEEDED ( result ) ) { classObject->Release () ; m_synchronousComplete = TRUE ; status = TRUE ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_NOT_FOUND ) ; a_errorObject.SetWbemStatus ( WBEM_E_NOT_FOUND ) ; a_errorObject.SetMessage ( L"Parent class not known" ) ; m_synchronousComplete = TRUE ; } } } else { if ( ( ! m_Parent ) || _wcsicmp ( m_Parent , WBEM_CLASS_NULL ) == 0 ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPMACRO ) ; if ( status ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPOBJECTTYPE ) ; if ( status ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPNOTIFYSTATUS ) ; if ( status ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPVARBIND ) ; if ( status ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPNOTIFICATION ) ; if ( status ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPEXTENDEDNOTIFICATION ) ; if ( status ) { status = GetNotificationEnumeration ( a_errorObject ) ; if ( status ) { status = GetExtendedNotificationEnumeration ( a_errorObject ) ; if ( status ) { status = GetEnumeration ( a_errorObject ) ; } } } } } } } } } else if ( _wcsicmp ( m_Parent , WBEM_CLASS_SNMPMACRO ) == 0 ) { status = ProcessClass ( a_errorObject , WBEM_CLASS_SNMPOBJECTTYPE ) ; if ( status ) { status = GetEnumeration ( a_errorObject ) ; } } else if ( _wcsicmp ( m_Parent , WBEM_CLASS_SNMPOBJECTTYPE ) == 0 ) { status = GetEnumeration ( a_errorObject ) ; } else if ( _wcsicmp ( m_Parent , WBEM_CLASS_EXTRINSICEVENT ) == 0 ) { status = GetNotificationEnumeration ( a_errorObject ) ; if ( status ) { status = GetExtendedNotificationEnumeration ( a_errorObject ) ; } m_synchronousComplete = TRUE ; } else { // Get Class definition from SMIR IWbemClassObject *classObject = NULL ; HRESULT result = GetClass ( a_errorObject , &classObject , m_Parent ) ; if ( SUCCEEDED ( result ) ) { classObject->Release () ; m_synchronousComplete = TRUE ; status = TRUE ; } else { status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_NOT_FOUND ) ; a_errorObject.SetWbemStatus ( WBEM_E_NOT_FOUND ) ; a_errorObject.SetMessage ( L"Parent class not known" ) ; m_synchronousComplete = TRUE ; } } } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassEnumEventObject :: ProcessEnumeration ( WbemSnmpErrorObject &a_errorObject (%s))" , m_Parent ) ; ) return status ; } void SnmpClassEnumEventObject :: ReceiveGroup ( IN ISmirGroupHandle *phGroup ) { DebugMacro1( if ( phGroup ) { BSTR t_ModuleName = NULL ; BSTR t_GroupOID = NULL ; phGroup->GetModuleName ( &t_ModuleName ) ; phGroup->GetGroupOID ( &t_GroupOID ) ; SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumEventObject :: ReceiveGroup ( IN ISmirGroupHandle *phGroup = ((%s),(%s)) )" , t_ModuleName , t_GroupOID ) ; SysFreeString ( t_ModuleName ) ; SysFreeString ( t_GroupOID ) ; } else { SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumEventObject :: ReceiveGroup ( IN ISmirGroupHandle *phGroup = NULL )" ) ; } ) HRESULT result = S_OK ; m_GroupsReceived ++ ; IWbemClassObject *classObject = NULL ; IEnumClass *enumClass = NULL ; ISmirClassHandle *classHandle = NULL ; if ( phGroup ) { result = m_Interrogator->EnumClassesInGroup ( &enumClass , phGroup ) ; } else { result = m_Interrogator->EnumAllClasses ( &enumClass ) ; } if ( SUCCEEDED ( result ) ) { ULONG fetched = 0 ; enumClass->Reset () ; while ( enumClass->Next ( 1 , & classHandle , &fetched ) == WBEM_NO_ERROR ) { result = classHandle->GetWBEMClass ( & classObject ) ; if ( SUCCEEDED ( result ) ) { ReceiveClass ( classObject ) ; classObject->Release () ; } classHandle->Release () ; } enumClass->Release () ; } else { } if ( phGroup ) { phGroup->Release () ; } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassEnumEventObject :: ReceiveGroup ( IN ISmirGroupHandle *phGroup )" ) ; ) } SnmpClassEnumAsyncEventObject :: SnmpClassEnumAsyncEventObject ( CImpClasProv *provider , BSTR Parent , ULONG flags , IWbemObjectSink *notify , IWbemContext *a_Context ) : SnmpClassEnumEventObject ( provider , Parent , flags , a_Context ) , m_notificationHandler ( notify ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumAsyncEventObject :: SnmpClassEnumAsyncEventObject ()" ) ; ) m_notificationHandler->AddRef () ; } SnmpClassEnumAsyncEventObject :: ~SnmpClassEnumAsyncEventObject () { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumAsyncEventObject :: ~SnmpClassEnumAsyncEventObject ()" ) ; ) // Get Status object IWbemClassObject *notifyStatus = NULL; if ( FAILED ( m_errorObject.GetWbemStatus () ) ) { BOOL status = GetSnmpNotifyStatusObject ( ¬ifyStatus ) ; } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Sending Status" ) ; ) HRESULT result = m_notificationHandler->SetStatus ( 0 , m_errorObject.GetWbemStatus () , NULL , notifyStatus ) ; if ( notifyStatus ) { notifyStatus->Release () ; } m_notificationHandler->Release () ; DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassEnumAsyncEventObject :: ~SnmpClassEnumAsyncEventObject ()" ) ; ) } void SnmpClassEnumAsyncEventObject :: Process () { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumAsyncEventObject :: Process ()" ) ; ) if ( ! m_synchronousComplete ) { BOOL status = ProcessEnumeration ( m_errorObject ) ; if ( status ) { if ( m_synchronousComplete ) ReceiveComplete () ; } else { ReceiveComplete () ; } } else { ReceiveComplete () ; } DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassEnumAsyncEventObject :: Process ()" ) ; ) } void SnmpClassEnumAsyncEventObject :: ReceiveClass ( IWbemClassObject *classObject ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumAsyncEventObject :: ReceiveClass ()" ) ; ) m_notificationHandler->Indicate ( 1, & classObject ) ; } void SnmpClassEnumAsyncEventObject :: ReceiveError ( IN const SnmpErrorReport &errorReport ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumAsyncEventObject :: ReceiveError ()" ) ; ) switch ( errorReport.GetError () ) { case Snmp_Error: { switch ( errorReport.GetStatus () ) { case Snmp_No_Response: { m_errorObject.SetStatus ( WBEM_SNMP_E_TRANSPORT_NO_RESPONSE ) ; m_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; m_errorObject.SetMessage ( L"No Response from device" ) ; } break; default: { m_errorObject.SetStatus ( WBEM_SNMP_E_TRANSPORT_ERROR ) ; m_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; m_errorObject.SetMessage ( L"Unknown transport failure" ) ; } break ; } } break ; default: { m_errorObject.SetStatus ( WBEM_SNMP_E_TRANSPORT_ERROR ) ; m_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; m_errorObject.SetMessage ( L"Unknown transport failure" ) ; } break ; } } void SnmpClassEnumAsyncEventObject :: ReceiveComplete () { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"SnmpClassEnumAsyncEventObject :: ReceiveComplete ()" ) ; ) if ( SUCCEEDED ( m_errorObject.GetWbemStatus () ) ) { } else { if ( m_GroupsReceived ) { if ( FAILED ( m_errorObject.GetWbemStatus () ) ) { if ( m_errorObject.GetStatus () == WBEM_SNMP_E_TRANSPORT_NO_RESPONSE ) { m_errorObject.SetWbemStatus ( WBEM_S_TIMEDOUT ) ; } } } } /* * Remove worker object from worker thread container */ DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Reaping Task" ) ; ) if ( ! m_inCallstack ) { DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Deleting (this)" ) ; ) Complete () ; } else m_inCallstack = FALSE ; DebugMacro1( SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine ( __FILE__,__LINE__, L"Returning from SnmpClassEnumAsyncEventObject :: ReceiveComplete ()" ) ; ) }