323 lines
9.4 KiB
C++
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;
|
|
}
|
|
|
|
|