//*************************************************************************** // // Copyright (c) 1998-1999 Microsoft Corporation // // PROPSET.CPP // // alanbos 15-Aug-96 Created. // // Defines the implementation of ISWbemPropertySet // //*************************************************************************** #include "precomp.h" //*************************************************************************** // // CSWbemMethodSet::CSWbemMethodSet // // DESCRIPTION: // // Constructor. // //*************************************************************************** CSWbemMethodSet::CSWbemMethodSet(CSWbemServices *pService, IWbemClassObject *pObject) { m_Dispatch.SetObj (this, IID_ISWbemMethodSet, CLSID_SWbemMethodSet, L"SWbemMethodSet"); m_pIWbemClassObject = pObject; m_pIWbemClassObject->AddRef (); m_pSWbemServices = pService; if (m_pSWbemServices) m_pSWbemServices->AddRef (); m_cRef=1; InterlockedIncrement(&g_cObj); // Set up the Count. We can do this because this is a read-only interface m_Count = 0; pObject->BeginMethodEnumeration (0); BSTR bstrName = NULL; while (WBEM_S_NO_ERROR == pObject->NextMethod (0, &bstrName, NULL, NULL)) { SysFreeString (bstrName); m_Count++; } pObject->EndMethodEnumeration (); } //*************************************************************************** // // CSWbemMethodSet::~CSWbemMethodSet // // DESCRIPTION: // // Destructor. // //*************************************************************************** CSWbemMethodSet::~CSWbemMethodSet() { InterlockedDecrement(&g_cObj); if (m_pIWbemClassObject) { m_pIWbemClassObject->EndMethodEnumeration (); m_pIWbemClassObject->Release (); } if (m_pSWbemServices) m_pSWbemServices->Release (); } //*************************************************************************** // HRESULT CSWbemMethodSet::QueryInterface // long CSWbemMethodSet::AddRef // long CSWbemMethodSet::Release // // DESCRIPTION: // // Standard Com IUNKNOWN functions. // //*************************************************************************** STDMETHODIMP CSWbemMethodSet::QueryInterface ( IN REFIID riid, OUT LPVOID *ppv ) { *ppv=NULL; if (IID_IUnknown==riid) *ppv = reinterpret_cast(this); else if (IID_ISWbemMethodSet==riid) *ppv = (ISWbemMethodSet *)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) CSWbemMethodSet::AddRef(void) { InterlockedIncrement(&m_cRef); return m_cRef; } STDMETHODIMP_(ULONG) CSWbemMethodSet::Release(void) { LONG cRef = InterlockedDecrement(&m_cRef); if (0 != cRef) { _ASSERT(cRef > 0); return cRef; } delete this; return 0; } //*************************************************************************** // HRESULT CSWbemMethodSet::InterfaceSupportsErrorInfo // // DESCRIPTION: // // Standard Com ISupportErrorInfo functions. // //*************************************************************************** STDMETHODIMP CSWbemMethodSet::InterfaceSupportsErrorInfo (IN REFIID riid) { return (IID_ISWbemMethodSet == riid) ? S_OK : S_FALSE; } //*************************************************************************** // // SCODE CSWbemMethodSet::Item // // DESCRIPTION: // // Get a method // // PARAMETERS: // // bsName The name of the method // lFlags Flags // ppProp On successful return addresses the ISWbemMethod // // RETURN VALUES: // // WBEM_S_NO_ERROR success // WBEM_E_INVALID_PARAMETER bad input parameters // WBEM_E_FAILED otherwise // // Other WBEM error codes may be returned by ConnectServer etc., in which // case these are passed on to the caller. // //*************************************************************************** HRESULT CSWbemMethodSet::Item ( BSTR bsName, long lFlags, ISWbemMethod ** ppMethod ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (NULL == ppMethod) hr = WBEM_E_INVALID_PARAMETER; else { *ppMethod = NULL; if (m_pIWbemClassObject) if (WBEM_S_NO_ERROR == (hr = m_pIWbemClassObject->GetMethod (bsName, lFlags, NULL, NULL))) { if (!(*ppMethod = new CSWbemMethod (m_pSWbemServices, m_pIWbemClassObject, bsName))) hr = WBEM_E_OUT_OF_MEMORY; } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } //*************************************************************************** // // SCODE CSWbemMethodSet::BeginEnumeration // // DESCRIPTION: // // Begin an enumeration of the methods // // RETURN VALUES: // // WBEM_S_NO_ERROR success // WBEM_E_INVALID_PARAMETER bad input parameters // WBEM_E_FAILED otherwise // //*************************************************************************** HRESULT CSWbemMethodSet::BeginEnumeration ( ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_pIWbemClassObject) { hr = m_pIWbemClassObject->EndEnumeration (); hr = m_pIWbemClassObject->BeginMethodEnumeration (0); } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } //*************************************************************************** // // SCODE CSWbemMethodSet::Next // // DESCRIPTION: // // Get next method in enumeration // // PARAMETERS: // // lFlags Flags // ppMethod Next method (or NULL if end of enumeration) // // RETURN VALUES: // // WBEM_S_NO_ERROR success // WBEM_E_INVALID_PARAMETER bad input parameters // WBEM_E_FAILED otherwise // //*************************************************************************** HRESULT CSWbemMethodSet::Next ( long lFlags, ISWbemMethod ** ppMethod ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (NULL == ppMethod) hr = WBEM_E_INVALID_PARAMETER; else { *ppMethod = NULL; if (m_pIWbemClassObject) { BSTR bsName = NULL; if (WBEM_S_NO_ERROR == (hr = m_pIWbemClassObject->NextMethod (lFlags, &bsName, NULL, NULL))) { if (!(*ppMethod = new CSWbemMethod (m_pSWbemServices, m_pIWbemClassObject, bsName))) hr = WBEM_E_OUT_OF_MEMORY; SysFreeString (bsName); } } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } //*************************************************************************** // // SCODE CSWbemMethodSet::get__NewEnum // // DESCRIPTION: // // Return an IEnumVARIANT-supporting interface for collections // // PARAMETERS: // // ppUnk on successful return addresses the IUnknown interface // // RETURN VALUES: // // S_OK success // E_FAIL otherwise // //*************************************************************************** HRESULT CSWbemMethodSet::get__NewEnum ( IUnknown **ppUnk ) { HRESULT hr = E_FAIL; ResetLastErrors (); if (NULL != ppUnk) { *ppUnk = NULL; CMethodSetEnumVar *pEnum = new CMethodSetEnumVar (this); if (!pEnum) hr = WBEM_E_OUT_OF_MEMORY; else if (FAILED(hr = pEnum->QueryInterface (IID_IUnknown, (PPVOID) ppUnk))) delete pEnum; } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } //*************************************************************************** // // SCODE CSWbemMethodSet::get_Count // // DESCRIPTION: // // Return the number of items in the collection // // PARAMETERS: // // plCount on successful return addresses value // // RETURN VALUES: // // S_OK success // E_FAIL otherwise // //*************************************************************************** HRESULT CSWbemMethodSet::get_Count ( long *plCount ) { HRESULT hr = E_FAIL; ResetLastErrors (); if (NULL != plCount) { *plCount = m_Count; hr = S_OK; } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; }