// File: ActionPolicy.inl // // Copyright (c) 2000 Microsoft Corporation // // // 3/20/00 v-marfin : bug 59492 : Create listener when creating action since that is // where the valid "this" object used to SetObjectPtr() is. #ifdef _DEBUG #define new DEBUG_NEW #endif ///////////////////////////////////////////////////////////////////////////// // WMI Operations ///////////////////////////////////////////////////////////////////////////// inline HRESULT CActionPolicy::EnumerateChildren() { TRACEX(_T("CActionPolicy::EnumerateChildren\n")); if( m_pActionListener == NULL ) { m_pActionListener = new CActionConfigListener; m_pActionListener->SetObjectPtr(this); m_pActionListener->Create(); } else { IncrementActiveSinkCount(); } HRESULT hr = S_OK; CString sQuery = IDS_STRING_ACTIONCONFIG_QUERY; IWbemObjectSink* pSink = m_pActionListener->GetSink(); if( !CHECKHRESULT(hr = CnxExecQueryAsync(GetSystemName(),sQuery,pSink)) ) { TRACE(_T("FAILED : CConnectionManager::RegisterEventNotification failed!\n")); } return hr; } ///////////////////////////////////////////////////////////////////////////// // Clipboard Operations ///////////////////////////////////////////////////////////////////////////// inline bool CActionPolicy::Cut() { TRACEX(_T("CActionPolicy::Cut\n")); return false; } inline bool CActionPolicy::Copy() { TRACEX(_T("CActionPolicy::Copy\n")); return false; } inline bool CActionPolicy::Paste() { TRACEX(_T("CActionPolicy::Paste\n")); return false; } ///////////////////////////////////////////////////////////////////////////// // Operations ///////////////////////////////////////////////////////////////////////////// // v-marfin 59492 --------------------------------------- inline CString CActionPolicy::GetObjectPath() { TRACEX(_T("CActionPolicy::GetObjectPath\n")); CString sPath; sPath.Format(IDS_STRING_MOF_OBJECTPATH,IDS_STRING_MOF_HMACTION_STATUS,GetGuid()); return sPath; } //------------------------------------------------------- inline CString CActionPolicy::GetUITypeName() { TRACEX(_T("CActionPolicy::GetUITypeName\n")); CString sTypeName; sTypeName.LoadString(IDS_STRING_ACTION_POLICY); return sTypeName; } ///////////////////////////////////////////////////////////////////////////// // Scope Item Members ///////////////////////////////////////////////////////////////////////////// inline CScopePaneItem* CActionPolicy::CreateScopeItem() { TRACEX(_T("CActionPolicy::CreateScopeItem\n")); CActionPolicyScopeItem * pNewItem = new CActionPolicyScopeItem; pNewItem->SetObjectPtr(this); return pNewItem; } ///////////////////////////////////////////////////////////////////////////// // New Child Creation Members ///////////////////////////////////////////////////////////////////////////// inline bool CActionPolicy::CreateChild(CHMObject* pObject, const CString& sWMIClassName, const CString& sWMIAssociatorClassName) { TRACEX(_T("CActionPolicy::CreateChild\n")); TRACEARGn(pObject); TRACEARGs(sWMIClassName); TRACEARGs(sWMIAssociatorClassName); if( ! GfxCheckObjPtr(pObject,CAction) ) { return false; } pObject->SetSystemName(GetSystemName()); // create the GUID GUID ChildGuid; CoCreateGuid(&ChildGuid); OLECHAR szGuid[GUID_CCH]; ::StringFromGUID2(ChildGuid, szGuid, GUID_CCH); CString sGuid = OLE2CT(szGuid); pObject->SetGuid(sGuid); // Add Child to this parent AddChild(pObject); // create child instance CWbemClassObject ChildClassObject; if( ! CHECKHRESULT(ChildClassObject.Create(GetSystemName())) ) { return false; } BSTR bsTemp = sWMIClassName.AllocSysString(); if( ! CHECKHRESULT(ChildClassObject.CreateInstance(bsTemp)) ) { ::SysFreeString(bsTemp); return false; } ::SysFreeString(bsTemp); // Save the child instance properties for name, guid and typeguid ChildClassObject.SetProperty(IDS_STRING_MOF_NAME,pObject->GetName()); ChildClassObject.SetProperty(IDS_STRING_MOF_GUID,sGuid); ChildClassObject.SetProperty(IDS_STRING_MOF_TYPEGUID,((CAction*)pObject)->GetTypeGuid()); // for the action type we must create an instance of the standard event consumer as well // and we must associate the event consumer instance to the ActionConfiguration instance. CString sConsumerClassName = ((CAction*)pObject)->GetConsumerClassName(); CWbemClassObject EventConsumerObject; if( ! CHECKHRESULT(EventConsumerObject.Create(GetSystemName())) ) { return false; } bsTemp = sConsumerClassName.AllocSysString(); if( ! CHECKHRESULT(EventConsumerObject.CreateInstance(bsTemp)) ) { ::SysFreeString(bsTemp); return false; } ::SysFreeString(bsTemp); // the name of the event consumer will match the GUID of the HMActionConfiguration EventConsumerObject.SetProperty(IDS_STRING_MOF_NAME, _T("{") + pObject->GetGuid() + _T("}")); // commit the changes to WMI EventConsumerObject.SaveAllProperties(); CString sEventConsumerPath; sEventConsumerPath.Format(_T("\\\\.\\root\\cimv2\\MicrosoftHealthmonitor:%s.Name=\"{%s}\""),sConsumerClassName,pObject->GetGuid()); ChildClassObject.SetProperty(IDS_STRING_MOF_EVENTCONSUMER,sEventConsumerPath); // commit the changes to WMI ChildClassObject.SaveAllProperties(); //ERICVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV // // create the __EventFilter instance and fill out the query // CWbemClassObject EventFilter; EventFilter.Create(GetSystemName()); BSTR bsEventFilter = ::SysAllocString(L"__EventFilter"); if( ! CHECKHRESULT(EventFilter.CreateInstance(bsEventFilter)) ) { ::SysFreeString(bsEventFilter); return false; } ::SysFreeString(bsEventFilter); // create the GUID // GUID ChildGuid; // CoCreateGuid(&ChildGuid); // OLECHAR szGuid[GUID_CCH]; // ::StringFromGUID2(ChildGuid, szGuid, GUID_CCH); // CString sGuid = OLE2CT(szGuid); EventFilter.SetProperty(_T("Name"),sGuid); EventFilter.SetProperty(_T("QueryLanguage"),CString(_T("WQL"))); // set event filter query to ActionStatus creation event CString sQuery; sQuery.Format(IDS_STRING_HMACTIONSTATUS_QUERY_FMT,sGuid); EventFilter.SetProperty(_T("Query"),sQuery); EventFilter.SaveAllProperties(); // // create the __FilterToConsumerBinding instance and fill out the paths // CWbemClassObject FilterToConsumerBinding; FilterToConsumerBinding.Create(GetSystemName()); BSTR bsFTCB = ::SysAllocString(L"__FilterToConsumerBinding"); if( ! CHECKHRESULT(FilterToConsumerBinding.CreateInstance(bsFTCB)) ) { ::SysFreeString(bsFTCB); return false; } ::SysFreeString(bsFTCB); FilterToConsumerBinding.SetProperty(_T("Consumer"),sEventConsumerPath); CString sEventFilterPath; sEventFilterPath.Format(_T("\\\\.\\root\\cimv2\\MicrosoftHealthmonitor:__EventFilter.Name=\"%s\""),sGuid); FilterToConsumerBinding.SetProperty(_T("Filter"),sEventFilterPath); FilterToConsumerBinding.SaveAllProperties(); //ERIC^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ return true; } inline void CActionPolicy::CreateNewChildAction(int iType) { TRACEX(_T("CActionPolicy::CreateNewChildAction\n")); CAction* pNewAction = new CAction; // v-marfin : bug 59492 : Create listener when creating action since that is // where the valid "this" object used to SetObjectPtr() is. if( ! pNewAction->m_pActionStatusListener ) { pNewAction->m_pActionStatusListener = new CActionStatusListener; pNewAction->m_pActionStatusListener->SetObjectPtr(this); pNewAction->m_pActionStatusListener->Create(); } switch( iType ) { case IDM_ACTION_CMDLINE: { pNewAction->SetName(GetUniqueChildName(IDS_STRING_ACTION_CMDLINE_FMT)); pNewAction->SetTypeGuid(IDS_STRING_MOF_HMAT_CMDLINE); CreateChild(pNewAction,IDS_STRING_MOF_HMA_CONFIG,_T("")); } break; case IDM_ACTION_EMAIL: { pNewAction->SetName(GetUniqueChildName(IDS_STRING_ACTION_EMAIL_FMT)); pNewAction->SetTypeGuid(IDS_STRING_MOF_HMAT_EMAIL); CreateChild(pNewAction,IDS_STRING_MOF_HMA_CONFIG,_T("")); } break; case IDM_ACTION_LOGFILE: { pNewAction->SetName(GetUniqueChildName(IDS_STRING_ACTION_LOGFILE_FMT)); pNewAction->SetTypeGuid(IDS_STRING_MOF_HMAT_TEXTLOG); CreateChild(pNewAction,IDS_STRING_MOF_HMA_CONFIG,_T("")); } break; case IDM_ACTION_NTEVENT: { pNewAction->SetName(GetUniqueChildName(IDS_STRING_ACTION_NTEVENT_FMT)); pNewAction->SetTypeGuid(IDS_STRING_MOF_HMAT_NTEVENT); CreateChild(pNewAction,IDS_STRING_MOF_HMA_CONFIG,_T("")); } break; case IDM_ACTION_SCRIPT: { pNewAction->SetName(GetUniqueChildName(IDS_STRING_ACTION_SCRIPT_FMT)); pNewAction->SetTypeGuid(IDS_STRING_MOF_HMAT_SCRIPT); CreateChild(pNewAction,IDS_STRING_MOF_HMA_CONFIG,_T("")); } break; case IDM_ACTION_PAGING: { pNewAction->SetName(GetUniqueChildName(IDS_STRING_ACTION_PAGING_FMT)); pNewAction->SetTypeGuid(IDS_STRING_MOF_HMAT_PAGING); CreateChild(pNewAction,IDS_STRING_MOF_HMA_CONFIG,_T("")); } break; } if( pNewAction->GetScopeItemCount() ) { CScopePaneItem* pItem = pNewAction->GetScopeItem(0); if( pItem ) { pItem->SelectItem(); pItem->InvokePropertySheet(); } } }