Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

132 lines
3.7 KiB

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// BVTSink.CPP
//
//
// Copyright (c)2000 Microsoft Corporation, All Rights Reserved
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "bvt.h"
#include <time.h>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*****************************************************************************************************************
//
//
//
//*****************************************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CSinkEx::QueryInterface( REFIID riid, LPVOID * ppvObj )
{
if (riid == IID_IUnknown)
{
*ppvObj = (IUnknown *)this;
}
else if (riid == IID_IWbemObjectSink)
{
*ppvObj = (IWbemObjectSink *)this;
}
else if (riid == IID_IWbemObjectSinkEx)
{
*ppvObj = (IWbemObjectSinkEx *)this;
}
else
{
*ppvObj = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ULONG CSinkEx::AddRef()
{
return (ULONG)InterlockedIncrement(&m_lRefCount);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ULONG CSinkEx::Release()
{
Lock();
if(m_lRefCount <= 0)
{
delete this;
return 0;
}
if (InterlockedDecrement(&m_lRefCount))
{
Unlock();
return 1;
}
Unlock();
delete this;
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CSinkEx::Indicate( long lObjectCount, IWbemClassObject ** pObjArray )
{
if(lObjectCount == 0)
return WBEM_NO_ERROR;
Lock();
for (int i = 0; i < lObjectCount; i++)
{
IWbemClassObject *pObj = pObjArray[i];
pObj->AddRef();
m_aObjects.Add(pObj);
}
Unlock();
return WBEM_NO_ERROR;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CSinkEx::Set( long lFlags, REFIID riid, void *pComObject)
{
Lock();
m_pInterfaceID=riid;
m_pInterface=(IUnknown *)pComObject;
Unlock();
return WBEM_NO_ERROR;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSinkEx::SetStatus(long lFlags, HRESULT hResult, BSTR strParam, IWbemClassObject* pObjParam)
{
m_hres = hResult;
if(lFlags & WBEM_STATUS_PROGRESS)
{
return WBEM_NO_ERROR;
}
m_pErrorObj = pObjParam;
if(pObjParam)
pObjParam->AddRef();
SetEvent(m_hEvent);
return WBEM_NO_ERROR;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSinkEx::CSinkEx(LONG lStartingRefCount)
{
m_hres = 0;
InitializeCriticalSection(&m_cs);
m_lRefCount = lStartingRefCount;
m_hEvent = CreateEvent(0, FALSE, FALSE, 0);
m_pErrorObj = NULL;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSinkEx::~CSinkEx()
{
DeleteCriticalSection(&m_cs);
CloseHandle(m_hEvent);
for (int i = 0; i < m_aObjects.Size(); i++)
((IWbemClassObject *) m_aObjects[i])->Release();
if(m_pErrorObj) m_pErrorObj->Release();
}