WindowsXP/admin/wmi/wbem/providers/dmi/source/eventprovider.cpp
2025-04-27 07:49:33 -04:00

202 lines
4.0 KiB
C++

/*
******************************************************************************
******************************************************************************
*
*
* INTEL CORPORATION PROPRIETARY INFORMATION
* This software is supplied under the terms of a license agreement or
* nondisclosure agreement with Intel Corporation and may not be copied or
* disclosed except in accordance with the terms of that agreement.
*
* Copyright (c) 1997, 1998 Intel Corporation All Rights Reserved
******************************************************************************
******************************************************************************
*
*
*
*
*
*/
#include "dmipch.h" // precompiled header for dmi provider
#include "WbemDmiP.h" // project wide include
#include "String.h"
#include "CimClass.h"
#include "EventProvider.h"
#include "Trace.h"
#include "Exception.h"
#include "DmiData.h"
//***************************************************************************
//
// CEventProvider::CEventProvider
// CEventProvider::~CEventProvider
//
//***************************************************************************
CEventProvider::CEventProvider()
{
m_cRef = 0;
return;
}
CEventProvider::~CEventProvider(void)
{
STAT_TRACE ( L"CEventProvider::~CEventProvider()");
return;
}
//***************************************************************************
//
// CEventProvider::QueryInterface
// CEventProvider::AddRef
// CEventProvider::Release
//
// Purpose: IUnknown members for CEventProvider object.
//***************************************************************************
STDMETHODIMP CEventProvider::QueryInterface(REFIID riid, void** ppv)
{
*ppv=NULL;
if (IID_IUnknown==riid )
{
*ppv=this;
}
else if ( IID_IWbemEventProvider == riid)
{
*ppv = ( IWbemEventProvider * ) this ;
}
else if ( IID_IWbemProviderInit == riid)
{
*ppv = ( IWbemProviderInit * ) this ;
}
if (NULL!=*ppv)
{
AddRef();
return NOERROR;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CEventProvider::AddRef(void)
{
return InterlockedIncrement ( & m_cRef );
}
STDMETHODIMP_(ULONG) CEventProvider::Release(void)
{
if ( 0L != InterlockedDecrement ( & m_cRef ) )
return m_cRef;
// refernce count is zero, delete this object.
SetEvent ( m_hStopThreadEvent );
delete this;
return WBEM_NO_ERROR;
}
//***************************************************************************
//
// CEventProvider
//
// Purpose:
//
//
//***************************************************************************
STDMETHODIMP CEventProvider::ProvideEvents(
IWbemObjectSink* pISink,
LONG lFlags
)
{
SCODE result = WBEM_NO_ERROR;
STAT_TRACE ( L"CEventProvider::ProvideEvents()");
// Check for requried Params
if(pISink == NULL || lFlags != 0 )
return WBEM_E_INVALID_PARAMETER;
try
{
// create the sink that will recive events from the motdmiengine
CEvents* m_pEvents = new CEvents;
m_pEvents->Enable ( m_csNamespace , pISink );
}
catch ( CException& e )
{
return e.WbemError();
}
catch ( ... )
{
return WBEM_E_FAILED;
}
return 0L;
}
HRESULT CEventProvider::Initialize(
LPWSTR pszUser,
LONG lFlags,
LPWSTR wszNamespaceName,
LPWSTR pszLocale,
IWbemServices *ppNamespace, // For anybody
IWbemContext *pCtx,
IWbemProviderInitSink *pInitSink // For init signals
)
{
SCODE result = WBEM_NO_ERROR;
STAT_TRACE ( L"CEventProvider::Initialize ( %s )", wszNamespaceName);
// Check for requried Params
if(lFlags != 0 || !wszNamespaceName )
return WBEM_E_INVALID_PARAMETER;
try
{
m_csNamespace.Set ( wszNamespaceName );
}
catch ( CException& e )
{
return e.WbemError();
}
catch ( ... )
{
return WBEM_E_FAILED;
}
pInitSink->SetStatus ( result , 0 ) ;
return 0L;
}