//*************************************************************************** // // VPMTHD.CPP // // Module: WBEM VIEW PROVIDER // // Purpose: Contains the PutInstance implementation // // Copyright (c) 1998-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 #include #include #include #include #include #include #include ExecMethodTaskObject :: ExecMethodTaskObject ( CViewProvServ *a_Provider , wchar_t *a_ObjectPath , wchar_t *a_MethodName, ULONG a_Flag , IWbemClassObject *a_InParams , IWbemObjectSink *a_NotificationHandler , IWbemContext *pCtx ) : WbemTaskObject ( a_Provider , a_NotificationHandler , a_Flag , pCtx ) , m_InParamObject( a_InParams ), m_OutParamObject ( NULL ), m_ParsedObjectPath ( NULL ), m_ObjectPath(NULL), m_Method(NULL) { if (m_InParamObject != NULL) { m_InParamObject->AddRef(); } m_ObjectPath = UnicodeStringDuplicate(a_ObjectPath); m_Method = UnicodeStringDuplicate(a_MethodName); } ExecMethodTaskObject :: ~ExecMethodTaskObject () { if (m_OutParamObject != NULL) { if ( SUCCEEDED(m_ErrorObject.GetWbemStatus ()) ) { HRESULT t_Result = m_NotificationHandler->Indicate(1, &m_OutParamObject); } m_OutParamObject->Release(); } if (m_InParamObject != NULL) { m_InParamObject->Release(); } delete [] m_ObjectPath ; delete [] m_Method ; if (NULL != m_ParsedObjectPath) { delete m_ParsedObjectPath; } // Get Status object IWbemClassObject *t_NotifyStatus = NULL ; BOOL t_Status = TRUE; if (WBEM_NO_ERROR != m_ErrorObject.GetWbemStatus ()) { t_Status = GetExtendedNotifyStatusObject ( &t_NotifyStatus ) ; } if ( t_Status ) { HRESULT t_Result = m_NotificationHandler->SetStatus ( 0 , m_ErrorObject.GetWbemStatus () , 0 , t_NotifyStatus ) ; if (t_NotifyStatus) { t_NotifyStatus->Release () ; } } else { HRESULT t_Result = m_NotificationHandler->SetStatus ( 0 , m_ErrorObject.GetWbemStatus () , 0 , NULL ) ; } } BOOL ExecMethodTaskObject :: ExecMethod () { DebugOut8( CViewProvServ::sm_debugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, _T("ExecMethodTaskObject :: ExecMethod\r\n") ) ; ) CObjectPathParser objectPathParser; BOOL t_Status = ! objectPathParser.Parse ( m_ObjectPath , &m_ParsedObjectPath ) ; if ( t_Status ) { t_Status = SetClass(m_ParsedObjectPath->m_pClass) ; if ( t_Status ) { IWbemQualifierSet* pQuals = NULL; BOOL bStatic = FALSE; //get the method qualifier set so we can determine //if the method is static... if ( SUCCEEDED(m_ClassObject->GetMethodQualifierSet(m_Method, &pQuals)) ) { //get the MethodSources qualifier VARIANT v; VariantInit(&v); if ( SUCCEEDED(pQuals->Get(VIEW_QUAL_STATIC, 0, &v, NULL)) ) { if (v.vt == VT_BOOL) { bStatic = (v.boolVal == VARIANT_TRUE) ? TRUE : FALSE; } else { t_Status = FALSE; m_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_CLASS ) ; m_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; m_ErrorObject.SetMessage ( L"Static method qualifier should be boolean." ) ; } } VariantClear(&v); pQuals->Release(); } else { t_Status = FALSE; m_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_CLASS ) ; m_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; m_ErrorObject.SetMessage ( L"Failed to get Method qualifiers" ) ; } if (t_Status) { t_Status = ParseAndProcessClassQualifiers(m_ErrorObject, bStatic ? NULL : m_ParsedObjectPath); } if (t_Status) { //only unions if (m_bAssoc || m_JoinOnArray.IsValid()) { t_Status = FALSE; m_ErrorObject.SetStatus ( WBEM_PROV_E_NOT_SUPPORTED ) ; m_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; m_ErrorObject.SetMessage ( L"Methods only supported for Union views" ) ; } } if (t_Status) { LONG t_index = 0; CStringW t_srcMethod; BOOL t_bStatic = FALSE; t_Status = CompareMethods(m_ErrorObject, t_index, t_srcMethod, t_bStatic); if (t_Status) { t_Status = PerformMethod(m_ErrorObject, t_index, t_srcMethod, t_bStatic); } } } else { m_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_CLASS ) ; m_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; m_ErrorObject.SetMessage ( L"Class definition not found" ) ; DebugOut8( CViewProvServ::sm_debugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, _T("ExecMethodTaskObject :: ExecMethod:Class definition not found\r\n") ) ; ) } } else { t_Status = FALSE ; m_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; m_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; m_ErrorObject.SetMessage ( L"Unable to parse object path" ) ; DebugOut8( CViewProvServ::sm_debugLog->WriteW ( L"ExecMethodTaskObject :: ExecMethod:Unable to parse object path %s\r\n", m_ObjectPath ) ; ) } DebugOut8( CViewProvServ::sm_debugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, _T("leaving ExecMethodTaskObject :: ExecMethod with %lx\r\n"), t_Status ) ; ) return t_Status ; } //steps... //1. Get the method signature and parse it's qualifiers //2. Get the source method and it's signature //3. Compare the signatures //======================================================== BOOL ExecMethodTaskObject::CompareMethods(WbemProvErrorObject &a_ErrorObject, LONG &a_Index, CStringW &a_SrcMethodName, BOOL &a_bStatic) { BOOL retVal = FALSE; IWbemQualifierSet* pQuals = NULL; //get the method qualifier set so we can determine //what the source method for this view method is... if ( SUCCEEDED(m_ClassObject->GetMethodQualifierSet(m_Method, &pQuals)) ) { //get the MethodSources qualifier VARIANT v; VariantInit(&v); if ( SUCCEEDED(pQuals->Get(VIEW_QUAL_METHOD, 0, &v, NULL)) ) { retVal = TRUE; if (v.vt == VT_BSTR) { if (m_SourceArray.GetSize() != 1) { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_FOUND) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"MethodSources qualifier should match ViewSources size." ) ; } else { a_SrcMethodName = v.bstrVal; } } else if (v.vt == (VT_BSTR | VT_ARRAY)) { if (SafeArrayGetDim(v.parray) == 1) { LONG count = v.parray->rgsabound[0].cElements; BSTR HUGEP *pbstr; if (m_SourceArray.GetSize() != count) { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_FOUND) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"MethodSources qualifier should match ViewSources size." ) ; } else { if ( SUCCEEDED(SafeArrayAccessData(v.parray, (void HUGEP**)&pbstr)) ) { for (LONG x = 0; x < count; x++) { if ((pbstr[x] != NULL) && (*(pbstr[x]) != L'\0')) { //only one value should be present if (a_SrcMethodName.IsEmpty()) { a_SrcMethodName = pbstr[x]; a_Index = x; } else { a_SrcMethodName.Empty(); retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_FOUND) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"MethodSources qualifier should have only one non-empty value." ) ; break; } } } SafeArrayUnaccessData(v.parray); } else { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_INVALID_CLASS); a_ErrorObject.SetWbemStatus (WBEM_E_FAILED); a_ErrorObject.SetMessage (L"Failed to access MethodSources array."); } } } else { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_INVALID_CLASS); a_ErrorObject.SetWbemStatus (WBEM_E_FAILED); a_ErrorObject.SetMessage (L"MethodSources array qualifier has incorrect dimensions."); } } else { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_FOUND) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"MethodSources qualifier has the wrong type." ) ; } if (retVal) { if (!a_SrcMethodName.IsEmpty()) { IWbemClassObject* t_SrcObj = m_SourceArray[a_Index]->GetClassObject(); if (t_SrcObj != NULL) { IWbemClassObject* pVInParam = NULL; IWbemClassObject* pVOutParam = NULL; IWbemClassObject* pSInParam = NULL; IWbemClassObject* pSOutParam = NULL; if ( SUCCEEDED(m_ClassObject->GetMethod(m_Method, 0, &pVInParam, &pVOutParam)) ) { if ( SUCCEEDED(t_SrcObj->GetMethod(a_SrcMethodName, 0, &pSInParam, &pSOutParam)) ) { //got all the info we need, now compare the signatures... if ( ((pVInParam == NULL) && (pSInParam != NULL)) || ((pVInParam != NULL) && (pSInParam == NULL)) || ((pVOutParam == NULL) && (pSOutParam != NULL)) || ((pVOutParam != NULL) && (pSOutParam == NULL)) ) { //signature mismatch retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_SUPPORTED) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"View method signature does not match source method signature." ) ; } else { if (pSInParam != NULL) //pVInParam is non-null { if (WBEM_S_DIFFERENT == pSInParam->CompareTo(WBEM_FLAG_IGNORE_OBJECT_SOURCE | WBEM_FLAG_IGNORE_DEFAULT_VALUES | WBEM_FLAG_IGNORE_FLAVOR, pVInParam)) { //signature mismatch retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_SUPPORTED) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"View method signature does not match source method signature." ) ; } } if (retVal && (pSOutParam != NULL)) //pVOutParam is non-null { if (WBEM_S_DIFFERENT == pSOutParam->CompareTo(WBEM_FLAG_IGNORE_OBJECT_SOURCE | WBEM_FLAG_IGNORE_DEFAULT_VALUES | WBEM_FLAG_IGNORE_FLAVOR, pVOutParam)) { //signature mismatch retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_SUPPORTED) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"View method signature does not match source method signature." ) ; } } //check to see that methods are both //static or both non-static if (retVal) { BOOL t_bViewStatic = FALSE; BOOL t_bSrcStatic = FALSE; VARIANT t_vStatic; VariantInit(&t_vStatic); if ( SUCCEEDED(pQuals->Get(VIEW_QUAL_STATIC, 0, &t_vStatic, NULL)) ) { if (t_vStatic.vt == VT_BOOL) { t_bViewStatic = (t_vStatic.boolVal == VARIANT_TRUE) ? TRUE : FALSE; } else { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_TYPE_MISMATCH) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"Static qualifier on Method should be boolean" ) ; } } VariantClear(&t_vStatic); VariantInit(&t_vStatic); IWbemQualifierSet* t_SrcQuals = NULL; if ( SUCCEEDED(t_SrcObj->GetMethodQualifierSet(a_SrcMethodName, &t_SrcQuals)) ) { if ( SUCCEEDED(t_SrcQuals->Get(VIEW_QUAL_STATIC, 0, &t_vStatic, NULL)) ) { if (t_vStatic.vt == VT_BOOL) { t_bSrcStatic = (t_vStatic.boolVal == VARIANT_TRUE) ? TRUE : FALSE; } else { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_TYPE_MISMATCH) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"Static qualifier on Method should be boolean" ) ; } } t_SrcQuals->Release(); } VariantClear(&t_vStatic); if (retVal) { if ((t_bSrcStatic) && (t_bViewStatic)) { a_bStatic = TRUE; } else if ((!t_bSrcStatic) && (!t_bViewStatic)) { a_bStatic = FALSE; } else { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_INVALID_CLASS); a_ErrorObject.SetWbemStatus (WBEM_E_FAILED); a_ErrorObject.SetMessage (L"Both source and view methods must be static or both non-static"); } } } } } else { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_FOUND) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"Source method could not be found" ) ; } } else { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_FOUND) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"View method could not be found" ) ; } //release all the signature objects if (pVInParam != NULL) { pVInParam->Release(); } if (pVOutParam != NULL) { if (retVal) { if ( FAILED(pVOutParam->SpawnInstance(0, &m_OutParamObject)) ) { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_UNEXPECTED) ; a_ErrorObject.SetWbemStatus (WBEM_E_FAILED); a_ErrorObject.SetMessage (L"Failed to spawn out parameter"); } } pVOutParam->Release(); } if (pSInParam != NULL) { pSInParam->Release(); } if (pSOutParam != NULL) { pSOutParam->Release(); } //release the source class object t_SrcObj->Release(); } else { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_INVALID_CLASS); a_ErrorObject.SetWbemStatus (WBEM_E_FAILED); a_ErrorObject.SetMessage (L"Source class not available"); } } else { retVal = FALSE; a_ErrorObject.SetStatus (WBEM_PROV_E_INVALID_CLASS); a_ErrorObject.SetWbemStatus (WBEM_E_FAILED); a_ErrorObject.SetMessage (L"Source of method not specified in MethodSources qualifier"); } } } else { a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_FOUND) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"MethodSource qualifier is missing" ) ; } VariantClear(&v); pQuals->Release(); } else { a_ErrorObject.SetStatus (WBEM_PROV_E_NOT_FOUND) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_METHOD ) ; a_ErrorObject.SetMessage ( L"Method or Method qualifiers are missing" ) ; } return retVal; } //map the object path to the source instance and perform the method //if static make sure that the object path supplied was a class path. BOOL ExecMethodTaskObject::PerformMethod(WbemProvErrorObject &a_ErrorObject, LONG a_Index, CStringW a_SrcMethodName, BOOL a_bStatic) { BOOL retVal = FALSE; int index = 0; BSTR inst_path = NULL; if (a_bStatic) { //make sure we were passed the class path if (m_ParsedObjectPath->IsClass()) { //get the class and make sure there is //only one namespace associated with it. if (m_NSpaceArray[a_Index]->GetCount() == 1) { retVal = TRUE; inst_path = SysAllocString(m_SourceArray[a_Index]->GetClassName()); } else { a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Could not resolve path to single namespace for source Static method." ) ; } } else { a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"Static method called with instance rather than class path" ) ; } } else { //get the source instance for the view instance IWbemClassObject* pSrcInst; inst_path = MapFromView(m_ObjectPath, NULL, &pSrcInst, TRUE); if (inst_path != NULL) { //get the index of the class VARIANT vCls; if ( SUCCEEDED(pSrcInst->Get(WBEM_PROPERTY_CLASS, 0, &vCls, NULL, NULL)) ) { if (vCls.vt == VT_BSTR) { if (m_ClassToIndexMap.Lookup(vCls.bstrVal, index)) { if (a_Index == index) { retVal = TRUE; } else { a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Object path passed resulted in a different class of object to that of the methodsource" ) ; } } else { VARIANT vSCls; VariantInit(&vSCls); if ( SUCCEEDED(pSrcInst->Get(WBEM_PROPERTY_DERIVATION, 0, &vSCls, NULL, NULL)) ) { if (vSCls.vt == VT_BSTR) { if (m_ClassToIndexMap.Lookup(vSCls.bstrVal, index)) { if (a_Index == index) { retVal = TRUE; } else { a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Source instance class not found in source list" ) ; } } } else if (vSCls.vt == (VT_ARRAY | VT_BSTR)) { if (SafeArrayGetDim(vSCls.parray) == 1) { LONG count = vSCls.parray->rgsabound[0].cElements; BSTR HUGEP *pbstr; if ( SUCCEEDED(SafeArrayAccessData(vSCls.parray, (void HUGEP**)&pbstr)) ) { for (LONG x = 0; x < count; x++) { if (m_ClassToIndexMap.Lookup(pbstr[x], index)) { if (a_Index == index) { retVal = TRUE; break; } } } SafeArrayUnaccessData(vSCls.parray); if (!retVal) { a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Source instance class not found in source list" ) ; } } else { a_ErrorObject.SetStatus (WBEM_PROV_E_INVALID_CLASS); a_ErrorObject.SetWbemStatus (WBEM_E_FAILED); a_ErrorObject.SetMessage (L"Failed to access __Derivation array."); } } else { a_ErrorObject.SetStatus (WBEM_PROV_E_INVALID_CLASS); a_ErrorObject.SetWbemStatus (WBEM_E_FAILED); a_ErrorObject.SetMessage (L"__Derivation array qualifier has incorrect dimensions."); } } else { a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_OBJECT ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Source instance has non string __Derivation property" ) ; } VariantClear(&vSCls); } else { a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_OBJECT ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Source instance has no __Derivation property" ) ; } } } else { a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_OBJECT ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Source instance has non string __Class property" ) ; } VariantClear(&vCls); } else { a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_OBJECT ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Source instance has no __Class property" ) ; } pSrcInst->Release(); } else { a_ErrorObject.SetStatus ( WBEM_PROV_E_NOT_FOUND ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Instance supplied could not be mapped to a single source instance" ) ; } } if (retVal) { //Execute the method and indicate the outparams... //also set the result and we're all done! //which namespace do we execmethod, try them all until we succeed CWbemServerWrap** pServs = m_NSpaceArray[index]->GetServerPtrs(); HRESULT hr = WBEM_E_FAILED; for (UINT i = 0; i < m_NSpaceArray[index]->GetCount(); i++) { if (pServs[i] != NULL) { IWbemClassObject *t_outparam = NULL; IWbemServices *ptmpServ = pServs[i]->GetServerOrProxy(); if (ptmpServ) { BSTR t_MethName = a_SrcMethodName.AllocSysString(); hr = ptmpServ->ExecMethod(inst_path, t_MethName, 0, m_Ctx, m_InParamObject, &t_outparam, NULL); if ( FAILED(hr) && (HRESULT_FACILITY(hr) != FACILITY_ITF) && pServs[i]->IsRemote()) { if ( SUCCEEDED(UpdateConnection(&(pServs[i]), &ptmpServ)) ) { if (ptmpServ) { hr = ptmpServ->ExecMethod(inst_path, t_MethName, 0, m_Ctx, m_InParamObject, &t_outparam, NULL); } } } SysFreeString(t_MethName); if (ptmpServ) { pServs[i]->ReturnServerOrProxy(ptmpServ); } } if (SUCCEEDED (hr) ) { if (m_OutParamObject != NULL) { if (t_outparam != NULL) { //copy contents of the outparam to view outparam if ( SUCCEEDED(t_outparam->BeginEnumeration(WBEM_FLAG_NONSYSTEM_ONLY)) ) { BSTR t_propName = NULL; VARIANT t_propValue; VariantInit(&t_propValue); HRESULT t_hr = t_outparam->Next(0, &t_propName, &t_propValue, NULL, NULL); while (hr == WBEM_S_NO_ERROR) { //copy this property if (SUCCEEDED(hr = m_OutParamObject->Put(t_propName, 0, &t_propValue, NULL))) { //get the next property VariantClear(&t_propValue); VariantInit(&t_propValue); SysFreeString(t_propName); t_propName = NULL; hr = t_outparam->Next(0, &t_propName, &t_propValue, NULL, NULL); } else { break; } } VariantClear(&t_propValue); if (t_propName != NULL) { SysFreeString(t_propName); } if (FAILED(hr)) { t_outparam->EndEnumeration(); retVal = FALSE; } } else { retVal = FALSE; } if (!retVal) { m_OutParamObject->Release(); m_OutParamObject = NULL; a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Source method executed but the view provider failed to copy the out parameter object" ) ; } } else { m_OutParamObject->Release(); m_OutParamObject = NULL; retVal = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Source method executed without returning the out parameter object" ) ; } } if (t_outparam != NULL) { t_outparam->Release(); } break; } } } if ( FAILED (hr) ) { if (m_OutParamObject) { m_OutParamObject->Release(); m_OutParamObject = NULL; } retVal = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; #ifdef VP_SINGLE_NAMESPACE_TRIED wchar_t buff[100]; wsprintf(buff, L"ExecMethod with source object failed with code: %lx", hr); a_ErrorObject.SetMessage ( buff ) ; #else //VP_SINGLE_NAMESPACE_TRIED a_ErrorObject.SetMessage ( L"ExecMethod with source object failed" ) ; #endif //VP_SINGLE_NAMESPACE_TRIED } } if (inst_path != NULL) { SysFreeString(inst_path); } return retVal; }