windows-nt/Source/XPSP1/NT/admin/wmi/wbem/scripting/events.cpp
2020-09-26 16:20:57 +08:00

270 lines
6 KiB
C++

//***************************************************************************
//
// 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<IUnknown*>(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;
}