2025-04-27 07:49:33 -04:00

142 lines
3.6 KiB
C++

//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
#include "stdafx.h"
#include "consumer.h"
CConsumer::CConsumer(CListBox *pOutputList, CMsaApp *pTheApp, BSTR bstrType)
{
m_pParent = pTheApp;
m_cRef = 0L;
m_pOutputList = pOutputList;
m_bstrIncidentType = SysAllocString(bstrType);
}
CConsumer::~CConsumer()
{
SysFreeString(m_bstrIncidentType);
}
STDMETHODIMP CConsumer::QueryInterface(REFIID riid, LPVOID FAR *ppv)
{
*ppv=NULL;
if (riid == IID_IUnknown || riid == IID_IWbemUnboundObjectSink)
*ppv=this;
if (*ppv != NULL)
{
((LPUNKNOWN)*ppv)->AddRef();
return NOERROR;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CConsumer::AddRef(void)
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG) CConsumer::Release(void)
{
if (--m_cRef != 0L)
return m_cRef;
delete this;
return 0L;
}
STDMETHODIMP CConsumer::IndicateToConsumer(IWbemClassObject *pLogicalConsumer,
long lNumObjects,
IWbemClassObject **ppObjects)
{
HRESULT hr;
CString clMyBuff;
VARIANT vType, vDisp, vClass, vName, vServ;
IDispatch *pDisp = NULL;
IWbemClassObject *tgtInst = NULL;
LPVOID *ppObject = NULL;
WCHAR wcServerNamespace[50];
BSTR bstrNAMESPACE = SysAllocString(L"__NAMESPACE");
BSTR bstrSERVER = SysAllocString(L"__SERVER");
BSTR bstrCLASS = SysAllocString(L"__CLASS");
BSTR bstrIncidentType = SysAllocString(L"IncidentType");
VariantInit(&vType);
VariantInit(&vClass);
VariantInit(&vDisp);
VariantInit(&vName);
VariantInit(&vServ);
TRACE(_T("* IndicateToConsumer() called\n"));
// walk though the classObjects...
for (int i = 0; i < lNumObjects; i++)
{
clMyBuff.Empty();
// Get the server and namespace info
hr = ppObjects[i]->Get(bstrNAMESPACE, 0, &vName, NULL, NULL);
if(FAILED(hr))
TRACE(_T("* Get(__NAMESPACE) Failed\n"));
hr = ppObjects[i]->Get(bstrSERVER, 0, &vServ, NULL, NULL);
if(FAILED(hr))
TRACE(_T("* Get(__SERVER) Failed\n"));
wcscpy(wcServerNamespace, L"\\\\");
wcscat(wcServerNamespace, V_BSTR(&vServ));
wcscat(wcServerNamespace, L"\\");
wcscat(wcServerNamespace, V_BSTR(&vName));
ppObjects[i]->AddRef();
if(FAILED(hr))
TRACE(_T("* ppObjects[i]->AddRef() Failed%s\n"), m_pParent->ErrorString(hr));
// sent the object to CIMOM via the sink
hr = m_pParent->SelfProvideEvent(ppObjects[i], wcServerNamespace, m_bstrIncidentType);
TRACE(_T("* SelfProvideEvent completed %s\n"),
m_pParent->ErrorString(hr));
if(FAILED(hr))
TRACE(_T("* SelfProvideEvent returned badness %s\n"),
m_pParent->ErrorString(hr));
if(SUCCEEDED(hr = ppObjects[i]->Get(bstrCLASS, 0L, &vClass, NULL, NULL)))
{
if(SUCCEEDED(hr = pLogicalConsumer->Get(bstrIncidentType, 0, &vType, NULL, NULL)))
{
// compose a string for the listbox.
clMyBuff = _T("{");
clMyBuff += V_BSTR(&vType);
clMyBuff += _T("} ");
clMyBuff += V_BSTR(&vClass);
if(m_pOutputList->GetCount() > 50)
m_pOutputList->DeleteString(m_pOutputList->GetCount() - 1);
m_pOutputList->InsertString(0, clMyBuff);
}
else
TRACE(_T("* Get(__PATH) Item failed %s\n"),
m_pParent->ErrorString(hr));
}
else
TRACE(_T("* Get(__CLASS) Item failed %s\n"),
m_pParent->ErrorString(hr));
VariantClear(&vType);
VariantClear(&vClass);
VariantClear(&vDisp);
VariantClear(&vName);
VariantClear(&vServ);
} // endfor
SysFreeString(bstrNAMESPACE);
SysFreeString(bstrSERVER);
SysFreeString(bstrCLASS);
SysFreeString(bstrIncidentType);
return WBEM_NO_ERROR;
}