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

213 lines
5.2 KiB
C++

// activatesink.cpp: implementation of the CActivateSink class.
//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "msa.h"
#include "activatesink.h"
#include "sinkobject.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CActiveSink::CActiveSink(CMsaApp *pTheApp, IWbemServices *pNamespace, CMsaDlg *dlg)
{
m_pParent = pTheApp;
m_pSampler = pNamespace;
m_dlg = dlg;
}
CActiveSink::~CActiveSink()
{
}
STDMETHODIMP CActiveSink::QueryInterface(REFIID riid, LPVOID FAR *ppv)
{
*ppv=NULL;
if (riid == IID_IUnknown || riid == IID_IWbemObjectSink)
*ppv=this;
if (*ppv != NULL)
{
((LPUNKNOWN)*ppv)->AddRef();
return NOERROR;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CActiveSink::AddRef(void)
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG) CActiveSink::Release(void)
{
if (--m_cRef != 0L)
return m_cRef;
delete this;
return 0L;
}
STDMETHODIMP CActiveSink::Indicate(long lObjectCount, IWbemClassObject **ppObjArray)
{
HRESULT hr;
ULONG uReturned;
VARIANT v;
BSTR bstrTheQuery = SysAllocString(L"SamplerConsumer");
BSTR bstrTarget = SysAllocString(L"ConnectNamespace");
BSTR bstrIncidentType = SysAllocString(L"IncidentType");
BSTR bstrWQL = SysAllocString(L"WQL");
BSTR bstrPwd = SysAllocString(L"Relmas1");
BSTR bstrQuery = SysAllocString(L"Query");
BSTR bstrName;
TRACE(_T("* Activate.Indicate called\n"));
VariantInit(&v);
for(int i = 0; i < lObjectCount; i++)
{
ppObjArray[i]->AddRef();
if(SUCCEEDED(hr = ppObjArray[i]->Get(bstrTarget, 0, &v, NULL, NULL)))
{
IWbemServices *pNamespace = NULL;
IEnumWbemClassObject *pEnum = NULL;
IWbemClassObject *pObj = NULL;
WCHAR wcTemp[50];
char cBuf[50];
DWORD dwSize = 50;
// Parse the user and get it in a consistent format
BSTR bstrNamespace = SysAllocString(V_BSTR(&v));
WCHAR *pwcStart = V_BSTR(&v);
WCHAR *pwcEnd;
BSTR bstrUser;
while(*pwcStart == L'\\')
{ pwcStart++; }
if(*pwcStart == L'.')
{
GetComputerName(cBuf, &dwSize);
MultiByteToWideChar (CP_OEMCP, MB_PRECOMPOSED, cBuf, (-1), wcTemp, 128);
wcscat(wcTemp, L"\\sampler");
bstrUser = SysAllocString(wcTemp);
}
else
{
pwcEnd = pwcStart;
while(*pwcEnd != L'\\')
{ pwcEnd++; }
*pwcEnd = NULL;
wcscat(pwcStart, L"\\sampler");
bstrUser = SysAllocString(pwcStart);
}
bstrName = SysAllocString(V_BSTR(&v));
pNamespace = m_pParent->CheckNamespace(bstrNamespace);
if(pNamespace == NULL)
return WBEM_E_FAILED;
if(FAILED(hr = pNamespace->CreateInstanceEnum(bstrTheQuery, 0, NULL, &pEnum)))
{
TRACE(_T("* Error Querying Enumerated NS: %s\n"), m_pParent->ErrorString(hr));
return WBEM_E_FAILED;
}
m_pParent->SetInterfaceSecurity(pEnum, NULL, bstrUser, bstrPwd);
while(S_OK == (hr = pEnum->Next(INFINITE, 1, &pObj, &uReturned)))
{
VariantClear(&v);
if(SUCCEEDED(hr = pObj->Get(bstrQuery, 0, &v, NULL, NULL)))
{
SysFreeString(bstrTheQuery);
bstrTheQuery = SysAllocString(V_BSTR(&v));
VariantClear(&v);
if(SUCCEEDED(hr = pObj->Get(bstrIncidentType, 0, &v, NULL, NULL)))
{
CSinkObject *pTheSink = new CSinkObject(
&(m_dlg->m_outputList), m_pParent, V_BSTR(&v));
CancelItem *pCI = new CancelItem;
pCI->bstrNamespace = SysAllocString(bstrName);
pCI->pSink = pTheSink;
m_pParent->AddToCancelList((void *)pCI);
if(FAILED(hr = pNamespace->ExecNotificationQueryAsync(
bstrWQL, bstrTheQuery, 0, NULL, pTheSink)))
TRACE(_T("* Activate.ExecNotification Failed: %s\n"), m_pParent->ErrorString(hr));
else
TRACE(_T("* Activate.ExecNotification Succeeded: %s\n"), m_pParent->ErrorString(hr));
}
else
TRACE(_T("* Unable to get IncidentType: %s\n"), m_pParent->ErrorString(hr));
VariantClear(&v);
}
else
TRACE(_T("* Unable to get Query: %s\n"), m_pParent->ErrorString(hr));
VariantClear(&v);
hr = pObj->Release();
}
SysFreeString(bstrNamespace);
SysFreeString(bstrUser);
hr = pEnum->Release();
}
else
TRACE(_T("* Unable to get Namespace: %s\n"), m_pParent->ErrorString(hr));
ppObjArray[i]->Release();
}
SysFreeString(bstrTarget);
SysFreeString(bstrTheQuery);
SysFreeString(bstrWQL);
SysFreeString(bstrPwd);
SysFreeString(bstrName);
SysFreeString(bstrIncidentType);
SysFreeString(bstrQuery);
return WBEM_NO_ERROR;
}
STDMETHODIMP CActiveSink::SetStatus(long lFlags, long lParam, BSTR strParam,
IWbemClassObject* pObjParam)
{
m_hr = lParam;
if(FAILED(m_hr))
TRACE(_T("* rror in CActiveSink.SetStatus() %s\n"),
m_pParent->ErrorString(m_hr));
if(pObjParam)
pObjParam->AddRef();
return WBEM_NO_ERROR;
}