213 lines
5.2 KiB
C++
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;
|
|
} |