mirror of https://github.com/tongzx/nt5src
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.
114 lines
2.0 KiB
114 lines
2.0 KiB
/*++
|
|
|
|
Copyright (C) 1996-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
NOTSINK.CPP
|
|
|
|
Abstract:
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include "notsink.h"
|
|
#include <stdio.h>
|
|
#include "wbemntfy.h"
|
|
|
|
extern CStatusMonitor gStatus;
|
|
|
|
// Notification Query Sink
|
|
|
|
SCODE CNotSink::QueryInterface(
|
|
REFIID riid,
|
|
LPVOID * ppvObj
|
|
)
|
|
{
|
|
if (riid == IID_IUnknown)
|
|
{
|
|
*ppvObj = this;
|
|
}
|
|
else if (riid == IID_IWbemObjectSink)
|
|
*ppvObj = this;
|
|
else
|
|
{
|
|
*ppvObj = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
ULONG CNotSink::AddRef()
|
|
{
|
|
InterlockedIncrement(&m_lRefCount);
|
|
return (ULONG) m_lRefCount;
|
|
}
|
|
|
|
ULONG CNotSink::Release()
|
|
{
|
|
InterlockedDecrement(&m_lRefCount);
|
|
|
|
if (0 != m_lRefCount)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
|
|
SCODE CNotSink::Indicate(
|
|
long lObjectCount,
|
|
IWbemClassObject ** pObjArray
|
|
)
|
|
{
|
|
if(lObjectCount == 0) return WBEM_NO_ERROR;
|
|
if(m_pViewer == NULL) return WBEM_NO_ERROR;
|
|
|
|
// Use critical section to prevent re-entrancy
|
|
// from additional Indicate's into this code.
|
|
EnterCriticalSection(&m_cs);
|
|
for (int i = 0; i < lObjectCount; i++)
|
|
{
|
|
IWbemClassObject *pObj = pObjArray[i];
|
|
m_pViewer->PostObject(pObj);
|
|
}
|
|
m_pViewer->PostCount(lObjectCount);
|
|
LeaveCriticalSection(&m_cs);
|
|
|
|
return WBEM_NO_ERROR;
|
|
}
|
|
|
|
STDMETHODIMP CNotSink::SetStatus(long lFlags, long lParam, BSTR strParam,
|
|
IWbemClassObject* pObjParam)
|
|
{
|
|
if(lFlags & WBEM_STATUS_PROGRESS)
|
|
{
|
|
gStatus.Add(lFlags, lParam, strParam);
|
|
return WBEM_NO_ERROR;
|
|
}
|
|
|
|
EnterCriticalSection(&m_cs);
|
|
if(m_pViewer)
|
|
m_pViewer->PostComplete(lParam, strParam, pObjParam);
|
|
LeaveCriticalSection(&m_cs);
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
|
|
CNotSink::CNotSink(CQueryResultDlg* pViewer)
|
|
{
|
|
m_lRefCount = 1;
|
|
m_pViewer = pViewer;
|
|
InitializeCriticalSection(&m_cs);
|
|
}
|
|
|
|
CNotSink::~CNotSink()
|
|
{
|
|
DeleteCriticalSection(&m_cs);
|
|
}
|