//*************************************************************************** // // Copyright (c) 1998-1999 Microsoft Corporation // // ENUMOBJ.CPP // // alanbos 15-Aug-96 Created. // // Defines the implementation of ISWbemObjectSet // //*************************************************************************** #include "precomp.h" //*************************************************************************** // // CSWbemEventSource::CSWbemEventSource // // DESCRIPTION: // // Constructor. // //*************************************************************************** CSWbemEventSource::CSWbemEventSource( CSWbemServices *pService, IEnumWbemClassObject *pIEnumWbemClassObject) { m_Dispatch.SetObj (this, IID_ISWbemEventSource, CLSID_SWbemEventSource, L"SWbemEventSource"); m_cRef=0; m_pSWbemServices = pService; if (m_pSWbemServices) { m_pSWbemServices->AddRef (); CSWbemSecurity *pSecurity = m_pSWbemServices->GetSecurityInfo (); if (pSecurity) { m_SecurityInfo = new CSWbemSecurity (pIEnumWbemClassObject, pSecurity); pSecurity->Release (); } } InterlockedIncrement(&g_cObj); } //*************************************************************************** // // CSWbemEventSource::~CSWbemEventSource // // DESCRIPTION: // // Destructor. // //*************************************************************************** CSWbemEventSource::~CSWbemEventSource(void) { InterlockedDecrement(&g_cObj); if (m_pSWbemServices) m_pSWbemServices->Release (); if (m_SecurityInfo) m_SecurityInfo->Release (); } //*************************************************************************** // HRESULT CSWbemEventSource::QueryInterface // long CSWbemEventSource::AddRef // long CSWbemEventSource::Release // // DESCRIPTION: // // Standard Com IUNKNOWN functions. // //*************************************************************************** STDMETHODIMP CSWbemEventSource::QueryInterface ( IN REFIID riid, OUT LPVOID *ppv ) { *ppv=NULL; if (IID_IUnknown==riid) *ppv = reinterpret_cast(this); else if (IID_ISWbemEventSource==riid) *ppv = (ISWbemEventSource*)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) CSWbemEventSource::AddRef(void) { InterlockedIncrement(&m_cRef); return m_cRef; } STDMETHODIMP_(ULONG) CSWbemEventSource::Release(void) { InterlockedDecrement(&m_cRef); if (0L!=m_cRef) return m_cRef; delete this; return 0; } //*************************************************************************** // HRESULT CSWbemEventSource::InterfaceSupportsErrorInfo // // DESCRIPTION: // // Standard Com ISupportErrorInfo functions. // //*************************************************************************** STDMETHODIMP CSWbemEventSource::InterfaceSupportsErrorInfo (IN REFIID riid) { return (IID_ISWbemEventSource == riid) ? S_OK : S_FALSE; } //*************************************************************************** // // SCODE CSWbemEventSource::NextEvent // // DESCRIPTION: // // Get the next event, or timeout // // PARAMETERS: // // lTimeout Number of ms to wait for object (or wbemTimeoutInfinite for // indefinite) // ppObject On return may contain the next element (if any) // // RETURN VALUES: // // WBEM_S_NO_ERROR success // WBEM_E_FAILED otherwise // //*************************************************************************** HRESULT CSWbemEventSource::NextEvent ( long lTimeout, ISWbemObject **ppObject ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (NULL == ppObject) hr = WBEM_E_INVALID_PARAMETER; else { *ppObject = NULL; if (m_SecurityInfo) { IEnumWbemClassObject *pIEnumWbemClassObject = (IEnumWbemClassObject *) m_SecurityInfo->GetProxy (); if (pIEnumWbemClassObject) { IWbemClassObject *pIWbemClassObject = NULL; ULONG returned = 0; bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIEnumWbemClassObject->Next (lTimeout, 1, &pIWbemClassObject, &returned); if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); if (SUCCEEDED(hr) && (0 < returned) && pIWbemClassObject) { CSWbemObject *pObject = new CSWbemObject (m_pSWbemServices, pIWbemClassObject, m_SecurityInfo); if (!pObject) hr = WBEM_E_OUT_OF_MEMORY; else if (FAILED(hr = pObject->QueryInterface (IID_ISWbemObject, (PPVOID) ppObject))) delete pObject; pIWbemClassObject->Release (); } else if (WBEM_S_TIMEDOUT == hr) { /* * Since a timeout would be indistinguishable from an end-of-enumeration * in automation terms we flag it as a real error rather than an S-CODE. */ hr = wbemErrTimedout; } SetWbemError (m_pSWbemServices); pIEnumWbemClassObject->Release (); } } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } //*************************************************************************** // // SCODE CSWbemEventSource::get_Security_ // // DESCRIPTION: // // Return the security configurator // // WBEM_S_NO_ERROR success // WBEM_E_INVALID_PARAMETER bad input parameters // WBEM_E_FAILED otherwise // //*************************************************************************** HRESULT CSWbemEventSource::get_Security_ ( ISWbemSecurity **ppSecurity ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (NULL == ppSecurity) hr = WBEM_E_INVALID_PARAMETER; { *ppSecurity = NULL; if (m_SecurityInfo) { *ppSecurity = m_SecurityInfo; (*ppSecurity)->AddRef (); hr = WBEM_S_NO_ERROR; } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; }