Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1542 lines
37 KiB

  1. // 04/09/00 v-marfin 63119 : converted m_iCurrent to string
  2. #ifdef _DEBUG
  3. #define new DEBUG_NEW
  4. #endif
  5. //////////////////////////////////////////////////////////////////////
  6. // Operations
  7. //////////////////////////////////////////////////////////////////////
  8. inline void CEventManager::ProcessEvent(CWbemClassObject* pEventObject)
  9. {
  10. if( pEventObject == NULL )
  11. {
  12. ASSERT(FALSE);
  13. return;
  14. }
  15. if( pEventObject->GetMachineName().IsEmpty() )
  16. {
  17. ASSERT(FALSE);
  18. return;
  19. }
  20. // three possible flavors of events
  21. // - threshold
  22. // - data collector
  23. // - everything else
  24. EventArray SystemEvents;
  25. CString sClass;
  26. pEventObject->GetClassName(sClass);
  27. if( ! sClass.CompareNoCase(_T("Microsoft_HMThresholdStatusInstance")) )
  28. {
  29. ProcessRuleStatusInstanceEvent(pEventObject,SystemEvents);
  30. }
  31. else if( ! sClass.CompareNoCase(_T("Microsoft_HMThresholdStatus")) )
  32. {
  33. ProcessRuleStatusEvent(pEventObject);
  34. }
  35. else if( ! sClass.CompareNoCase(_T("Microsoft_HMDataCollectorStatus")) )
  36. {
  37. ProcessDataElementStatusEvent(pEventObject,SystemEvents);
  38. }
  39. else if( ! sClass.CompareNoCase(_T("Microsoft_HMDataGroupStatus")) )
  40. {
  41. ProcessDataGroupStatusEvent(pEventObject);
  42. }
  43. else if( ! sClass.CompareNoCase(_T("Microsoft_HMSystemStatus")) )
  44. {
  45. ProcessSystemStatusEvent(pEventObject);
  46. }
  47. else if( ! sClass.CompareNoCase(_T("Microsoft_HMDataCollectorStatistics")) )
  48. {
  49. ProcessStatisticEvent(pEventObject);
  50. }
  51. else
  52. {
  53. return;
  54. }
  55. // propogate these events up to the root system group event container
  56. CTreeNode<CEventContainer*>* pSystemNode = NULL;
  57. if( ! m_SystemNameToContainerMap.Lookup(pEventObject->GetMachineName(),pSystemNode) )
  58. {
  59. ASSERT(FALSE);
  60. return;
  61. }
  62. CTreeNode<CEventContainer*>* pParentNode = pSystemNode->GetParent();
  63. while(pParentNode)
  64. {
  65. CEventContainer* pContainer = pParentNode->GetObject();
  66. ASSERT(pContainer);
  67. if( pContainer )
  68. {
  69. pContainer->AddEvents(SystemEvents);
  70. }
  71. pParentNode = pParentNode->GetParent();
  72. }
  73. // also propogate to associated nodes of the system
  74. for( int i = 0; i < pSystemNode->GetAssocCount(); i++ )
  75. {
  76. CTreeNode<CEventContainer*>* pAssocNode = pSystemNode->GetAssoc(i);
  77. if( pAssocNode )
  78. {
  79. CEventContainer* pContainer = pAssocNode->GetObject();
  80. if( pContainer )
  81. {
  82. pContainer->AddEvents(SystemEvents);
  83. pParentNode = pAssocNode->GetParent();
  84. while(pParentNode)
  85. {
  86. CEventContainer* pContainer = pParentNode->GetObject();
  87. ASSERT(pContainer);
  88. if( pContainer )
  89. {
  90. pContainer->AddEvents(SystemEvents);
  91. }
  92. pParentNode = pParentNode->GetParent();
  93. }
  94. }
  95. }
  96. }
  97. }
  98. inline void CEventManager::ProcessUnknownEvent(const CString& sSystemName, CRuleEvent* pUnknownEvent)
  99. {
  100. if( sSystemName.IsEmpty() )
  101. {
  102. return;
  103. }
  104. if( ! pUnknownEvent )
  105. {
  106. return;
  107. }
  108. // add event to the system container
  109. CTreeNode<CEventContainer*>* pSystemNode = NULL;
  110. if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pSystemNode) )
  111. {
  112. ASSERT(FALSE);
  113. return;
  114. }
  115. CEventContainer* pContainer = pSystemNode->GetObject();
  116. if( ! pContainer )
  117. {
  118. return;
  119. }
  120. pContainer->AddEvent(pUnknownEvent);
  121. pContainer->m_iState = 6;
  122. // propogate these events up to the root system group event container
  123. CTreeNode<CEventContainer*>* pParentNode = pSystemNode->GetParent();
  124. while(pParentNode)
  125. {
  126. CEventContainer* pContainer = pParentNode->GetObject();
  127. ASSERT(pContainer);
  128. if( pContainer )
  129. {
  130. pContainer->AddEvent(pUnknownEvent);
  131. pContainer->m_iState = 6;
  132. }
  133. pParentNode = pParentNode->GetParent();
  134. }
  135. // also propogate to associated nodes of the system
  136. for( int i = 0; i < pSystemNode->GetAssocCount(); i++ )
  137. {
  138. CTreeNode<CEventContainer*>* pAssocNode = pSystemNode->GetAssoc(i);
  139. if( pAssocNode )
  140. {
  141. CEventContainer* pContainer = pAssocNode->GetObject();
  142. if( pContainer )
  143. {
  144. pContainer->AddEvent(pUnknownEvent);
  145. pParentNode = pAssocNode->GetParent();
  146. while(pParentNode)
  147. {
  148. CEventContainer* pContainer = pParentNode->GetObject();
  149. ASSERT(pContainer);
  150. if( pContainer )
  151. {
  152. pContainer->AddEvent(pUnknownEvent);
  153. pContainer->m_iState = 6;
  154. }
  155. pParentNode = pParentNode->GetParent();
  156. }
  157. }
  158. }
  159. }
  160. }
  161. inline void CEventManager::ProcessActionEvent(CWbemClassObject* pActionEventObject)
  162. {
  163. if( pActionEventObject == NULL )
  164. {
  165. ASSERT(FALSE);
  166. return;
  167. }
  168. // Config Guid
  169. CString sGuid;
  170. HRESULT hr = pActionEventObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
  171. CHECKHRESULT(hr);
  172. sGuid.TrimLeft(_T("{"));
  173. sGuid.TrimRight(_T("}"));
  174. // find the action container node by its guid
  175. CEventContainer* pContainer = NULL;
  176. GetEventContainer(pActionEventObject->GetMachineName(),sGuid,pContainer);
  177. if( pContainer == NULL )
  178. {
  179. ASSERT(FALSE);
  180. return;
  181. }
  182. CString sClass;
  183. hr = pActionEventObject->GetClassName(sClass);
  184. if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMActionStatus")) != 0 )
  185. {
  186. ASSERT(FALSE);
  187. return;
  188. }
  189. EventArray DataGroupEvents;
  190. // GUID
  191. pContainer->m_sConfigurationGuid = sGuid;
  192. // Name
  193. CString sName;
  194. hr = pActionEventObject->GetLocaleStringProperty(IDS_STRING_MOF_NAME,sName);
  195. CHECKHRESULT(hr);
  196. // NumberNormals
  197. hr = pActionEventObject->GetProperty(IDS_STRING_MOF_NUMBERNORMALS,pContainer->m_iNumberNormals);
  198. CHECKHRESULT(hr);
  199. // NumberWarnings
  200. hr = pActionEventObject->GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,pContainer->m_iNumberWarnings);
  201. CHECKHRESULT(hr);
  202. // NumberCriticals
  203. hr = pActionEventObject->GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,pContainer->m_iNumberCriticals);
  204. CHECKHRESULT(hr);
  205. // State
  206. hr = pActionEventObject->GetProperty(IDS_STRING_MOF_STATE,pContainer->m_iState);
  207. CHECKHRESULT(hr);
  208. // v-marfin 59492 ---------------------------------------------------------------------
  209. CHECKHRESULT(hr);
  210. if( pContainer->GetObjectPtr() )
  211. {
  212. pContainer->GetObjectPtr()->SetState(CEvent::GetStatus(pContainer->m_iState),true);
  213. }
  214. //--------------------------------------------------------------------------------------
  215. }
  216. inline void CEventManager::ProcessStatisticEvent(CWbemClassObject* pStatObject)
  217. {
  218. if( ! pStatObject )
  219. {
  220. ASSERT(FALSE);
  221. return;
  222. }
  223. CString sClass;
  224. HRESULT hr = pStatObject->GetClassName(sClass);
  225. if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMDataCollectorStatistics")) != 0 )
  226. {
  227. ASSERT(FALSE);
  228. return;
  229. }
  230. // Config Guid
  231. CString sGuid;
  232. hr = pStatObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
  233. CHECKHRESULT(hr);
  234. if( sGuid.IsEmpty() )
  235. {
  236. ASSERT(FALSE);
  237. return;
  238. }
  239. sGuid.TrimLeft(_T("{"));
  240. sGuid.TrimRight(_T("}"));
  241. // find the data element container node with the appropriate Guid
  242. // this must exist to continue processing
  243. CEventContainer* pContainer = NULL;
  244. GetEventContainer(pStatObject->GetMachineName(),sGuid,pContainer);
  245. if( pContainer == NULL )
  246. {
  247. ASSERT(FALSE);
  248. return;
  249. }
  250. CDataPointStatistics* pDPStat = new CDataPointStatistics;
  251. StatsArray Statistics;
  252. // DTime
  253. CTime time;
  254. hr = pStatObject->GetProperty(IDS_STRING_MOF_LOCALTIME,time);
  255. time.GetAsSystemTime(pDPStat->m_st);
  256. // PropertyName
  257. hr = pStatObject->GetProperty(IDS_STRING_MOF_PROPERTYNAME,pDPStat->m_sPropertyName);
  258. CString sValue;
  259. // InstanceName
  260. hr = pStatObject->GetProperty(IDS_STRING_MOF_INSTANCENAME,pDPStat->m_sInstanceName);
  261. // CurrentValue
  262. // 63119 hr = pStatObject->GetProperty(IDS_STRING_MOF_CURRENTVALUE,sValue);
  263. // 63119 pDPStat->m_iCurrent = _ttoi(sValue);
  264. hr = pStatObject->GetProperty(IDS_STRING_MOF_CURRENTVALUE,pDPStat->m_strCurrent);
  265. // MinValue
  266. hr = pStatObject->GetProperty(IDS_STRING_MOF_MINVALUE,sValue);
  267. pDPStat->m_iMin = _ttoi(sValue);
  268. // MaxValue
  269. hr = pStatObject->GetProperty(IDS_STRING_MOF_MAXVALUE,sValue);
  270. pDPStat->m_iMax = _ttoi(sValue);
  271. // AvgValue
  272. hr = pStatObject->GetProperty(IDS_STRING_MOF_AVGVALUE,sValue);
  273. pDPStat->m_iAvg = _ttoi(sValue);
  274. Statistics.Add(pDPStat);
  275. PropogateStatisticsToChildren(pStatObject->GetMachineName(),sGuid,Statistics);
  276. pContainer->AddStatistics(Statistics);
  277. }
  278. inline void CEventManager::GetEventContainer(const CString& sSystemName, const CString& sGuid, CEventContainer*& pContainer)
  279. {
  280. // get a container beneath a system - Guid is filled out and SystemName is filled out
  281. // get a container above a system - SystemName is blank and Guid is filled out
  282. // get a container for a system - System Name is filled out and Guid is empty
  283. CTreeNode<CEventContainer*>* pNode = NULL;
  284. if( ! sGuid.IsEmpty() && sGuid != _T("@") )
  285. {
  286. if( ! m_GuidToContainerMap.Lookup(sGuid,pNode) )
  287. {
  288. if( sSystemName.IsEmpty() )
  289. {
  290. ASSERT(FALSE);
  291. pContainer = NULL;
  292. return;
  293. }
  294. if( ! m_GuidToContainerMap.Lookup(GetCompositeGuid(sSystemName,sGuid),pNode) )
  295. {
  296. pContainer = NULL;
  297. return;
  298. }
  299. }
  300. pContainer = pNode->GetObject();
  301. ASSERT(pContainer);
  302. if( pContainer->m_sConfigurationGuid != sGuid )
  303. {
  304. ASSERT(FALSE);
  305. pContainer = NULL;
  306. }
  307. }
  308. else if( ! sSystemName.IsEmpty() )
  309. {
  310. if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pNode) )
  311. {
  312. ASSERT(FALSE);
  313. return;
  314. }
  315. pContainer = pNode->GetObject();
  316. ASSERT(pContainer);
  317. }
  318. }
  319. inline void CEventManager::DeleteEvents(const CString& sSystemName, const CString& sStatusGuid)
  320. {
  321. ASSERT(!sSystemName.IsEmpty());
  322. if( sSystemName.IsEmpty() )
  323. {
  324. return;
  325. }
  326. DeleteEvents(m_EventContainers.GetRootNode(),sSystemName,sStatusGuid);
  327. CTreeNode<CEventContainer*>* pSystemNode = NULL;
  328. if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pSystemNode) )
  329. {
  330. ASSERT(FALSE);
  331. return;
  332. }
  333. ASSERT(pSystemNode);
  334. if( ! pSystemNode )
  335. {
  336. ASSERT(FALSE);
  337. return;
  338. }
  339. CEventContainer* pContainer = pSystemNode->GetObject();
  340. if( ! pContainer )
  341. {
  342. ASSERT(FALSE);
  343. return;
  344. }
  345. if( sStatusGuid.IsEmpty() )
  346. {
  347. pContainer->DeleteSystemEvents(sSystemName);
  348. }
  349. else
  350. {
  351. pContainer->DeleteEvent(sStatusGuid);
  352. }
  353. }
  354. inline void CEventManager::DeleteEvents(CTreeNode<CEventContainer*>* pNode,const CString& sSystemName, const CString& sStatusGuid)
  355. {
  356. ASSERT(pNode);
  357. if( pNode == NULL )
  358. {
  359. return;
  360. }
  361. CEventContainer* pContainer = pNode->GetObject();
  362. ASSERT(pContainer);
  363. if( pContainer == NULL )
  364. {
  365. return;
  366. }
  367. ASSERT(!sSystemName.IsEmpty());
  368. // skip over this node if it is the system node
  369. CTreeNode<CEventContainer*>* pSystemNode = NULL;
  370. m_SystemNameToContainerMap.Lookup(sSystemName,pSystemNode);
  371. if( pSystemNode != pNode )
  372. {
  373. // if status guid is filled out, then delete only the event which corresponds to it
  374. // if the system name is filled out and status guid is not, then delete all the events for the system
  375. if( ! sStatusGuid.IsEmpty() )
  376. {
  377. pContainer->DeleteEvent(sStatusGuid);
  378. }
  379. else if( ! sSystemName.IsEmpty() )
  380. {
  381. pContainer->DeleteSystemEvents(sSystemName);
  382. }
  383. else
  384. {
  385. ASSERT(FALSE);
  386. }
  387. }
  388. for( int i = 0; i < pNode->GetChildCount(); i++ )
  389. {
  390. DeleteEvents(pNode->GetChild(i),sSystemName,sStatusGuid);
  391. }
  392. }
  393. inline void CEventManager::AddContainer(const CString& sSystemName, const CString& sParentGuid, const CString& sGuid, CHMObject* pObject, CRuntimeClass* pClass)
  394. {
  395. ASSERT(pClass);
  396. if( ! pClass )
  397. {
  398. return;
  399. }
  400. ASSERT(!sGuid.IsEmpty());
  401. if( sGuid.IsEmpty() )
  402. {
  403. return;
  404. }
  405. // we could be adding a system group - systemname == NULL, parentguid could be null, sguid valid
  406. // we could be adding something below a system - systemname valid, parentguid == "@" or is valid, sguid valid
  407. CString _sGuid = sGuid;
  408. CString _sParentGuid = sParentGuid;
  409. if( ! sSystemName.IsEmpty() && ! sParentGuid.IsEmpty() && ! sGuid.IsEmpty() )
  410. {
  411. _sGuid = GetCompositeGuid(sSystemName,sGuid);
  412. _sParentGuid = GetCompositeGuid(sSystemName,sParentGuid);
  413. }
  414. // first check if the container already exists
  415. CTreeNode<CEventContainer*>* pExistingNode = NULL;
  416. // if it exists, return
  417. if( m_GuidToContainerMap.Lookup(_sGuid,pExistingNode) )
  418. {
  419. ASSERT(pExistingNode);
  420. ASSERT(pExistingNode->GetObject());
  421. if( pExistingNode->GetObject() && pExistingNode->GetObject()->GetObjectPtr() == NULL )
  422. {
  423. pExistingNode->GetObject()->SetObjectPtr(pObject);
  424. }
  425. return;
  426. }
  427. // if the parent guid is filled out, then query for the parent node. It must exist to continue.
  428. CTreeNode<CEventContainer*>* pParentNode = NULL;
  429. if( ! sParentGuid.IsEmpty() )
  430. {
  431. if( ! m_GuidToContainerMap.Lookup(_sParentGuid,pParentNode) )
  432. {
  433. ASSERT(sParentGuid == _T("@"));
  434. if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pParentNode) )
  435. {
  436. ASSERT(FALSE);
  437. return;
  438. }
  439. }
  440. ASSERT(pParentNode);
  441. if( pParentNode == NULL )
  442. {
  443. return;
  444. }
  445. }
  446. // if the container with guid does not exist then
  447. // create a new Node in the tree, NewNode
  448. // create a new event container and associate it with NewNode
  449. // if the node to add has a parent (parentguid filled out) then
  450. // add NewNode as child of ParentNode
  451. // else if the node has no parent then
  452. // set the NewNode to be the RootNode of the EventContainer tree
  453. // add the GUID,Node key-value pair to the container map
  454. CTreeNode<CEventContainer*>* pNewNode = new CTreeNode<CEventContainer*>;
  455. CEventContainer* pNewContainer = (CEventContainer*)pClass->CreateObject();
  456. pNewContainer->m_sConfigurationGuid = sGuid;
  457. pNewContainer->SetObjectPtr(pObject);
  458. pNewNode->SetObject(pNewContainer);
  459. if( pParentNode )
  460. {
  461. pParentNode->AddChild(pNewNode);
  462. pNewNode->SetParent(pParentNode);
  463. }
  464. else
  465. {
  466. ASSERT( m_EventContainers.GetRootNode() == NULL);
  467. if( m_EventContainers.GetRootNode() != NULL )
  468. {
  469. delete pNewNode;
  470. delete pNewContainer;
  471. return;
  472. }
  473. pNewNode->SetParent(NULL);
  474. m_EventContainers.SetRootNode(pNewNode);
  475. }
  476. m_GuidToContainerMap.SetAt(_sGuid,pNewNode);
  477. }
  478. inline void CEventManager::RemoveContainer(const CString& sSystemName, const CString& sGuid)
  479. {
  480. ASSERT(!sGuid.IsEmpty());
  481. if( sGuid.IsEmpty() )
  482. {
  483. return;
  484. }
  485. // first check if the container exists
  486. CTreeNode<CEventContainer*>* pExistingNode = NULL;
  487. // if it exists, delete it and remove the key from the guid to container map
  488. // try the normal guid
  489. if( m_GuidToContainerMap.Lookup(sGuid,pExistingNode) )
  490. {
  491. ASSERT(pExistingNode);
  492. ASSERT(pExistingNode->GetObject());
  493. if( pExistingNode )
  494. {
  495. if( pExistingNode == m_EventContainers.GetRootNode() )
  496. {
  497. m_EventContainers.SetRootNode(NULL);
  498. }
  499. delete pExistingNode;
  500. m_GuidToContainerMap.RemoveKey(sGuid);
  501. }
  502. return;
  503. }
  504. // try the composite guid
  505. if( m_GuidToContainerMap.Lookup(GetCompositeGuid(sSystemName,sGuid),pExistingNode) )
  506. {
  507. ASSERT(pExistingNode);
  508. ASSERT(pExistingNode->GetObject());
  509. if( pExistingNode )
  510. {
  511. delete pExistingNode;
  512. m_GuidToContainerMap.RemoveKey(sGuid);
  513. }
  514. return;
  515. }
  516. ASSERT(FALSE); // did not find it
  517. }
  518. inline void CEventManager::AddSystemContainer(const CString& sParentGuid, const CString& sSystemName, CHMObject* pObject)
  519. {
  520. // parent guid must be filled out to continue
  521. ASSERT(!sParentGuid.IsEmpty());
  522. if( sParentGuid.IsEmpty() )
  523. {
  524. return;
  525. }
  526. // first check if the container already exists
  527. CTreeNode<CEventContainer*>* pExistingNode = NULL;
  528. // if it exists, return
  529. if( m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
  530. {
  531. ASSERT(pExistingNode);
  532. ASSERT(pExistingNode->GetObject());
  533. if( pExistingNode->GetObject() )
  534. {
  535. pExistingNode->GetObject()->SetObjectPtr(pObject);
  536. }
  537. return;
  538. }
  539. // query for the parent node. It must exist to continue.
  540. CTreeNode<CEventContainer*>* pParentNode = NULL;
  541. if( ! m_GuidToContainerMap.Lookup(sParentGuid,pParentNode) )
  542. {
  543. ASSERT(FALSE);
  544. return;
  545. }
  546. ASSERT(pParentNode);
  547. if( pParentNode == NULL )
  548. {
  549. return;
  550. }
  551. // if the container with guid does not exist then
  552. // create a new Node in the tree, NewNode
  553. // create a new system event container and associate it with NewNode
  554. // if the node to add has a parent (parentguid filled out) then
  555. // add NewNode as child of ParentNode
  556. // else if the node has no parent then
  557. // set the NewNode to be the RootNode of the EventContainer tree
  558. // add the GUID,Node key-value pair to the container map
  559. CTreeNode<CEventContainer*>* pNewNode = new CTreeNode<CEventContainer*>;
  560. CSystemEventContainer* pNewContainer = new CSystemEventContainer;
  561. pNewContainer->m_sConfigurationGuid = _T("@");
  562. pNewContainer->SetObjectPtr(pObject);
  563. pNewNode->SetObject(pNewContainer);
  564. pParentNode->AddChild(pNewNode);
  565. pNewNode->SetParent(pParentNode);
  566. m_SystemNameToContainerMap.SetAt(sSystemName,pNewNode);
  567. }
  568. inline void CEventManager::RemoveSystemContainer(const CString& sSystemName)
  569. {
  570. ASSERT(!sSystemName.IsEmpty());
  571. if( sSystemName.IsEmpty() )
  572. {
  573. return;
  574. }
  575. // first check if the container exists
  576. CTreeNode<CEventContainer*>* pExistingNode = NULL;
  577. // if it does not exist, return
  578. if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
  579. {
  580. ASSERT(FALSE);
  581. return;
  582. }
  583. // make certain the node is valid
  584. ASSERT(pExistingNode);
  585. if( pExistingNode == NULL )
  586. {
  587. return;
  588. }
  589. // destroy all the events for this system from the tree
  590. DeleteEvents(sSystemName,_T(""));
  591. // destroy the node and all its children and then remove the system name key from the map
  592. CTreeNode<CEventContainer*>* pParentNode = pExistingNode->GetParent();
  593. ASSERT(pParentNode);
  594. if( ! pParentNode )
  595. {
  596. return;
  597. }
  598. pParentNode->RemoveChild(pExistingNode);
  599. m_SystemNameToContainerMap.RemoveKey(sSystemName);
  600. // clean up the GuidToContainer map by deleting any keys left around
  601. POSITION pos = m_GuidToContainerMap.GetStartPosition();
  602. CString sKey;
  603. CTreeNode<CEventContainer*>* pNode = NULL;
  604. while(pos != NULL)
  605. {
  606. m_GuidToContainerMap.GetNextAssoc(pos,sKey,pNode);
  607. if( sKey.Find(sSystemName) != -1 )
  608. {
  609. m_GuidToContainerMap.RemoveKey(sKey);
  610. }
  611. }
  612. }
  613. inline void CEventManager::AddSystemShortcutAssociation(const CString& sParentGuid, const CString& sSystemName)
  614. {
  615. // parent guid must be filled out to continue
  616. ASSERT(!sParentGuid.IsEmpty());
  617. if( sParentGuid.IsEmpty() )
  618. {
  619. return;
  620. }
  621. // first check if the container already exists
  622. CTreeNode<CEventContainer*>* pExistingNode = NULL;
  623. // if it does not exist, return
  624. if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
  625. {
  626. return;
  627. }
  628. ASSERT(pExistingNode);
  629. if( !pExistingNode )
  630. {
  631. return;
  632. }
  633. ASSERT(pExistingNode->GetObject());
  634. if(! pExistingNode->GetObject() )
  635. {
  636. return;
  637. }
  638. // query for the parent node. It must exist to continue.
  639. CTreeNode<CEventContainer*>* pParentNode = NULL;
  640. if( ! m_GuidToContainerMap.Lookup(sParentGuid,pParentNode) )
  641. {
  642. ASSERT(FALSE);
  643. return;
  644. }
  645. ASSERT(pParentNode);
  646. if( pParentNode == NULL )
  647. {
  648. return;
  649. }
  650. pExistingNode->AddAssoc(pParentNode);
  651. // pump events up from the associated node to the root
  652. CEventContainer* pSystemContainer = pExistingNode->GetObject();
  653. ASSERT(pSystemContainer);
  654. if( ! pSystemContainer )
  655. {
  656. return;
  657. }
  658. while(pParentNode)
  659. {
  660. CEventContainer* pContainer = pParentNode->GetObject();
  661. ASSERT(pContainer);
  662. if( pContainer )
  663. {
  664. for( int i = 0; i < pSystemContainer->GetEventCount(); i++ )
  665. {
  666. pContainer->AddEvent(pSystemContainer->GetEvent(i));
  667. }
  668. }
  669. pParentNode = pParentNode->GetParent();
  670. }
  671. }
  672. inline void CEventManager::RemoveSystemShortcutAssociation(const CString& sParentGuid, const CString& sSystemName)
  673. {
  674. // parent guid must be filled out to continue
  675. ASSERT(!sParentGuid.IsEmpty());
  676. if( sParentGuid.IsEmpty() )
  677. {
  678. return;
  679. }
  680. // first check if the container already exists
  681. CTreeNode<CEventContainer*>* pExistingNode = NULL;
  682. // if it exists, return
  683. if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
  684. {
  685. ASSERT(FALSE);
  686. return;
  687. }
  688. ASSERT(pExistingNode);
  689. ASSERT(pExistingNode->GetObject());
  690. // query for the parent node. It must exist to continue.
  691. CTreeNode<CEventContainer*>* pParentNode = NULL;
  692. if( ! m_GuidToContainerMap.Lookup(sParentGuid,pParentNode) )
  693. {
  694. ASSERT(FALSE);
  695. return;
  696. }
  697. ASSERT(pParentNode);
  698. if( pParentNode == NULL )
  699. {
  700. return;
  701. }
  702. pExistingNode->RemoveAssoc(pParentNode);
  703. // destroy system events for the parents
  704. while( pParentNode )
  705. {
  706. pParentNode->GetObject()->DeleteSystemEvents(sSystemName);
  707. if( pParentNode->GetParent() && pParentNode->GetParent()->GetParent() )
  708. {
  709. pParentNode = pParentNode->GetParent();
  710. }
  711. else
  712. {
  713. pParentNode = NULL;
  714. }
  715. }
  716. }
  717. inline int CEventManager::GetStatus(const CString& sSystemName, const CString& sGuid)
  718. {
  719. ASSERT(!sGuid.IsEmpty());
  720. if( sGuid.IsEmpty() )
  721. {
  722. return -1;
  723. }
  724. // first check if the container exists
  725. CTreeNode<CEventContainer*>* pExistingNode = NULL;
  726. // if it does not exist, return
  727. if( ! m_GuidToContainerMap.Lookup(sGuid,pExistingNode) )
  728. {
  729. if( ! m_GuidToContainerMap.Lookup(GetCompositeGuid(sSystemName,sGuid),pExistingNode) )
  730. {
  731. ASSERT(FALSE);
  732. return -1;
  733. }
  734. }
  735. ASSERT(pExistingNode);
  736. if( ! pExistingNode )
  737. {
  738. return -1;
  739. }
  740. ASSERT(pExistingNode->GetObject());
  741. if( ! pExistingNode->GetObject() )
  742. {
  743. return -1;
  744. }
  745. return CEvent::GetStatus(pExistingNode->GetObject()->m_iState);
  746. }
  747. inline int CEventManager::GetSystemStatus(const CString& sSystemName)
  748. {
  749. ASSERT(!sSystemName.IsEmpty());
  750. if( sSystemName.IsEmpty() )
  751. {
  752. return -1;
  753. }
  754. // first check if the system container exists
  755. CTreeNode<CEventContainer*>* pExistingNode = NULL;
  756. // if it does not exist, return
  757. if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
  758. {
  759. ASSERT(FALSE);
  760. return -1;
  761. }
  762. ASSERT(pExistingNode);
  763. if( ! pExistingNode )
  764. {
  765. return -1;
  766. }
  767. ASSERT(pExistingNode->GetObject());
  768. if( ! pExistingNode->GetObject() )
  769. {
  770. return -1;
  771. }
  772. return CEvent::GetStatus(pExistingNode->GetObject()->m_iState);
  773. }
  774. inline void CEventManager::ActivateStatisticsEvents(const CString& sSystemName, const CString& sGuid)
  775. {
  776. CEventContainer* pContainer = NULL;
  777. GetEventContainer(sSystemName,sGuid,pContainer);
  778. if( ! pContainer && ! pContainer->IsKindOf(RUNTIME_CLASS(CDataPointEventContainer)) )
  779. {
  780. ASSERT(FALSE);
  781. return;
  782. }
  783. CDataPointEventContainer* pDPContainer = (CDataPointEventContainer*)pContainer;
  784. ASSERT(pDPContainer->m_pDEStatsListener == NULL);
  785. if( pDPContainer->m_pDEStatsListener )
  786. {
  787. return;
  788. }
  789. pDPContainer->m_pDEStatsListener = new CDataElementStatsListener;
  790. CString sQuery;
  791. sQuery.Format(IDS_STRING_STATISTICS_EVENTQUERY,sGuid);
  792. pDPContainer->m_pDEStatsListener->SetEventQuery(sQuery);
  793. pDPContainer->m_pDEStatsListener->SetObjectPtr(pContainer->GetObjectPtr());
  794. pDPContainer->m_pDEStatsListener->Create();
  795. }
  796. inline void CEventManager::DeactivateStatisticsEvents(const CString& sSystemName, const CString& sGuid)
  797. {
  798. CDataPointEventContainer* pContainer = NULL;
  799. GetEventContainer(sSystemName,sGuid,(CEventContainer*&)pContainer);
  800. if( ! pContainer && ! pContainer->IsKindOf(RUNTIME_CLASS(CDataPointEventContainer)) )
  801. {
  802. ASSERT(FALSE);
  803. return;
  804. }
  805. CDataPointEventContainer* pDPContainer = (CDataPointEventContainer*)pContainer;
  806. ASSERT(pDPContainer->m_pDEStatsListener);
  807. if( pDPContainer->m_pDEStatsListener )
  808. {
  809. delete pDPContainer->m_pDEStatsListener;
  810. pDPContainer->m_pDEStatsListener = NULL;
  811. }
  812. }
  813. inline void CEventManager::ActivateSystemEventListener(const CString& sSystemName)
  814. {
  815. ASSERT(!sSystemName.IsEmpty());
  816. if( sSystemName.IsEmpty() )
  817. {
  818. return;
  819. }
  820. // first check if the system container exists
  821. CTreeNode<CEventContainer*>* pExistingNode = NULL;
  822. // if it does not exist, return
  823. if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
  824. {
  825. ASSERT(FALSE);
  826. return;
  827. }
  828. ASSERT(pExistingNode);
  829. if( ! pExistingNode )
  830. {
  831. return;
  832. }
  833. CSystemEventContainer* pSystemContainer = (CSystemEventContainer*)pExistingNode->GetObject();
  834. ASSERT(pSystemContainer);
  835. if( ! pSystemContainer )
  836. {
  837. return;
  838. }
  839. // create the system status listener
  840. ASSERT(pSystemContainer->m_pSystemStatusListener == NULL);
  841. if( pSystemContainer->m_pSystemStatusListener == NULL )
  842. {
  843. pSystemContainer->m_pSystemStatusListener = new CSystemStatusListener;
  844. pSystemContainer->m_pSystemStatusListener->SetObjectPtr(pSystemContainer->GetObjectPtr());
  845. pSystemContainer->m_pSystemStatusListener->Create();
  846. HRESULT hr = S_OK;
  847. IWbemObjectSink* pSink = pSystemContainer->m_pSystemStatusListener->GetSink();
  848. if( !CHECKHRESULT(hr = CnxExecQueryAsync(sSystemName,IDS_STRING_STATUS_QUERY,pSink)) )
  849. {
  850. TRACE(_T("FAILED : CConnectionManager::RegisterEventNotification failed!\n"));
  851. }
  852. }
  853. }
  854. inline void CEventManager::ProcessSystemStatusEvent(CWbemClassObject* pEventObject)
  855. {
  856. // find the system container node named sSystemName
  857. CEventContainer* pContainer = NULL;
  858. GetEventContainer(pEventObject->GetMachineName(),_T(""),pContainer);
  859. if( pContainer == NULL )
  860. {
  861. ASSERT(FALSE);
  862. return;
  863. }
  864. CString sClass;
  865. HRESULT hr = pEventObject->GetClassName(sClass);
  866. if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMSystemStatus")) != 0 )
  867. {
  868. ASSERT(FALSE);
  869. return;
  870. }
  871. // Config Guid
  872. hr = pEventObject->GetProperty(IDS_STRING_MOF_GUID,pContainer->m_sConfigurationGuid);
  873. CHECKHRESULT(hr);
  874. pContainer->m_sConfigurationGuid.TrimLeft(_T("{"));
  875. pContainer->m_sConfigurationGuid.TrimRight(_T("}"));
  876. // Name
  877. CString sName;
  878. hr = pEventObject->GetLocaleStringProperty(IDS_STRING_MOF_NAME,sName);
  879. CHECKHRESULT(hr);
  880. // NumberNormals
  881. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERNORMALS,pContainer->m_iNumberNormals);
  882. CHECKHRESULT(hr);
  883. // NumberWarnings
  884. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,pContainer->m_iNumberWarnings);
  885. CHECKHRESULT(hr);
  886. // NumberCriticals
  887. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,pContainer->m_iNumberCriticals);
  888. CHECKHRESULT(hr);
  889. // State
  890. hr = pEventObject->GetProperty(IDS_STRING_MOF_STATE,pContainer->m_iState);
  891. CHECKHRESULT(hr);
  892. // add statistics
  893. CTime time = CTime::GetCurrentTime();
  894. CHMStatistics* pStat = new CHMStatistics;
  895. pStat->m_sName = sName;
  896. pStat->m_iNumberCriticals = pContainer->m_iNumberCriticals;
  897. pStat->m_iNumberNormals = pContainer->m_iNumberNormals;
  898. pStat->m_iNumberUnknowns = pContainer->m_iNumberUnknowns;
  899. pStat->m_iNumberWarnings = pContainer->m_iNumberWarnings;
  900. time.GetAsSystemTime(pStat->m_st);
  901. pContainer->AddStatistic(pStat);
  902. CHMObject* pObject = pContainer->GetObjectPtr();
  903. if( pObject && GfxCheckObjPtr(pObject,CHMObject) )
  904. {
  905. pObject->UpdateStatus();
  906. }
  907. }
  908. inline void CEventManager::ProcessDataGroupStatusEvent(CWbemClassObject* pEventObject)
  909. {
  910. CString sClass;
  911. HRESULT hr = pEventObject->GetClassName(sClass);
  912. if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMDataGroupStatus")) != 0 )
  913. {
  914. ASSERT(FALSE);
  915. return;
  916. }
  917. // Config Guid
  918. CString sGuid;
  919. hr = pEventObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
  920. CHECKHRESULT(hr);
  921. if( sGuid.IsEmpty() )
  922. {
  923. ASSERT(FALSE);
  924. return;
  925. }
  926. sGuid.TrimLeft(_T("{"));
  927. sGuid.TrimRight(_T("}"));
  928. // Parent Guid
  929. CString sParentGuid;
  930. hr = pEventObject->GetProperty(IDS_STRING_MOF_PARENT_GUID,sParentGuid);
  931. CHECKHRESULT(hr);
  932. if( sParentGuid.IsEmpty() )
  933. {
  934. ASSERT(FALSE);
  935. return;
  936. }
  937. sParentGuid.TrimLeft(_T("{"));
  938. sParentGuid.TrimRight(_T("}"));
  939. // find the data group container node with the appropriate Guid
  940. CEventContainer* pContainer = NULL;
  941. GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
  942. if( pContainer == NULL )
  943. {
  944. AddContainer(pEventObject->GetMachineName(),sParentGuid,sGuid,NULL);
  945. GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
  946. if( pContainer == NULL )
  947. {
  948. ASSERT(FALSE);
  949. return;
  950. }
  951. }
  952. // Name
  953. CString sName;
  954. hr = pEventObject->GetLocaleStringProperty(IDS_STRING_MOF_NAME,sName);
  955. CHECKHRESULT(hr);
  956. // NumberNormals
  957. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERNORMALS,pContainer->m_iNumberNormals);
  958. CHECKHRESULT(hr);
  959. // NumberWarnings
  960. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,pContainer->m_iNumberWarnings);
  961. CHECKHRESULT(hr);
  962. // NumberCriticals
  963. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,pContainer->m_iNumberCriticals);
  964. CHECKHRESULT(hr);
  965. // State
  966. hr = pEventObject->GetProperty(IDS_STRING_MOF_STATE,pContainer->m_iState);
  967. CHECKHRESULT(hr);
  968. if( pContainer->GetObjectPtr() )
  969. {
  970. pContainer->GetObjectPtr()->SetState(CEvent::GetStatus(pContainer->m_iState),true);
  971. }
  972. // add statistics
  973. CTime time = CTime::GetCurrentTime();
  974. CHMStatistics* pStat = new CHMStatistics;
  975. pStat->m_sName = sName;
  976. pStat->m_iNumberCriticals = pContainer->m_iNumberCriticals;
  977. pStat->m_iNumberNormals = pContainer->m_iNumberNormals;
  978. pStat->m_iNumberUnknowns = pContainer->m_iNumberUnknowns;
  979. pStat->m_iNumberWarnings = pContainer->m_iNumberWarnings;
  980. time.GetAsSystemTime(pStat->m_st);
  981. pContainer->AddStatistic(pStat);
  982. CHMObject* pObject = pContainer->GetObjectPtr();
  983. if( pObject && GfxCheckObjPtr(pObject,CHMObject) )
  984. {
  985. pObject->UpdateStatus();
  986. }
  987. }
  988. inline void CEventManager::ProcessDataElementStatusEvent(CWbemClassObject* pEventObject, EventArray& NewEvents)
  989. {
  990. CString sClass;
  991. HRESULT hr = pEventObject->GetClassName(sClass);
  992. if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMDataCollectorStatus")) != 0 )
  993. {
  994. ASSERT(FALSE);
  995. return;
  996. }
  997. // Config Guid
  998. CString sGuid;
  999. hr = pEventObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
  1000. CHECKHRESULT(hr);
  1001. if( sGuid.IsEmpty() )
  1002. {
  1003. ASSERT(FALSE);
  1004. return;
  1005. }
  1006. sGuid.TrimLeft(_T("{"));
  1007. sGuid.TrimRight(_T("}"));
  1008. // Parent Guid
  1009. CString sParentGuid;
  1010. hr = pEventObject->GetProperty(IDS_STRING_MOF_PARENT_GUID,sParentGuid);
  1011. CHECKHRESULT(hr);
  1012. if( sParentGuid.IsEmpty() )
  1013. {
  1014. ASSERT(FALSE);
  1015. return;
  1016. }
  1017. sParentGuid.TrimLeft(_T("{"));
  1018. sParentGuid.TrimRight(_T("}"));
  1019. // find the data element container node with the appropriate Guid
  1020. CEventContainer* pContainer = NULL;
  1021. GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
  1022. if( pContainer == NULL )
  1023. {
  1024. AddContainer(pEventObject->GetMachineName(),sParentGuid,sGuid,NULL,RUNTIME_CLASS(CDataPointEventContainer));
  1025. GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
  1026. if( pContainer == NULL )
  1027. {
  1028. ASSERT(FALSE);
  1029. return;
  1030. }
  1031. }
  1032. // Name
  1033. CString sName;
  1034. hr = pEventObject->GetLocaleStringProperty(IDS_STRING_MOF_NAME,sName);
  1035. CHECKHRESULT(hr);
  1036. // NumberNormals
  1037. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERNORMALS,pContainer->m_iNumberNormals);
  1038. CHECKHRESULT(hr);
  1039. // NumberWarnings
  1040. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,pContainer->m_iNumberWarnings);
  1041. CHECKHRESULT(hr);
  1042. // NumberCriticals
  1043. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,pContainer->m_iNumberCriticals);
  1044. CHECKHRESULT(hr);
  1045. // State
  1046. hr = pEventObject->GetProperty(IDS_STRING_MOF_STATE,pContainer->m_iState);
  1047. CHECKHRESULT(hr);
  1048. if( pContainer->GetObjectPtr() )
  1049. {
  1050. pContainer->GetObjectPtr()->SetState(CEvent::GetStatus(pContainer->m_iState),true);
  1051. }
  1052. // create a DataElement event if the message is not null
  1053. // ConfigurationMessage
  1054. CString sMessage;
  1055. hr = pEventObject->GetLocaleStringProperty(IDS_STRING_MOF_CONFIG_MESSAGE,sMessage);
  1056. if( ! sMessage.IsEmpty() )
  1057. {
  1058. CDataElementEvent* pDEEvent = new CDataElementEvent;
  1059. pDEEvent->m_sMessage = sMessage;
  1060. pDEEvent->m_iState = pContainer->m_iState;
  1061. pDEEvent->m_sName = sName;
  1062. pDEEvent->m_sSystemName = pEventObject->GetMachineName();
  1063. // StatusGUID
  1064. hr = pEventObject->GetProperty(IDS_STRING_MOF_STATUSGUID,pDEEvent->m_sStatusGuid);
  1065. pDEEvent->m_sStatusGuid.TrimLeft(_T("{"));
  1066. pDEEvent->m_sStatusGuid.TrimRight(_T("}"));
  1067. // DTime
  1068. CTime time;
  1069. hr = pEventObject->GetProperty(IDS_STRING_MOF_LOCALTIME,time);
  1070. time.GetAsSystemTime(pDEEvent->m_st);
  1071. // add the event to the container
  1072. pContainer->AddEvent(pDEEvent);
  1073. // add the event to the collection of new events
  1074. NewEvents.Add(pDEEvent);
  1075. // roll this event up to the system level
  1076. CTreeNode<CEventContainer*>* pNode = NULL;
  1077. if( ! m_GuidToContainerMap.Lookup(GetCompositeGuid(pEventObject->GetMachineName(),sGuid),pNode) )
  1078. {
  1079. return;
  1080. }
  1081. CTreeNode<CEventContainer*>* pParentNode = pNode;
  1082. CEventContainer* pContainer = NULL;
  1083. while(pParentNode)
  1084. {
  1085. pContainer = pParentNode->GetObject();
  1086. ASSERT(pContainer);
  1087. if( pContainer )
  1088. {
  1089. pContainer->AddEvents(NewEvents);
  1090. }
  1091. // base case
  1092. if( pContainer->IsKindOf(RUNTIME_CLASS(CSystemEventContainer)) )
  1093. {
  1094. return;
  1095. }
  1096. pParentNode = pParentNode->GetParent();
  1097. }
  1098. }
  1099. }
  1100. inline void CEventManager::ProcessRuleStatusEvent(CWbemClassObject* pEventObject)
  1101. {
  1102. CString sClass;
  1103. HRESULT hr = pEventObject->GetClassName(sClass);
  1104. if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMThresholdStatus")) != 0 )
  1105. {
  1106. ASSERT(FALSE);
  1107. return;
  1108. }
  1109. // Config Guid
  1110. CString sGuid;
  1111. hr = pEventObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
  1112. CHECKHRESULT(hr);
  1113. if( sGuid.IsEmpty() )
  1114. {
  1115. ASSERT(FALSE);
  1116. return;
  1117. }
  1118. sGuid.TrimLeft(_T("{"));
  1119. sGuid.TrimRight(_T("}"));
  1120. // Parent Guid
  1121. CString sParentGuid;
  1122. hr = pEventObject->GetProperty(IDS_STRING_MOF_PARENT_GUID,sParentGuid);
  1123. CHECKHRESULT(hr);
  1124. if( sParentGuid.IsEmpty() )
  1125. {
  1126. ASSERT(FALSE);
  1127. return;
  1128. }
  1129. sParentGuid.TrimLeft(_T("{"));
  1130. sParentGuid.TrimRight(_T("}"));
  1131. // find the rule container node with the appropriate Guid
  1132. CEventContainer* pContainer = NULL;
  1133. GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
  1134. if( pContainer == NULL )
  1135. {
  1136. AddContainer(pEventObject->GetMachineName(),sParentGuid,sGuid,NULL);
  1137. GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
  1138. if( pContainer == NULL )
  1139. {
  1140. ASSERT(FALSE);
  1141. return;
  1142. }
  1143. }
  1144. // NumberNormals
  1145. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERNORMALS,pContainer->m_iNumberNormals);
  1146. CHECKHRESULT(hr);
  1147. // NumberWarnings
  1148. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,pContainer->m_iNumberWarnings);
  1149. CHECKHRESULT(hr);
  1150. // NumberCriticals
  1151. hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,pContainer->m_iNumberCriticals);
  1152. CHECKHRESULT(hr);
  1153. // State
  1154. hr = pEventObject->GetProperty(IDS_STRING_MOF_STATE,pContainer->m_iState);
  1155. CHECKHRESULT(hr);
  1156. if( pContainer->GetObjectPtr() )
  1157. {
  1158. pContainer->GetObjectPtr()->SetState(CEvent::GetStatus(pContainer->m_iState),true);
  1159. }
  1160. CHMObject* pObject = pContainer->GetObjectPtr();
  1161. if( pObject && GfxCheckObjPtr(pObject,CHMObject) )
  1162. {
  1163. pObject->UpdateStatus();
  1164. }
  1165. }
  1166. inline void CEventManager::ProcessRuleStatusInstanceEvent(CWbemClassObject* pEventObject, EventArray& NewEvents)
  1167. {
  1168. CString sClass;
  1169. HRESULT hr = pEventObject->GetClassName(sClass);
  1170. if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMThresholdStatusInstance")) != 0 )
  1171. {
  1172. ASSERT(FALSE);
  1173. return;
  1174. }
  1175. // Config Guid
  1176. CString sGuid;
  1177. hr = pEventObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
  1178. CHECKHRESULT(hr);
  1179. if( sGuid.IsEmpty() )
  1180. {
  1181. ASSERT(FALSE);
  1182. return;
  1183. }
  1184. sGuid.TrimLeft(_T("{"));
  1185. sGuid.TrimRight(_T("}"));
  1186. // State
  1187. int iState = -1;
  1188. hr = pEventObject->GetProperty(IDS_STRING_MOF_STATE,iState);
  1189. CHECKHRESULT(hr);
  1190. // Message
  1191. CString sMessage;
  1192. hr = pEventObject->GetLocaleStringProperty(IDS_STRING_MOF_MESSAGE,sMessage);
  1193. // StatusGUID
  1194. CString sStatusGuid;
  1195. hr = pEventObject->GetProperty(IDS_STRING_MOF_STATUSGUID,sStatusGuid);
  1196. sStatusGuid.TrimLeft(_T("{"));
  1197. sStatusGuid.TrimRight(_T("}"));
  1198. // DTime
  1199. CTime time;
  1200. hr = pEventObject->GetProperty(IDS_STRING_MOF_LOCALTIME,time);
  1201. // ID
  1202. int iID = -1;
  1203. hr = pEventObject->GetProperty(IDS_STRING_MOF_ID,iID);
  1204. // DataCollector Name
  1205. CString sDEName;
  1206. hr = pEventObject->GetProperty(IDS_STRING_MOF_DCNAME,sDEName);
  1207. CRuleEvent* pRuleEvent = new CRuleEvent;
  1208. pRuleEvent->m_iID = iID;
  1209. pRuleEvent->m_sMessage = sMessage;
  1210. pRuleEvent->m_iState = iState;
  1211. pRuleEvent->m_sSystemName = pEventObject->GetMachineName();
  1212. pRuleEvent->m_sStatusGuid = sStatusGuid;
  1213. pRuleEvent->m_sName = sDEName;
  1214. time.GetAsSystemTime(pRuleEvent->m_st);
  1215. // add the event to the collection of new events
  1216. NewEvents.Add(pRuleEvent);
  1217. // roll this event up to the system level
  1218. CTreeNode<CEventContainer*>* pNode = NULL;
  1219. if( ! m_GuidToContainerMap.Lookup(GetCompositeGuid(pEventObject->GetMachineName(),sGuid),pNode) )
  1220. {
  1221. return;
  1222. }
  1223. CTreeNode<CEventContainer*>* pParentNode = pNode;
  1224. CEventContainer* pContainer = NULL;
  1225. while(pParentNode)
  1226. {
  1227. pContainer = pParentNode->GetObject();
  1228. ASSERT(pContainer);
  1229. if( pContainer )
  1230. {
  1231. pContainer->AddEvents(NewEvents);
  1232. }
  1233. // base case
  1234. if( pContainer && pContainer->IsKindOf(RUNTIME_CLASS(CSystemEventContainer)) )
  1235. {
  1236. return;
  1237. }
  1238. pParentNode = pParentNode->GetParent();
  1239. }
  1240. }
  1241. inline CString CEventManager::GetCompositeGuid(const CString& sSystemName, const CString& sGuid)
  1242. {
  1243. if( sSystemName.IsEmpty() )
  1244. {
  1245. return sGuid;
  1246. }
  1247. return sSystemName + _T("-") + sGuid;
  1248. }
  1249. inline void CEventManager::PropogateStatisticsToChildren(const CString& sSystemName, const CString& sParentGuid, StatsArray& Statistics)
  1250. {
  1251. if( sSystemName.IsEmpty() )
  1252. {
  1253. ASSERT(FALSE);
  1254. return;
  1255. }
  1256. if( sParentGuid.IsEmpty() )
  1257. {
  1258. ASSERT(FALSE);
  1259. return;
  1260. }
  1261. CTreeNode<CEventContainer*>* pParentNode = NULL;
  1262. if( ! m_GuidToContainerMap.Lookup(GetCompositeGuid(sSystemName,sParentGuid),pParentNode) )
  1263. {
  1264. ASSERT(FALSE);
  1265. return;
  1266. }
  1267. ASSERT(pParentNode);
  1268. if( ! pParentNode )
  1269. {
  1270. return;
  1271. }
  1272. // for each child do
  1273. // for each stat do
  1274. // create copy of stat
  1275. // add to child.Statistics
  1276. for( int i = 0; i < pParentNode->GetChildCount(); i++ )
  1277. {
  1278. CTreeNode<CEventContainer*>* pChildNode = pParentNode->GetChild(i);
  1279. ASSERT(pChildNode);
  1280. if( pChildNode )
  1281. {
  1282. CEventContainer* pContainer = pChildNode->GetObject();
  1283. ASSERT(pContainer);
  1284. if( pContainer )
  1285. {
  1286. for( int j = 0; j < Statistics.GetSize(); j++ )
  1287. {
  1288. CStatistics* pStat = Statistics[j];
  1289. if( pStat )
  1290. {
  1291. pContainer->AddStatistic(pStat->Copy());
  1292. }
  1293. }
  1294. }
  1295. }
  1296. }
  1297. }