WindowsXP-SP1/admin/wmi/wbem/scripting/object.cpp
2020-09-30 16:53:49 +02:00

1973 lines
48 KiB
C++

//***************************************************************************
//
// Copyright (c) 1998-2000 Microsoft Corporation
//
// OBJECT.CPP
//
// alanbos 15-Aug-96 Created.
//
// Defines the implementation of ISWbemObjectEx
//
//***************************************************************************
#include "precomp.h"
//***************************************************************************
//
// CSWbemObject::CSWbemObject
//
// DESCRIPTION:
//
// Constructor.
//
//***************************************************************************
CSWbemObject::CSWbemObject(CSWbemServices *pService, IWbemClassObject *pObject,
CSWbemSecurity *pSecurity,
bool isErrorObject) :
m_pSWbemServices (NULL),
m_pSite (NULL),
m_pIWbemRefresher (NULL),
m_bCanUseRefresher (true)
{
m_cRef=0;
m_isErrorObject = isErrorObject;
m_pIWbemClassObject = pObject;
m_pIWbemClassObject->AddRef ();
m_pIServiceProvider = NULL;
if (pService)
{
m_pSWbemServices = new CSWbemServices (pService, pSecurity);
if (m_pSWbemServices)
m_pSWbemServices->AddRef ();
}
m_pDispatch = new CWbemDispatchMgr (m_pSWbemServices, this);
InterlockedIncrement(&g_cObj);
}
//***************************************************************************
//
// CSWbemObject::~CSWbemObject
//
// DESCRIPTION:
//
// Destructor.
//
//***************************************************************************
CSWbemObject::~CSWbemObject(void)
{
InterlockedDecrement(&g_cObj);
RELEASEANDNULL(m_pIWbemClassObject)
RELEASEANDNULL(m_pSWbemServices)
RELEASEANDNULL(m_pSite)
RELEASEANDNULL(m_pIWbemRefresher)
DELETEANDNULL(m_pDispatch);
}
//***************************************************************************
// HRESULT CSWbemObject::QueryInterface
// long CSWbemObject::AddRef
// long CSWbemObject::Release
//
// DESCRIPTION:
//
// Standard Com IUNKNOWN functions.
//
//***************************************************************************
STDMETHODIMP CSWbemObject::QueryInterface (
IN REFIID riid,
OUT LPVOID *ppv
)
{
*ppv=NULL;
/*
* Only acknowledge the last error or object safety
* interfaces if we are an error object.
*/
if (IID_IUnknown==riid)
*ppv = reinterpret_cast<IUnknown*>(this);
else if (IID_ISWbemObject==riid)
*ppv = (ISWbemObject *)this;
else if (IID_ISWbemObjectEx==riid)
*ppv = (ISWbemObjectEx *)this;
else if (IID_IDispatch==riid)
*ppv = (IDispatch *)((ISWbemObjectEx *)this);
else if (IID_IDispatchEx==riid)
*ppv = (IDispatchEx *)this;
else if (IID_ISWbemInternalObject==riid)
*ppv = (ISWbemInternalObject *) this;
else if (IID_ISupportErrorInfo==riid)
*ppv = (ISupportErrorInfo *)this;
else if (IID_IProvideClassInfo==riid)
*ppv = (IProvideClassInfo *)this;
else if (m_isErrorObject)
{
if (IID_ISWbemLastError==riid)
*ppv = (ISWbemObject *) this;
else if (IID_IObjectSafety==riid)
*ppv = (IObjectSafety *) this;
}
else if (IID_IObjectSafety==riid)
{
/*
* Explicit check because we don't want
* this interface hijacked by a custom interface.
*/
*ppv = NULL;
}
if (NULL!=*ppv)
{
((LPUNKNOWN)*ppv)->AddRef();
return NOERROR;
}
return ResultFromScode(E_NOINTERFACE);
}
STDMETHODIMP_(ULONG) CSWbemObject::AddRef(void)
{
InterlockedIncrement(&m_cRef);
return m_cRef;
}
STDMETHODIMP_(ULONG) CSWbemObject::Release(void)
{
InterlockedDecrement(&m_cRef);
if (0L!=m_cRef)
return m_cRef;
delete this;
return 0;
}
// IDispatch methods should be inline
STDMETHODIMP CSWbemObject::GetTypeInfoCount(UINT* pctinfo)
{
_RD(static char *me = "CSWbemObject::GetTypeInfoCount()";)
_RPrint(me, "Called", 0, "");
return (m_pDispatch ? m_pDispatch->GetTypeInfoCount(pctinfo) : E_FAIL);}
STDMETHODIMP CSWbemObject::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
{
_RD(static char *me = "CSWbemObject::GetTypeInfo()";)
_RPrint(me, "Called", 0, "");
return (m_pDispatch ? m_pDispatch->GetTypeInfo(itinfo, lcid, pptinfo) : E_FAIL);}
STDMETHODIMP CSWbemObject::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames,
UINT cNames, LCID lcid, DISPID* rgdispid)
{
_RD(static char *me = "CSWbemObject::GetIdsOfNames()";)
_RPrint(me, "Called", 0, "");
return (m_pDispatch ? m_pDispatch->GetIDsOfNames(riid, rgszNames, cNames,
lcid,
rgdispid) : E_FAIL);}
STDMETHODIMP CSWbemObject::Invoke(DISPID dispidMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
_RD(static char *me = "CSWbemObject::Invoke()";)
_RPrint(me, "Called", 0, "");
return (m_pDispatch ? m_pDispatch->Invoke(dispidMember, riid, lcid, wFlags,
pdispparams, pvarResult, pexcepinfo, puArgErr) : E_FAIL);}
// IDispatchEx methods should be inline
HRESULT STDMETHODCALLTYPE CSWbemObject::GetDispID(
/* [in] */ BSTR bstrName,
/* [in] */ DWORD grfdex,
/* [out] */ DISPID __RPC_FAR *pid)
{
_RD(static char *me = "CSWbemObject::GetDispID()";)
_RPrint(me, "Called", 0, "");
return (m_pDispatch ? m_pDispatch->GetDispID(bstrName, grfdex, pid) : E_FAIL);
}
/* [local] */ HRESULT STDMETHODCALLTYPE CSWbemObject::InvokeEx(
/* [in] */ DISPID id,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [in] */ DISPPARAMS __RPC_FAR *pdp,
/* [out] */ VARIANT __RPC_FAR *pvarRes,
/* [out] */ EXCEPINFO __RPC_FAR *pei,
/* [unique][in] */ IServiceProvider __RPC_FAR *pspCaller)
{
HRESULT hr;
_RD(static char *me = "CSWbemObject::InvokeEx()";)
_RPrint(me, "Called", (long)id, "id");
_RPrint(me, "Called", (long)wFlags, "wFlags");
/*
* Store away the service provider so that it can be accessed
* by calls that remote to CIMOM
*/
if (m_pDispatch)
{
m_pIServiceProvider = pspCaller;
hr = m_pDispatch->InvokeEx(id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
m_pIServiceProvider = NULL;
}
else
{
hr = E_FAIL;
}
return hr;
}
HRESULT STDMETHODCALLTYPE CSWbemObject::DeleteMemberByName(
/* [in] */ BSTR bstr,
/* [in] */ DWORD grfdex)
{
_RD(static char *me = "CSWbemObject::DeleteMemberByName()";)
_RPrint(me, "Called", 0, "");
return m_pDispatch->DeleteMemberByName(bstr, grfdex);
}
HRESULT STDMETHODCALLTYPE CSWbemObject::DeleteMemberByDispID(
/* [in] */ DISPID id)
{
_RD(static char *me = "CSWbemObject::DeletememberByDispId()";)
_RPrint(me, "Called", 0, "");
return (m_pDispatch ? m_pDispatch->DeleteMemberByDispID(id) : E_FAIL);
}
HRESULT STDMETHODCALLTYPE CSWbemObject::GetMemberProperties(
/* [in] */ DISPID id,
/* [in] */ DWORD grfdexFetch,
/* [out] */ DWORD __RPC_FAR *pgrfdex)
{
_RD(static char *me = "CSWbemObject::GetMemberProperties()";)
_RPrint(me, "Called", 0, "");
return (m_pDispatch ? m_pDispatch->GetMemberProperties(id, grfdexFetch, pgrfdex) : E_FAIL);
}
HRESULT STDMETHODCALLTYPE CSWbemObject::GetMemberName(
/* [in] */ DISPID id,
/* [out] */ BSTR __RPC_FAR *pbstrName)
{
_RD(static char *me = "CSWbemObject::GetMemberName()";)
_RPrint(me, "Called", 0, "");
return (m_pDispatch ? m_pDispatch->GetMemberName(id, pbstrName) : E_FAIL);
}
/*
* I don't think this needs implementing
*/
HRESULT STDMETHODCALLTYPE CSWbemObject::GetNextDispID(
/* [in] */ DWORD grfdex,
/* [in] */ DISPID id,
/* [out] */ DISPID __RPC_FAR *pid)
{
_RD(static char *me = "CSWbemObject::GetNextDispID()";)
_RPrint(me, "Called", 0, "");
return S_FALSE;
}
HRESULT STDMETHODCALLTYPE CSWbemObject::GetNameSpaceParent(
/* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunk)
{
_RD(static char *me = "CSWbemObject::GetNamespaceParent()";)
_RPrint(me, "Called", 0, "");
return (m_pDispatch ? m_pDispatch->GetNameSpaceParent(ppunk) : E_FAIL);
}
//***************************************************************************
// HRESULT CSWbemObject::InterfaceSupportsErrorInfo
//
// DESCRIPTION:
//
// Standard Com ISupportErrorInfo functions.
//
//***************************************************************************
STDMETHODIMP CSWbemObject::InterfaceSupportsErrorInfo (IN REFIID riid)
{
return ((IID_ISWbemObject == riid) ||
(IID_ISWbemObjectEx == riid)) ? S_OK : S_FALSE;
}
//***************************************************************************
//
// CSWbemObject::GetIWbemClassObject
//
// DESCRIPTION:
//
// Return the IWbemClassObject interface corresponding to this
// scriptable wrapper.
//
// PARAMETERS:
// ppObject holds the IWbemClassObject pointer on return
//
// RETURN VALUES:
// S_OK success
// E_FAIL otherwise
//
// NOTES:
// If successful, the returned interface is AddRef'd; the caller is
// responsible for release.
//
//***************************************************************************
STDMETHODIMP CSWbemObject::GetIWbemClassObject (IWbemClassObject **ppObject)
{
HRESULT hr = E_FAIL;
if (ppObject)
*ppObject = NULL;
if (m_pIWbemClassObject)
{
m_pIWbemClassObject->AddRef ();
*ppObject = m_pIWbemClassObject;
hr = S_OK;
}
return hr;
}
//***************************************************************************
//
// CSWbemObject::SetIWbemClassObject
//
// DESCRIPTION:
//
// Set a new IWbemClassObject interface inside this scriptable wrapper.
//
// PARAMETERS:
// pIWbemClassObject - the new IWbemClassObject
//
// RETURN VALUES:
// S_OK success
// E_FAIL otherwise
//
// NOTES:
// If successful, the returned interface is AddRef'd; the caller is
// responsible for release.
//
//***************************************************************************
void CSWbemObject::SetIWbemClassObject (
IWbemClassObject *pIWbemClassObject
)
{
if (m_pIWbemClassObject)
m_pIWbemClassObject->Release ();
m_pIWbemClassObject = pIWbemClassObject;
if (m_pIWbemClassObject)
m_pIWbemClassObject->AddRef ();
if (m_pDispatch)
m_pDispatch->SetNewObject (m_pIWbemClassObject);
};
//***************************************************************************
//
// SCODE CSWbemObject::Put_
//
// DESCRIPTION:
//
// Save/commit this class or instance into a namespace
//
// PARAMETERS:
//
// lFlags Flags
// pContext Context
// ppObjectPath Object Path
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::Put_ (
long lFlags,
/*ISWbemNamedValueSet*/ IDispatch *pContext,
ISWbemObjectPath **ppObjectPath
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (m_pSWbemServices)
{
if (m_pIWbemClassObject)
{
// 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 (pContext, m_pIServiceProvider);
IWbemServices *pIService = m_pSWbemServices->GetIWbemServices ();
IWbemCallResult *pResult = NULL;
HRESULT hrCallResult = WBEM_E_FAILED;
if (pIService)
{
CSWbemSecurity *pSecurity = m_pSWbemServices->GetSecurityInfo ();
if (pSecurity)
{
bool needToResetSecurity = false;
HANDLE hThreadToken = NULL;
if (pSecurity->SetSecurity (needToResetSecurity, hThreadToken))
{
if (WBEM_GENUS_CLASS == var.lVal)
hrCallResult = pIService->PutClass
(m_pIWbemClassObject, lFlags | WBEM_FLAG_RETURN_IMMEDIATELY, pIContext, &pResult);
else
hrCallResult = pIService->PutInstance
(m_pIWbemClassObject, lFlags | WBEM_FLAG_RETURN_IMMEDIATELY, pIContext, &pResult);
}
if (needToResetSecurity)
pSecurity->ResetSecurity (hThreadToken);
pSecurity->Release ();
}
pIService->Release ();
}
/*
* Secure the IWbemCallResult interface
*/
if (WBEM_S_NO_ERROR == hrCallResult)
{
CSWbemSecurity *pSecurity = m_pSWbemServices->GetSecurityInfo ();
if (pSecurity)
pSecurity->SecureInterface (pResult);
if ((WBEM_S_NO_ERROR == (hrCallResult = pResult->GetCallStatus (INFINITE, &hr))) &&
(WBEM_S_NO_ERROR == hr))
{
if (ppObjectPath)
{
ISWbemObjectPath *pObjectPath =
new CSWbemObjectPath (pSecurity, m_pSWbemServices->GetLocale());
if (!pObjectPath)
hr = WBEM_E_OUT_OF_MEMORY;
else
{
pObjectPath->AddRef ();
pObjectPath->put_Path (m_pSWbemServices->GetPath ());
if (WBEM_GENUS_CLASS == var.lVal)
{
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)))
{
pObjectPath->put_Class (nameVar.bstrVal);
*ppObjectPath = pObjectPath;
}
else
pObjectPath->Release ();
VariantClear (&nameVar);
}
else
{
// Now get the relpath string from the call result
BSTR resultString = NULL;
if (WBEM_S_NO_ERROR == pResult->GetResultString (INFINITE, &resultString))
{
pObjectPath->put_RelPath (resultString);
*ppObjectPath = pObjectPath;
SysFreeString (resultString);
}
else
pObjectPath->Release ();
}
}
}
}
if (pSecurity)
pSecurity->Release ();
}
else
hr = hrCallResult;
if (pResult)
pResult->Release ();
SetWbemError (m_pSWbemServices);
if (pIContext)
pIContext->Release ();
}
VariantClear (&var);
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::Delete_
//
// DESCRIPTION:
//
// Delete this class or instance from the namespace
//
// PARAMETERS:
//
// lFlags Flags
// pContext Context
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::Delete_ (
long lFlags,
/*ISWbemNamedValueSet*/ IDispatch *pContext
)
{
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->Delete (bsPath, lFlags, pContext);
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::Instances_
//
// DESCRIPTION:
//
// returns instances of this class
//
// PARAMETERS:
//
// lFlags Flags
// pContext Context
// ppEnum Returned enumerator
//
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::Instances_ (
long lFlags,
/*ISWbemNamedValueSet*/ IDispatch *pContext,
/*[out]*/ ISWbemObjectSet **ppEnum
)
{
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->InstancesOf (bsPath, lFlags, pContext, ppEnum);
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::Subclasses_
//
// DESCRIPTION:
//
// returns subclasses of this class
//
// PARAMETERS:
//
// lFlags Flags
// pContext Context
// ppEnum Returned enumerator
//
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::Subclasses_ (
long lFlags,
/*ISWbemNamedValueSet*/ IDispatch *pContext,
/*[out]*/ ISWbemObjectSet **ppEnum
)
{
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->SubclassesOf (bsPath, lFlags, pContext, ppEnum);
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::Associators_
//
// DESCRIPTION:
//
// returns associators of this object
//
// PARAMETERS:
//
// lFlags Flags
// pContext Context
// ppEnum Returned enumerator
//
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::Associators_ (
BSTR assocClass,
BSTR resultClass,
BSTR resultRole,
BSTR role,
VARIANT_BOOL classesOnly,
VARIANT_BOOL schemaOnly,
BSTR requiredAssocQualifier,
BSTR requiredQualifier,
long lFlags,
/*ISWbemNamedValueSet*/ IDispatch *pContext,
ISWbemObjectSet **ppEnum
)
{
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->AssociatorsOf (bsPath, assocClass, resultClass,
resultRole, role, classesOnly, schemaOnly,
requiredAssocQualifier, requiredQualifier, lFlags,
pContext, ppEnum);
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::References_
//
// DESCRIPTION:
//
// returns references to this object
//
// PARAMETERS:
//
// lFlags Flags
// pContext Context
// ppEnum Returned enumerator
//
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::References_ (
BSTR resultClass,
BSTR role,
VARIANT_BOOL classesOnly,
VARIANT_BOOL schemaOnly,
BSTR requiredQualifier,
long lFlags,
/*ISWbemNamedValueSet*/ IDispatch *pContext,
ISWbemObjectSet **ppEnum
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (m_pSWbemServices && m_pIWbemClassObject)
{
CComBSTR bsPath;
if (CSWbemObjectPath::GetObjectPath (m_pIWbemClassObject, bsPath))
hr = m_pSWbemServices->ReferencesTo (bsPath, resultClass,
role, classesOnly, schemaOnly,
requiredQualifier, lFlags, pContext, ppEnum);
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::ExecMethod_
//
// DESCRIPTION:
//
// Executes a method of this class (or instance)
//
// PARAMETERS:
//
// bsMethod The name of the method to call
// pInParams The in-parameters
// lFlags Flags
// pContext Any context information
// ppOutParams The out-parameters
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::ExecMethod_ (
BSTR bsMethod,
/*ISWbemObject*/ IDispatch *pInParams,
long lFlags,
/*ISWbemValueBag*/ IDispatch *pContext,
ISWbemObject **ppOutParams
)
{
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->ExecMethod (bsPath, bsMethod,
pInParams, lFlags, pContext, ppOutParams);
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::Clone_
//
// DESCRIPTION:
//
// Clone object
//
// PARAMETERS:
// ppCopy On successful return addresses the copy
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::Clone_ (
ISWbemObject **ppCopy
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == ppCopy)
return WBEM_E_INVALID_PARAMETER;
if (m_pIWbemClassObject)
{
IWbemClassObject *pWObject = NULL;
if (WBEM_S_NO_ERROR == (hr = m_pIWbemClassObject->Clone (&pWObject)))
{
CSWbemObject *pObject = new CSWbemObject (m_pSWbemServices, pWObject);
if (!pObject)
hr = WBEM_E_OUT_OF_MEMORY;
else
{
if (FAILED(hr = pObject->QueryInterface (IID_ISWbemObject,
(PPVOID) ppCopy)))
delete pObject;
}
pWObject->Release ();
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::GetObjectText_
//
// DESCRIPTION:
//
// Get MOF Description of Object
//
// PARAMETERS:
// lFlags flags
// pObjectText on successful return holds MOF text
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::GetObjectText_ (
long lFlags,
BSTR *pObjectText
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (m_pIWbemClassObject)
hr = m_pIWbemClassObject->GetObjectText (lFlags, pObjectText);
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::SpawnDerivedClass_
//
// DESCRIPTION:
//
// Create a subclass of this (class) object
//
// PARAMETERS:
// lFlags Flags
// ppNewClass On successful return addresses the subclass
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::SpawnDerivedClass_ (
long lFlags,
ISWbemObject **ppNewClass
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == ppNewClass)
hr = WBEM_E_INVALID_PARAMETER;
else if (m_pIWbemClassObject)
{
IWbemClassObject *pWObject = NULL;
if (WBEM_S_NO_ERROR == (hr = m_pIWbemClassObject->SpawnDerivedClass (lFlags, &pWObject)))
{
CSWbemObject *pObject = new CSWbemObject (m_pSWbemServices, pWObject);
if (!pObject)
hr = WBEM_E_OUT_OF_MEMORY;
else if (FAILED(hr = pObject->QueryInterface (IID_ISWbemObject,
(PPVOID) ppNewClass)))
delete pObject;
pWObject->Release ();
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::SpawnInstance_
//
// DESCRIPTION:
//
// Create an instance of this (class) object
//
// PARAMETERS:
// lFlags Flags
// ppNewInstance On successful return addresses the instance
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::SpawnInstance_ (
long lFlags,
ISWbemObject **ppNewInstance
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == ppNewInstance)
hr = WBEM_E_INVALID_PARAMETER;
else if (m_pIWbemClassObject)
{
IWbemClassObject *pWObject = NULL;
if (WBEM_S_NO_ERROR == (hr = m_pIWbemClassObject->SpawnInstance (lFlags, &pWObject)))
{
CSWbemObject *pObject = new CSWbemObject (m_pSWbemServices, pWObject);
if (!pObject)
hr = WBEM_E_OUT_OF_MEMORY;
else if (FAILED(hr = pObject->QueryInterface (IID_ISWbemObject,
(PPVOID) ppNewInstance)))
delete pObject;
pWObject->Release ();
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::CompareTo_
//
// DESCRIPTION:
//
// Compare this object against another
//
// PARAMETERS:
// pCompareTo The object to compare this against
// lFlags Flags
// pResult On return contains the match status (TRUE/FALSE)
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::CompareTo_ (
/*ISWbemObject*/ IDispatch *pCompareTo,
long lFlags,
VARIANT_BOOL *pResult
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if ((NULL == pCompareTo) || (NULL == pResult))
hr = WBEM_E_INVALID_PARAMETER;
else if (m_pIWbemClassObject)
{
IWbemClassObject *pObject = CSWbemObject::GetIWbemClassObject (pCompareTo);
if (NULL != pObject)
{
if (SUCCEEDED (hr = m_pIWbemClassObject->CompareTo (lFlags, pObject)))
*pResult = (WBEM_S_SAME == hr) ? VARIANT_TRUE : VARIANT_FALSE;
pObject->Release ();
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::get_Qualifiers_
//
// DESCRIPTION:
//
// retrieve the qualifier set for this object
//
// PARAMETERS:
//
// ppQualSet holds the value on return
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::get_Qualifiers_ (
ISWbemQualifierSet **ppQualSet
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == ppQualSet)
hr = WBEM_E_INVALID_PARAMETER;
else
{
*ppQualSet = NULL;
if (m_pIWbemClassObject)
{
IWbemQualifierSet *pQualSet = NULL;
if (WBEM_S_NO_ERROR == (hr = m_pIWbemClassObject->GetQualifierSet (&pQualSet)))
{
if (!(*ppQualSet = new CSWbemQualifierSet (pQualSet, this)))
hr = WBEM_E_OUT_OF_MEMORY;
pQualSet->Release ();
}
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::get_Properties_
//
// DESCRIPTION:
//
// retrieve the property set for this object
//
// PARAMETERS:
//
// ppPropSet holds the value on return
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::get_Properties_ (
ISWbemPropertySet **ppPropSet
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == ppPropSet)
hr = WBEM_E_INVALID_PARAMETER;
{
*ppPropSet = NULL;
if (m_pIWbemClassObject)
{
if (!(*ppPropSet = new CSWbemPropertySet (m_pSWbemServices, this)))
hr = WBEM_E_OUT_OF_MEMORY;
else
hr = WBEM_S_NO_ERROR;
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::get_SystemProperties_
//
// DESCRIPTION:
//
// retrieve the system property set for this object
//
// PARAMETERS:
//
// ppPropSet holds the value on return
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::get_SystemProperties_ (
ISWbemPropertySet **ppPropSet
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == ppPropSet)
hr = WBEM_E_INVALID_PARAMETER;
{
*ppPropSet = NULL;
if (m_pIWbemClassObject)
{
if (!(*ppPropSet = new CSWbemPropertySet (m_pSWbemServices, this, true)))
hr = WBEM_E_OUT_OF_MEMORY;
else
hr = WBEM_S_NO_ERROR;
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::get_Methods_
//
// DESCRIPTION:
//
// retrieve the method set for this object
//
// PARAMETERS:
//
// ppMethodSet holds the value on return
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::get_Methods_ (
ISWbemMethodSet **ppMethodSet
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == ppMethodSet)
hr = WBEM_E_INVALID_PARAMETER;
else
{
*ppMethodSet = NULL;
if (m_pIWbemClassObject)
{
/*
* For classes the IWbemClassObject will contain the method
* definition, but for instances it will be empty. In that
* case we need to try and get the underlying class.
*/
VARIANT var;
VariantInit (&var);
if (WBEM_S_NO_ERROR == m_pIWbemClassObject->Get (WBEMS_SP_GENUS, 0, &var, NULL, NULL))
{
if (WBEM_GENUS_CLASS == var.lVal)
{
if (!(*ppMethodSet = new CSWbemMethodSet (m_pSWbemServices, m_pIWbemClassObject)))
hr = WBEM_E_OUT_OF_MEMORY;
else
hr = WBEM_S_NO_ERROR;
}
else
{
if (m_pSWbemServices)
{
// An instance; try to get the class
VariantClear (&var);
/*
* 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, &var, NULL, NULL))
&& (VT_BSTR == V_VT(&var)))
{
IWbemServices *pIService = m_pSWbemServices->GetIWbemServices ();
IWbemClassObject *pObject = NULL;
if (pIService)
{
// Check privileges are set ok
CSWbemSecurity *pSecurity = m_pSWbemServices->GetSecurityInfo ();
if (pSecurity)
{
bool needToResetSecurity = false;
HANDLE hThreadToken = NULL;
if (pSecurity->SetSecurity (needToResetSecurity, hThreadToken))
hr = pIService->GetObject (var.bstrVal,
0, NULL, &pObject, NULL);
if (SUCCEEDED(hr))
{
if (!(*ppMethodSet =
new CSWbemMethodSet (m_pSWbemServices, pObject)))
hr = WBEM_E_OUT_OF_MEMORY;
pObject->Release ();
}
if (needToResetSecurity)
pSecurity->ResetSecurity (hThreadToken);
pSecurity->Release ();
}
pIService->Release ();
}
}
}
}
}
VariantClear (&var);
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::get_Path_
//
// DESCRIPTION:
//
// retrieve the object path for this object
//
// PARAMETERS:
//
// ppObjectPath holds the value on return
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::get_Path_ (
ISWbemObjectPath **ppObjectPath
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == ppObjectPath)
hr = WBEM_E_INVALID_PARAMETER;
else
{
*ppObjectPath = NULL;
if (m_pIWbemClassObject)
{
CSWbemObjectObjectPath *pObjectPath =
new CSWbemObjectObjectPath (m_pSWbemServices, this);
if (!pObjectPath)
hr = WBEM_E_OUT_OF_MEMORY;
else if (FAILED(hr = pObjectPath->QueryInterface (IID_ISWbemObjectPath,
(PPVOID) ppObjectPath)))
delete pObjectPath;
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::get_Derivation_
//
// DESCRIPTION:
//
// Get the class derivation array.
//
// PARAMETERS:
//
// ppNames Holds the names on successful return
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::get_Derivation_ (
VARIANT *pNames
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == pNames)
hr = WBEM_E_INVALID_PARAMETER;
else
{
if (m_pIWbemClassObject)
{
VARIANT var;
VariantInit (&var);
if (WBEM_S_NO_ERROR == m_pIWbemClassObject->Get (WBEMS_SP_DERIVATION, 0, &var, NULL, NULL))
{
/* The value should be a VT_BSTR|VT_ARRAY */
if (((VT_ARRAY | VT_BSTR) == var.vt) && (NULL != var.parray))
{
// Make a safearray of VARIANTS from the array of BSTRs
SAFEARRAYBOUND rgsabound;
rgsabound.lLbound = 0;
long lBound = 0, uBound = 0;
SafeArrayGetUBound (var.parray, 1, &uBound);
SafeArrayGetLBound (var.parray, 1, &lBound);
rgsabound.cElements = uBound + 1 - lBound;
SAFEARRAY *pArray = SafeArrayCreate (VT_VARIANT, 1, &rgsabound);
BSTR bstrName = NULL;
VARIANT nameVar;
VariantInit (&nameVar);
for (long i = 0; i <= uBound; i++)
{
SafeArrayGetElement (var.parray, &i, &bstrName);
BSTR copy = SysAllocString (bstrName);
nameVar.vt = VT_BSTR;
nameVar.bstrVal = copy;
SafeArrayPutElement (pArray, &i, &nameVar);
SysFreeString (bstrName);
VariantClear (&nameVar);
}
// Now plug this array into the VARIANT
pNames->vt = VT_ARRAY | VT_VARIANT;
pNames->parray = pArray;
hr = S_OK;
}
}
VariantClear (&var);
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::get_Security_
//
// DESCRIPTION:
//
// Return the security configurator
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::get_Security_ (
ISWbemSecurity **ppSecurity
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == ppSecurity)
hr = WBEM_E_INVALID_PARAMETER;
{
*ppSecurity = NULL;
if (m_pSWbemServices)
{
*ppSecurity = m_pSWbemServices->GetSecurityInfo ();
if (*ppSecurity)
hr = WBEM_S_NO_ERROR;
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::Refresh_
//
// DESCRIPTION:
//
// Refresh the current object
//
// PARAMETERS:
// lFlags Flags
// pContext Operation context
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::Refresh_ (
long iFlags,
/*ISWbemNamedValueSet*/ IDispatch *pContext
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (m_pSWbemServices)
{
if (m_pIWbemClassObject)
{
CComPtr<IWbemContext> pIContext;
//Can't assign directly because the raw pointer gets AddRef'd twice and we leak,
//So we use Attach() instead to prevent the smart pointer from AddRef'ing.
pIContext.Attach(CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider));
// Order of preference:
// 1. IWbemConfigureRefresher::AddObjectByTemplate
// 2. IWbemServices::GetObject
CComPtr<IWbemServices> pIWbemServices = m_pSWbemServices->GetIWbemServices ();
if (pIWbemServices)
{
bool bUseRefresher = false;
bool bOperationFailed = false;
// Is this a class or an instance?
bool bIsClass = false;
CComVariant var;
if (WBEM_S_NO_ERROR == m_pIWbemClassObject->Get (WBEMS_SP_GENUS, 0, &var, NULL, NULL))
bIsClass = (WBEM_GENUS_CLASS == var.lVal);
/*
* IWbemConfigureRefresher cannot handle per-refresh context; if the caller
* gave us some context we'll have to drop down to loperf retrieval.
*
* Similarly the refresher cannot handle classes.
*/
if (bIsClass || (!pIContext))
{
if (m_bCanUseRefresher)
{
// If we don't have one get ourselves a refresher
if (NULL == m_pIWbemRefresher)
{
m_bCanUseRefresher = false; // Until proven otherwise
if (SUCCEEDED(CoCreateInstance( CLSID_WbemRefresher, NULL, CLSCTX_INPROC_SERVER,
IID_IWbemRefresher, (void**) &m_pIWbemRefresher )))
{
IWbemConfigureRefresher *pConfigureRefresher = NULL;
// Get ourselves a refresher configurator
if (SUCCEEDED(m_pIWbemRefresher->QueryInterface (IID_IWbemConfigureRefresher,
(void**) &pConfigureRefresher)))
{
CComPtr<IWbemClassObject> pNewObject;
long lID = 0;
// Add our object into it; we mask out all flag bits other
// than WBEM_FLAG_USE_AMENDED_QUALIFIERS.
HRESULT hrRef = pConfigureRefresher->AddObjectByTemplate
(pIWbemServices, m_pIWbemClassObject,
iFlags & WBEM_FLAG_USE_AMENDED_QUALIFIERS,
pIContext, &pNewObject, &lID);
if (SUCCEEDED (hrRef))
{
m_bCanUseRefresher = true; // Now we can use it
// Swap in our refreshable object
SetIWbemClassObject (pNewObject);
}
else if ((WBEM_E_INVALID_OPERATION != hrRef) &&
(WBEM_E_INVALID_PARAMETER != hrRef))
bOperationFailed = true; // A real refresh-independent failure
pConfigureRefresher->Release ();
}
// If we can't use the refresher, release it now
if (!m_bCanUseRefresher)
{
m_pIWbemRefresher->Release ();
m_pIWbemRefresher = NULL;
}
}
}
bUseRefresher = m_bCanUseRefresher;
}
}
// Having successfully set up a refresher/non-refresher scenario, let's go refresh
if (!bOperationFailed)
{
if (bUseRefresher && m_pIWbemRefresher)
{
// Mask out all flags other than WBEM_FLAG_REFRESH_NO_AUTO_RECONNECT
hr = m_pIWbemRefresher->Refresh (iFlags & WBEM_FLAG_REFRESH_NO_AUTO_RECONNECT);
}
else
{
// Bah - not even a refresher can we use. Just do a GetObject instead
CComBSTR bsPath;
if (CSWbemObjectPath::GetObjectPath (m_pIWbemClassObject, bsPath))
{
// Fall pack to the low-perf way of doing things
CComPtr<IWbemClassObject> pNewObject;
// Mask out the WBEM_FLAG_REFRESH_NO_AUTO_RECONNECT flag
if (SUCCEEDED(hr = pIWbemServices->GetObject (bsPath,
iFlags & ~WBEM_FLAG_REFRESH_NO_AUTO_RECONNECT,
pIContext, &pNewObject, NULL)))
{
// Swap in the new object
SetIWbemClassObject (pNewObject);
}
}
}
}
}
}
}
SetWbemError (m_pSWbemServices);
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::GetText_
//
// DESCRIPTION:
//
// Get the object text
//
// PARAMETERS:
// iObjectTextFormat Text format
// pContext Context
// pbsText On return holds text
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::GetText_ (
WbemObjectTextFormatEnum iObjectTextFormat,
long iFlags,
/*ISWbemNamedValueSet*/ IDispatch *pContext,
BSTR *pbsText
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == pbsText)
hr = WBEM_E_INVALID_PARAMETER;
else if (m_pIWbemClassObject)
{
*pbsText = NULL;
CComPtr<IWbemContext> pIContext;
//Can't assign directly because the raw pointer gets AddRef'd twice and we leak,
//So we use Attach() instead to prevent the smart pointer from AddRef'ing.
pIContext.Attach(CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider));
CComPtr<IWbemObjectTextSrc> pIWbemObjectTextSrc;
if (SUCCEEDED(CoCreateInstance (CLSID_WbemObjectTextSrc, NULL, CLSCTX_INPROC_SERVER,
IID_IWbemObjectTextSrc, (PPVOID) &pIWbemObjectTextSrc)))
{
hr = pIWbemObjectTextSrc->GetText (iFlags, m_pIWbemClassObject, (ULONG) iObjectTextFormat,
pIContext, pbsText);
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// SCODE CSWbemObject::SetFromText_
//
// DESCRIPTION:
//
// Set the object using the supplied text
//
// PARAMETERS:
// bsText The text
// iObjectTextFormat Text format
// pContext Context
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObject::SetFromText_ (
BSTR bsText,
WbemObjectTextFormatEnum iObjectTextFormat,
long iFlags,
/*ISWbemNamedValueSet*/ IDispatch *pContext
)
{
HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == bsText)
hr = WBEM_E_INVALID_PARAMETER;
else if (m_pIWbemClassObject)
{
CComPtr<IWbemContext> pIContext;
//Can't assign directly because the raw pointer gets AddRef'd twice and we leak,
//So we use Attach() instead to prevent the smart pointer from AddRef'ing.
pIContext.Attach(CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider));
CComPtr<IWbemObjectTextSrc> pIWbemObjectTextSrc;
if (SUCCEEDED(CoCreateInstance (CLSID_WbemObjectTextSrc, NULL, CLSCTX_INPROC_SERVER,
IID_IWbemObjectTextSrc, (PPVOID) &pIWbemObjectTextSrc)))
{
CComPtr<IWbemClassObject> pIWbemClassObject;
if (SUCCEEDED(hr = pIWbemObjectTextSrc->CreateFromText (iFlags, bsText, (ULONG) iObjectTextFormat,
pIContext, &pIWbemClassObject)))
{
// Set the new object into our object
SetIWbemClassObject (pIWbemClassObject);
}
}
}
if (FAILED(hr) && m_pDispatch)
m_pDispatch->RaiseException (hr);
return hr;
}
//***************************************************************************
//
// CSWbemObject::GetIWbemClassObject
//
// DESCRIPTION:
//
// Given an IDispatch interface which we hope is also an ISWbemObjectEx
// interface, return the underlying IWbemClassObject interface.
//
// PARAMETERS:
// pDispatch the IDispatch in question
//
// RETURN VALUES:
// The underlying IWbemClassObject interface, or NULL.
//
// NOTES:
// If successful, the returned interface is AddRef'd; the caller is
// responsible for release.
//
//***************************************************************************
IWbemClassObject *CSWbemObject::GetIWbemClassObject (
IDispatch *pDispatch
)
{
IWbemClassObject *pObject = NULL;
ISWbemInternalObject *pIObject = NULL;
if (NULL != pDispatch)
{
if (SUCCEEDED (pDispatch->QueryInterface
(IID_ISWbemInternalObject, (PPVOID) &pIObject)))
{
pIObject->GetIWbemClassObject (&pObject);
pIObject->Release ();
}
}
return pObject;
}
//***************************************************************************
//
// CSWbemObject::UpdateSite
//
// DESCRIPTION:
//
// If this object represents an embedded CIM object property value, then
// as a result of changes to properties/qualifiers/path on this object it
// is necessary to update the object in its parent.
//
// This is to allow the following code to work:
//
// Object.EmbeddedProperty.SimpleProperty = 3
//
// i.e. so that the set to the value of SimpleProperty triggers an
// automatic set of EmbeddedProperty to Object.
//
// RETURN VALUES:
// The underlying IWbemClassObject interface, or NULL.
//
// NOTES:
// If successful, the returned interface is AddRef'd; the caller is
// responsible for release.
//
//***************************************************************************
STDMETHODIMP CSWbemObject::UpdateSite ()
{
// Update the site if it exists
if (m_pSite)
m_pSite->Update ();
return S_OK;
}
//***************************************************************************
//
// CSWbemObject::SetSite
//
// DESCRIPTION:
//
// Set the site of this object; this is used to anchor an embedded object
// to a property (possibly indexed, if that property is an array).
//
// PARAMETERS:
// pParentObject The parent of this object
// propertyName The property name for this object
// index The array index into the property (or -1)
//
// RETURN VALUES:
// S_OK success
// E_FAIL otherwise
//
// NOTES:
// If successful, the returned interface is AddRef'd; the caller is
// responsible for release.
//
//***************************************************************************
STDMETHODIMP CSWbemObject::SetSite (
ISWbemInternalObject *pParentObject,
BSTR propertyName,
long index
)
{
if (m_pSite)
{
m_pSite->Release ();
m_pSite = NULL;
}
CSWbemProperty *pSProperty = new CSWbemProperty (m_pSWbemServices,
pParentObject, propertyName);
m_pSite = new CWbemPropertySite (pSProperty, m_pIWbemClassObject, index);
if (pSProperty)
pSProperty->Release ();
return S_OK;
}
void CSWbemObject::SetSite (IDispatch *pDispatch,
ISWbemInternalObject *pSObject, BSTR propertyName, long index)
{
if (NULL != pDispatch)
{
ISWbemInternalObject *pObject = NULL;
if (SUCCEEDED (pDispatch->QueryInterface
(IID_ISWbemInternalObject, (PPVOID) &pObject)))
{
pObject->SetSite (pSObject, propertyName, index);
pObject->Release ();
}
}
}