You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
400 lines
8.7 KiB
400 lines
8.7 KiB
//***************************************************************************
|
|
//
|
|
// Copyright (c) 1998-1999 Microsoft Corporation
|
|
//
|
|
// METHOD.CPP
|
|
//
|
|
// alanbos 15-Aug-96 Created.
|
|
//
|
|
// Defines the implementation of ISWbemMethod
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "precomp.h"
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemMethod::CSWbemMethod
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Constructor.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CSWbemMethod::CSWbemMethod(
|
|
CSWbemServices *pService,
|
|
IWbemClassObject *pIWbemClassObject,
|
|
BSTR name
|
|
)
|
|
{
|
|
m_Dispatch.SetObj (this, IID_ISWbemMethod,
|
|
CLSID_SWbemMethod, L"SWbemMethod");
|
|
m_cRef=1;
|
|
m_pIWbemClassObject = pIWbemClassObject;
|
|
m_pIWbemClassObject->AddRef ();
|
|
m_pSWbemServices = pService;
|
|
|
|
if (m_pSWbemServices)
|
|
m_pSWbemServices->AddRef ();
|
|
|
|
m_name = SysAllocString (name);
|
|
InterlockedIncrement(&g_cObj);
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemMethod::~CSWbemMethod
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Destructor.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CSWbemMethod::~CSWbemMethod(void)
|
|
{
|
|
InterlockedDecrement(&g_cObj);
|
|
|
|
if (m_pIWbemClassObject)
|
|
m_pIWbemClassObject->Release ();
|
|
|
|
if (m_pSWbemServices)
|
|
m_pSWbemServices->Release ();
|
|
|
|
SysFreeString (m_name);
|
|
}
|
|
|
|
//***************************************************************************
|
|
// HRESULT CSWbemMethod::QueryInterface
|
|
// long CSWbemMethod::AddRef
|
|
// long CSWbemMethod::Release
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Standard Com IUNKNOWN functions.
|
|
//
|
|
//***************************************************************************
|
|
|
|
STDMETHODIMP CSWbemMethod::QueryInterface (
|
|
|
|
IN REFIID riid,
|
|
OUT LPVOID *ppv
|
|
)
|
|
{
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv = reinterpret_cast<IUnknown*>(this);
|
|
else if (IID_ISWbemMethod==riid)
|
|
*ppv = (ISWbemMethod *)this;
|
|
else if (IID_IDispatch==riid)
|
|
*ppv = (IDispatch *)this;
|
|
else if (IID_ISupportErrorInfo==riid)
|
|
*ppv = (ISupportErrorInfo *)this;
|
|
else if (IID_IProvideClassInfo==riid)
|
|
*ppv = (IProvideClassInfo *)this;
|
|
|
|
if (NULL!=*ppv)
|
|
{
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CSWbemMethod::AddRef(void)
|
|
{
|
|
InterlockedIncrement(&m_cRef);
|
|
return m_cRef;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CSWbemMethod::Release(void)
|
|
{
|
|
LONG cRef = InterlockedDecrement(&m_cRef);
|
|
if (0 != cRef)
|
|
{
|
|
_ASSERT(cRef > 0);
|
|
return cRef;
|
|
}
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
//***************************************************************************
|
|
// HRESULT CSWbemMethod::InterfaceSupportsErrorInfo
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Standard Com ISupportErrorInfo functions.
|
|
//
|
|
//***************************************************************************
|
|
|
|
STDMETHODIMP CSWbemMethod::InterfaceSupportsErrorInfo (IN REFIID riid)
|
|
{
|
|
return (IID_ISWbemMethod == riid) ? S_OK : S_FALSE;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemMethod::get_Name
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Retrieve the method name
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// pName holds the name on return
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemMethod::get_Name (
|
|
BSTR *pName
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == pName)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else
|
|
*pName = SysAllocString (m_name);
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemMethod::get_InParameters
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Retrieve the method in parameters signature
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// ppInSignature addresses the in signature on return
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemMethod::get_InParameters (
|
|
ISWbemObject **ppInSignature
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == ppInSignature)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else
|
|
{
|
|
*ppInSignature = NULL;
|
|
|
|
if (m_pIWbemClassObject)
|
|
{
|
|
IWbemClassObject *pInSig = NULL;
|
|
|
|
/*
|
|
* Note that if there are no in parameters, the following
|
|
* call will succeed but pInSig will be NULL.
|
|
*/
|
|
if ((WBEM_S_NO_ERROR == (hr = m_pIWbemClassObject->GetMethod
|
|
(m_name, 0, &pInSig, NULL))) && pInSig)
|
|
{
|
|
CSWbemObject *pObject = new CSWbemObject (m_pSWbemServices, pInSig);
|
|
|
|
if (!pObject)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pObject->QueryInterface (IID_ISWbemObject,
|
|
(PPVOID) ppInSignature)))
|
|
delete pObject;
|
|
|
|
pInSig->Release ();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemMethod::get_OutParameters
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Retrieve the method out parameters signature
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// ppOutSignature addresses the out signature on return
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemMethod::get_OutParameters (
|
|
ISWbemObject **ppOutSignature
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == ppOutSignature)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else
|
|
{
|
|
*ppOutSignature = NULL;
|
|
|
|
if (m_pIWbemClassObject)
|
|
{
|
|
IWbemClassObject *pOutSig = NULL;
|
|
|
|
/*
|
|
* Note that if there are no in parameters, the following
|
|
* call will succeed but pOutSig will be NULL.
|
|
*/
|
|
if ((WBEM_S_NO_ERROR == (hr = m_pIWbemClassObject->GetMethod
|
|
(m_name, 0, NULL, &pOutSig))) && pOutSig)
|
|
{
|
|
CSWbemObject *pObject = new CSWbemObject (m_pSWbemServices, pOutSig);
|
|
|
|
if (!pObject)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pObject->QueryInterface (IID_ISWbemObject,
|
|
(PPVOID) ppOutSignature)))
|
|
delete pObject;
|
|
|
|
pOutSig->Release ();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemMethod::get_Origin
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Retrieve the method origin
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// pOrigin holds the origin class on return
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemMethod::get_Origin (
|
|
BSTR *pOrigin
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == pOrigin)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else
|
|
{
|
|
if (m_pIWbemClassObject)
|
|
m_pIWbemClassObject->GetMethodOrigin (m_name, pOrigin);
|
|
|
|
if (NULL == *pOrigin)
|
|
*pOrigin = SysAllocString (OLESTR(""));
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemMethod::get_Qualifiers_
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Retrieve the method qualifier set
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// ppQualSet addresses the qualifier set on return
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemMethod::get_Qualifiers_ (
|
|
ISWbemQualifierSet **ppQualSet
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == ppQualSet)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else if (m_pIWbemClassObject)
|
|
{
|
|
IWbemQualifierSet *pQualSet = NULL;
|
|
|
|
if (WBEM_S_NO_ERROR == (hr = m_pIWbemClassObject->GetMethodQualifierSet
|
|
(m_name, &pQualSet)))
|
|
{
|
|
if (!(*ppQualSet = new CSWbemQualifierSet (pQualSet)))
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
|
|
pQualSet->Release ();
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|