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

349 lines
8.8 KiB
C++

// **************************************************************************
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
// File: OnPerm.cpp
//
// Description:
// This file implements the register/unregister of permenant
// event consumers. The actual consumer is the WBEMPermEvents
// project.
//
// History:
//
// **************************************************************************
#include "stdafx.h"
#include "AdvClientDlg.h"
#include <tchar.h>
// my specific class GUID.
// {1E069401-087E-11d1-AD85-00AA00B8E05A}
static const GUID CLSID_AdvClientConsumer =
{ 0x1e069401, 0x87e, 0x11d1, { 0xad, 0x85, 0x0, 0xaa, 0x0, 0xb8, 0xe0, 0x5a } };
// ========================================================
BOOL CAdvClientDlg::PermRegistered()
{
HRESULT hRes;
BOOL retval = FALSE;
IWbemClassObject *pConsumerInst = NULL;
BSTR instName = SysAllocString(L"__EventFilter.Name=\"Sample Perm Query\"");
// switch to the root\cimv2\office namespace.
if(EnsureOfficeNamespace())
{
// if the EventFilter is there...
if((hRes = m_pOfficeService->GetObject(instName,
0L, NULL,
&pConsumerInst,
NULL)) == S_OK)
{
pConsumerInst->Release();
pConsumerInst = NULL;
// assume the perm sink is registered.
retval = TRUE;
}
}
SysFreeString(instName);
return retval;
}
// ========================================================
BOOL CAdvClientDlg::OnPermRegister()
{
BOOL retval = FALSE;
IWbemClassObject *pConsumer = NULL;
IWbemClassObject *pFilter = NULL;
m_eventList.ResetContent();
// switch to the root\cimv2\office namespace.
if(EnsureOfficeNamespace())
{
if(GetConsumer(&pConsumer))
{
if(AddFilter(&pFilter))
{
if(AddBinding(pConsumer, pFilter))
{
retval = TRUE;
m_eventList.AddString(_T("Permanent is ready"));
}
else
{
m_eventList.AddString(_T("Failed To Register"));
} //endif AddBinding()
}
else
{
} //endif AddFilter()
}
else
{
} //endif AddConsumer()
}
return retval;
}
// ========================================================
void CAdvClientDlg::OnPermUnregister()
{
HRESULT hRes;
BSTR instName;
if(EnsureOfficeNamespace())
{
// delete the filter instance.
instName = SysAllocString(L"__EventFilter.Name=\"Sample Perm Query\"");
if((hRes = m_pOfficeService->DeleteInstance(instName,
0L, NULL,
NULL)) != S_OK)
{
TRACE(_T("Cant delete filter, %s\n"), ErrorString(hRes));
}
SysFreeString(instName);
// delete the association instance.
// NOTE: Remember the triple backslashes on the inner quotes.
instName = SysAllocString(L"__FilterToConsumerBinding.Consumer=\"SampleViewerConsumer.Name=\\\"Sample says:\\\"\",Filter=\"__EventFilter.Name=\\\"Sample Perm Query\\\"\"");
if((hRes = m_pOfficeService->DeleteInstance(instName,
0L, NULL,
NULL)) != S_OK)
{
TRACE(_T("Cant delete association, %s\n"), ErrorString(hRes));
}
SysFreeString(instName);
}
m_eventList.ResetContent();
m_eventList.AddString(_T("Permanent is removed"));
}
//------------------------------------------------------------
BOOL CAdvClientDlg::GetConsumer(IWbemClassObject **ppConsumer)
{
BOOL retval = FALSE;
HRESULT hRes;
BSTR curInst;
CString str(L"SampleViewerConsumer.Name=\"Sample says:\"");
// CString ConsumerCLSID(L"{1E069401-087E-11d1-AD85-00AA00B8E05A}");
curInst = str.AllocSysString();
//---------------------
if((hRes = m_pOfficeService->GetObject(curInst, 0L, NULL,
ppConsumer, NULL)) == S_OK)
{
retval = TRUE;
}
else
{
TRACE(_T("Second GetObject() pConsumerInst failed: %s\n"), ErrorString(hRes));
} //endif GetObject()
SysFreeString(curInst);
return retval;
}
// ========================================================
BOOL CAdvClientDlg::AddFilter(IWbemClassObject **ppFilter)
{
BOOL retval = FALSE;
CString FilterName(_T("Sample Perm Query"));
CString FilterClass(L"__EventFilter");
CString FilterClassKey(L"Name");
CString QueryProp(L"Query");
CString LangProp(L"QueryLanguage");
CString theQuery(L"select * from __InstanceCreationEvent where TargetInstance isa \"SAMPLE_OfficeEquipment\"");
BSTR FilterClassName = FilterClass.AllocSysString();
BSTR Prop = NULL;
BSTR curInst = NULL;
IWbemClassObject *pFilterClass = NULL;
IWbemClassObject *pFilterInst = NULL;
HRESULT hRes;
VARIANT v;
//---------------------
// if class exists...
if((hRes = m_pOfficeService->GetObject(FilterClassName,
0L, NULL,
&pFilterClass,
NULL)) == S_OK)
{
//---------------------
// spawn a new instance
if((hRes = pFilterClass->SpawnInstance(0, &pFilterInst)) == S_OK)
{
TRACE(_T("SpawnInstance() worked\n"));
// set the key property.
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = FilterName.AllocSysString();
Prop = FilterClassKey.AllocSysString();
pFilterInst->Put(Prop, 0, &v, 0);
VariantClear(&v);
SysFreeString(Prop);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = theQuery.AllocSysString();
Prop = QueryProp.AllocSysString();
pFilterInst->Put(Prop, 0, &v, 0);
VariantClear(&v);
SysFreeString(Prop);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = SysAllocString(L"WQL");
Prop = LangProp.AllocSysString();
pFilterInst->Put(Prop, 0, &v, 0);
VariantClear(&v);
SysFreeString(Prop);
//---------------------
// putInstance
hRes = m_pOfficeService->PutInstance(pFilterInst, 0, NULL, NULL);
pFilterInst->Release();
pFilterInst = NULL;
CString str = FilterClass + _T(".") + FilterClassKey;
str += _T("=\"");
str += FilterName;
str += _T("\"");
curInst = str.AllocSysString();
TRACE(_T("flushing instance for %s\n"), str);
//---------------------
if((hRes = m_pOfficeService->GetObject(curInst, 0L, NULL,
ppFilter, NULL)) == S_OK)
{
retval = TRUE;
}
else
{
TRACE(_T("Second GetObject() pFilterInst failed: %s\n"), ErrorString(hRes));
} //endif GetObject()
SysFreeString(curInst);
}
else
{
TRACE(_T("SpawnInstance() failed: %s\n"), ErrorString(hRes));
} //endif SpawnInstance()
pFilterClass->Release(); // Don't need the class any more
pFilterClass = NULL;
} // endif class doesnt exist.
SysFreeString(FilterClassName);
return retval;
}
// ========================================================
BOOL CAdvClientDlg::AddBinding(IWbemClassObject *pConsumer,
IWbemClassObject *pFilter)
{
BOOL retval = FALSE;
HRESULT hRes;
VARIANT v;
IWbemClassObject *pAClass = NULL;
IWbemClassObject *pAInst = NULL;
BSTR AssocClassName = SysAllocString(L"__FilterToConsumerBinding");
BSTR ConsumerProp = SysAllocString(L"Consumer");
BSTR FilterProp = SysAllocString(L"Filter");
VariantInit(&v);
// if association class exists...
if((hRes = m_pOfficeService->GetObject(AssocClassName,
0L, NULL,
&pAClass,
NULL)) == S_OK)
{
//------------------------------
// spawn a new instance.
if((hRes = pAClass->SpawnInstance(0, &pAInst)) == S_OK)
{
TRACE(_T("Assoc SpawnInstance() worked\n"));
BSTR PathProp = SysAllocString(L"__RELPATH");
//-----------------------------------
// set consumer instance name
if ((hRes = pConsumer->Get(PathProp, 0L,
&v, NULL, NULL)) == S_OK)
{
hRes = pAInst->Put(ConsumerProp, 0, &v, 0);
TRACE(_T("Got Consumer ref: %s\n"), ErrorString(hRes));
VariantClear(&v);
}
else
{
TRACE(_T("Get() consumer ref failed: %s\n"), ErrorString(hRes));
} //endif Get()
//-----------------------------------
// set Filter ref
if ((hRes = pFilter->Get(PathProp, 0L,
&v, NULL, NULL)) == S_OK)
{
hRes = pAInst->Put(FilterProp, 0, &v, 0);
TRACE(_T("Got filter ref: %s\n"), ErrorString(hRes));
VariantClear(&v);
}
else
{
TRACE(_T("Get() filter ref failed: %s\n"), ErrorString(hRes));
} //endif Get()
SysFreeString(PathProp);
//-----------------------------------
// putInstance
if((hRes = m_pOfficeService->PutInstance(pAInst, WBEM_FLAG_CREATE_OR_UPDATE, NULL, NULL)) == S_OK)
{
retval = TRUE;
}
else
{
TRACE(_T("PutInstance() __FilterToConsumerBinding failed: %s\n"), ErrorString(hRes));
}
pAInst->Release();
pAInst = NULL;
}
else
{
TRACE(_T("SpawnInstance() failed: %s\n"), ErrorString(hRes));
} //endif SpawnInstance()
}
else
{
TRACE(_T("GetObject() class failed: %s\n"), ErrorString(hRes));
} // endif GetObject() class.
if(pAClass)
{
pAClass->Release();
pAClass = NULL;
}
SysFreeString(AssocClassName);
SysFreeString(ConsumerProp);
SysFreeString(FilterProp);
return retval;
}