windows-nt/Source/XPSP1/NT/admin/wmi/wbem/scripting/asyncobj.cpp
2020-09-26 16:20:57 +08:00

323 lines
9.4 KiB
C++

//***************************************************************************
//
// 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;
}