//*************************************************************************** // // Copyright (c) 1998-2000 Microsoft Corporation // // OBJECT.CPP // // rogerbo 19-June-98 Created. // // Defines the async implementation of ISWbemObjectEx // //*************************************************************************** #include "precomp.h" #include "objsink.h" HRESULT STDMETHODCALLTYPE CSWbemObject::PutAsync_( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_pSWbemServices && m_pIWbemClassObject) { if (pAsyncNotify) { // Figure out whether this is a class or instance VARIANT var; VariantInit (&var); if (WBEM_S_NO_ERROR == m_pIWbemClassObject->Get (WBEMS_SP_GENUS, 0, &var, NULL, NULL)) { IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (objContext, m_pIServiceProvider); IWbemServices *pIService = m_pSWbemServices->GetIWbemServices (); if (WBEM_GENUS_CLASS == var.lVal) { // Save the class name for later VARIANT nameVar; VariantInit (&nameVar); /* * Note we must check that returned value is a BSTR - it could be a VT_NULL if * the __CLASS property has not yet been set. */ if ((WBEM_S_NO_ERROR == m_pIWbemClassObject->Get (WBEMS_SP_CLASS, 0, &nameVar, NULL, NULL)) && (VT_BSTR == V_VT(&nameVar))) { if (pIService) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, m_pSWbemServices, pAsyncNotify, pAsyncContext, true, nameVar.bstrVal); if (pSink) { CSWbemSecurity *pSecurity = m_pSWbemServices->GetSecurityInfo (); if (pSecurity) { bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (pSecurity->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIService->PutClassAsync (m_pIWbemClassObject, iFlags, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); if (needToResetSecurity) pSecurity->ResetSecurity (hThreadToken); pSecurity->Release (); } } } } VariantClear (&nameVar); } else { if (pIService) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, m_pSWbemServices, pAsyncNotify, pAsyncContext, true); if (pSink) { CSWbemSecurity *pSecurity = m_pSWbemServices->GetSecurityInfo (); if (pSecurity) { bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (pSecurity->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIService->PutInstanceAsync (m_pIWbemClassObject, iFlags, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); // Restore original privileges on this thread if (needToResetSecurity) pSecurity->ResetSecurity (hThreadToken); pSecurity->Release (); } } } } SetWbemError (m_pSWbemServices); if (pIService) pIService->Release (); if (pIContext) pIContext->Release (); } VariantClear (&var); } else hr = wbemErrInvalidParameter; } if (FAILED(hr) && m_pDispatch) m_pDispatch->RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemObject::DeleteAsync_( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_pSWbemServices) { if (m_pIWbemClassObject) { // Get the object path to pass to the IWbemServices call CComBSTR bsPath; if (CSWbemObjectPath::GetObjectPath (m_pIWbemClassObject, bsPath)) hr = m_pSWbemServices->DeleteAsync (pAsyncNotify, bsPath, iFlags, objContext, pAsyncContext); } } if (FAILED(hr) && m_pDispatch) m_pDispatch->RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemObject::InstancesAsync_( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_pSWbemServices && m_pIWbemClassObject) { // Get the object path to pass to the IWbemServices call CComBSTR bsPath; if (CSWbemObjectPath::GetObjectPath (m_pIWbemClassObject, bsPath)) hr = m_pSWbemServices->InstancesOfAsync (pAsyncNotify, bsPath, iFlags, objContext, pAsyncContext); } if (FAILED(hr) && m_pDispatch) m_pDispatch->RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemObject::SubclassesAsync_( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_pSWbemServices && m_pIWbemClassObject) { // Get the object path to pass to the IWbemServices call CComBSTR bsPath; if (CSWbemObjectPath::GetObjectPath (m_pIWbemClassObject, bsPath)) hr = m_pSWbemServices->SubclassesOfAsync (pAsyncNotify, bsPath, iFlags, objContext, pAsyncContext); } if (FAILED(hr) && m_pDispatch) m_pDispatch->RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemObject::AssociatorsAsync_( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [defaultvalue][optional][in] */ BSTR strAssocClass, /* [defaultvalue][optional][in] */ BSTR strResultClass, /* [defaultvalue][optional][in] */ BSTR strResultRole, /* [defaultvalue][optional][in] */ BSTR strRole, /* [defaultvalue][optional][in] */ VARIANT_BOOL bClassesOnly, /* [defaultvalue][optional][in] */ VARIANT_BOOL bSchemaOnly, /* [defaultvalue][optional][in] */ BSTR strRequiredAssocQualifier, /* [defaultvalue][optional][in] */ BSTR strRequiredQualifier, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_pSWbemServices && m_pIWbemClassObject) { // Get the object path to pass to the IWbemServices call CComBSTR bsPath; if (CSWbemObjectPath::GetObjectPath (m_pIWbemClassObject, bsPath)) hr = m_pSWbemServices->AssociatorsOfAsync (pAsyncNotify, bsPath, strAssocClass, strResultClass, strResultRole, strRole, bClassesOnly, bSchemaOnly, strRequiredAssocQualifier, strRequiredQualifier, iFlags, objContext, pAsyncContext); } if (FAILED(hr) && m_pDispatch) m_pDispatch->RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemObject::ReferencesAsync_( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [defaultvalue][optional][in] */ BSTR strResultClass, /* [defaultvalue][optional][in] */ BSTR strRole, /* [defaultvalue][optional][in] */ VARIANT_BOOL bClassesOnly, /* [defaultvalue][optional][in] */ VARIANT_BOOL bSchemaOnly, /* [defaultvalue][optional][in] */ BSTR strRequiredQualifier, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_pSWbemServices && m_pIWbemClassObject) { // Get the object path to pass to the IWbemServices call CComBSTR bsPath; if (CSWbemObjectPath::GetObjectPath (m_pIWbemClassObject, bsPath)) hr = m_pSWbemServices->ReferencesToAsync (pAsyncNotify, bsPath, strResultClass, strRole, bClassesOnly, bSchemaOnly, strRequiredQualifier, iFlags, objContext, pAsyncContext); } if (FAILED(hr) && m_pDispatch) m_pDispatch->RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemObject::ExecMethodAsync_( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [in] */ BSTR strMethodName, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objInParams, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_pSWbemServices && m_pIWbemClassObject) { // Get the object path to pass to the IWbemServices call CComBSTR bsPath; if (CSWbemObjectPath::GetObjectPath (m_pIWbemClassObject, bsPath)) hr = m_pSWbemServices->ExecMethodAsync (pAsyncNotify, bsPath, strMethodName, objInParams, iFlags, objContext, pAsyncContext); } if (FAILED(hr) && m_pDispatch) m_pDispatch->RaiseException (hr); return hr; }