windows-nt/Source/XPSP1/NT/admin/hmonitor/snapin/eventmanager.inl
2020-09-26 16:20:57 +08:00

1543 lines
37 KiB
C++

// 04/09/00 v-marfin 63119 : converted m_iCurrent to string
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Operations
//////////////////////////////////////////////////////////////////////
inline void CEventManager::ProcessEvent(CWbemClassObject* pEventObject)
{
if( pEventObject == NULL )
{
ASSERT(FALSE);
return;
}
if( pEventObject->GetMachineName().IsEmpty() )
{
ASSERT(FALSE);
return;
}
// three possible flavors of events
// - threshold
// - data collector
// - everything else
EventArray SystemEvents;
CString sClass;
pEventObject->GetClassName(sClass);
if( ! sClass.CompareNoCase(_T("Microsoft_HMThresholdStatusInstance")) )
{
ProcessRuleStatusInstanceEvent(pEventObject,SystemEvents);
}
else if( ! sClass.CompareNoCase(_T("Microsoft_HMThresholdStatus")) )
{
ProcessRuleStatusEvent(pEventObject);
}
else if( ! sClass.CompareNoCase(_T("Microsoft_HMDataCollectorStatus")) )
{
ProcessDataElementStatusEvent(pEventObject,SystemEvents);
}
else if( ! sClass.CompareNoCase(_T("Microsoft_HMDataGroupStatus")) )
{
ProcessDataGroupStatusEvent(pEventObject);
}
else if( ! sClass.CompareNoCase(_T("Microsoft_HMSystemStatus")) )
{
ProcessSystemStatusEvent(pEventObject);
}
else if( ! sClass.CompareNoCase(_T("Microsoft_HMDataCollectorStatistics")) )
{
ProcessStatisticEvent(pEventObject);
}
else
{
return;
}
// propogate these events up to the root system group event container
CTreeNode<CEventContainer*>* pSystemNode = NULL;
if( ! m_SystemNameToContainerMap.Lookup(pEventObject->GetMachineName(),pSystemNode) )
{
ASSERT(FALSE);
return;
}
CTreeNode<CEventContainer*>* pParentNode = pSystemNode->GetParent();
while(pParentNode)
{
CEventContainer* pContainer = pParentNode->GetObject();
ASSERT(pContainer);
if( pContainer )
{
pContainer->AddEvents(SystemEvents);
}
pParentNode = pParentNode->GetParent();
}
// also propogate to associated nodes of the system
for( int i = 0; i < pSystemNode->GetAssocCount(); i++ )
{
CTreeNode<CEventContainer*>* pAssocNode = pSystemNode->GetAssoc(i);
if( pAssocNode )
{
CEventContainer* pContainer = pAssocNode->GetObject();
if( pContainer )
{
pContainer->AddEvents(SystemEvents);
pParentNode = pAssocNode->GetParent();
while(pParentNode)
{
CEventContainer* pContainer = pParentNode->GetObject();
ASSERT(pContainer);
if( pContainer )
{
pContainer->AddEvents(SystemEvents);
}
pParentNode = pParentNode->GetParent();
}
}
}
}
}
inline void CEventManager::ProcessUnknownEvent(const CString& sSystemName, CRuleEvent* pUnknownEvent)
{
if( sSystemName.IsEmpty() )
{
return;
}
if( ! pUnknownEvent )
{
return;
}
// add event to the system container
CTreeNode<CEventContainer*>* pSystemNode = NULL;
if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pSystemNode) )
{
ASSERT(FALSE);
return;
}
CEventContainer* pContainer = pSystemNode->GetObject();
if( ! pContainer )
{
return;
}
pContainer->AddEvent(pUnknownEvent);
pContainer->m_iState = 6;
// propogate these events up to the root system group event container
CTreeNode<CEventContainer*>* pParentNode = pSystemNode->GetParent();
while(pParentNode)
{
CEventContainer* pContainer = pParentNode->GetObject();
ASSERT(pContainer);
if( pContainer )
{
pContainer->AddEvent(pUnknownEvent);
pContainer->m_iState = 6;
}
pParentNode = pParentNode->GetParent();
}
// also propogate to associated nodes of the system
for( int i = 0; i < pSystemNode->GetAssocCount(); i++ )
{
CTreeNode<CEventContainer*>* pAssocNode = pSystemNode->GetAssoc(i);
if( pAssocNode )
{
CEventContainer* pContainer = pAssocNode->GetObject();
if( pContainer )
{
pContainer->AddEvent(pUnknownEvent);
pParentNode = pAssocNode->GetParent();
while(pParentNode)
{
CEventContainer* pContainer = pParentNode->GetObject();
ASSERT(pContainer);
if( pContainer )
{
pContainer->AddEvent(pUnknownEvent);
pContainer->m_iState = 6;
}
pParentNode = pParentNode->GetParent();
}
}
}
}
}
inline void CEventManager::ProcessActionEvent(CWbemClassObject* pActionEventObject)
{
if( pActionEventObject == NULL )
{
ASSERT(FALSE);
return;
}
// Config Guid
CString sGuid;
HRESULT hr = pActionEventObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
CHECKHRESULT(hr);
sGuid.TrimLeft(_T("{"));
sGuid.TrimRight(_T("}"));
// find the action container node by its guid
CEventContainer* pContainer = NULL;
GetEventContainer(pActionEventObject->GetMachineName(),sGuid,pContainer);
if( pContainer == NULL )
{
ASSERT(FALSE);
return;
}
CString sClass;
hr = pActionEventObject->GetClassName(sClass);
if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMActionStatus")) != 0 )
{
ASSERT(FALSE);
return;
}
EventArray DataGroupEvents;
// GUID
pContainer->m_sConfigurationGuid = sGuid;
// Name
CString sName;
hr = pActionEventObject->GetLocaleStringProperty(IDS_STRING_MOF_NAME,sName);
CHECKHRESULT(hr);
// NumberNormals
hr = pActionEventObject->GetProperty(IDS_STRING_MOF_NUMBERNORMALS,pContainer->m_iNumberNormals);
CHECKHRESULT(hr);
// NumberWarnings
hr = pActionEventObject->GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,pContainer->m_iNumberWarnings);
CHECKHRESULT(hr);
// NumberCriticals
hr = pActionEventObject->GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,pContainer->m_iNumberCriticals);
CHECKHRESULT(hr);
// State
hr = pActionEventObject->GetProperty(IDS_STRING_MOF_STATE,pContainer->m_iState);
CHECKHRESULT(hr);
// v-marfin 59492 ---------------------------------------------------------------------
CHECKHRESULT(hr);
if( pContainer->GetObjectPtr() )
{
pContainer->GetObjectPtr()->SetState(CEvent::GetStatus(pContainer->m_iState),true);
}
//--------------------------------------------------------------------------------------
}
inline void CEventManager::ProcessStatisticEvent(CWbemClassObject* pStatObject)
{
if( ! pStatObject )
{
ASSERT(FALSE);
return;
}
CString sClass;
HRESULT hr = pStatObject->GetClassName(sClass);
if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMDataCollectorStatistics")) != 0 )
{
ASSERT(FALSE);
return;
}
// Config Guid
CString sGuid;
hr = pStatObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
CHECKHRESULT(hr);
if( sGuid.IsEmpty() )
{
ASSERT(FALSE);
return;
}
sGuid.TrimLeft(_T("{"));
sGuid.TrimRight(_T("}"));
// find the data element container node with the appropriate Guid
// this must exist to continue processing
CEventContainer* pContainer = NULL;
GetEventContainer(pStatObject->GetMachineName(),sGuid,pContainer);
if( pContainer == NULL )
{
ASSERT(FALSE);
return;
}
CDataPointStatistics* pDPStat = new CDataPointStatistics;
StatsArray Statistics;
// DTime
CTime time;
hr = pStatObject->GetProperty(IDS_STRING_MOF_LOCALTIME,time);
time.GetAsSystemTime(pDPStat->m_st);
// PropertyName
hr = pStatObject->GetProperty(IDS_STRING_MOF_PROPERTYNAME,pDPStat->m_sPropertyName);
CString sValue;
// InstanceName
hr = pStatObject->GetProperty(IDS_STRING_MOF_INSTANCENAME,pDPStat->m_sInstanceName);
// CurrentValue
// 63119 hr = pStatObject->GetProperty(IDS_STRING_MOF_CURRENTVALUE,sValue);
// 63119 pDPStat->m_iCurrent = _ttoi(sValue);
hr = pStatObject->GetProperty(IDS_STRING_MOF_CURRENTVALUE,pDPStat->m_strCurrent);
// MinValue
hr = pStatObject->GetProperty(IDS_STRING_MOF_MINVALUE,sValue);
pDPStat->m_iMin = _ttoi(sValue);
// MaxValue
hr = pStatObject->GetProperty(IDS_STRING_MOF_MAXVALUE,sValue);
pDPStat->m_iMax = _ttoi(sValue);
// AvgValue
hr = pStatObject->GetProperty(IDS_STRING_MOF_AVGVALUE,sValue);
pDPStat->m_iAvg = _ttoi(sValue);
Statistics.Add(pDPStat);
PropogateStatisticsToChildren(pStatObject->GetMachineName(),sGuid,Statistics);
pContainer->AddStatistics(Statistics);
}
inline void CEventManager::GetEventContainer(const CString& sSystemName, const CString& sGuid, CEventContainer*& pContainer)
{
// get a container beneath a system - Guid is filled out and SystemName is filled out
// get a container above a system - SystemName is blank and Guid is filled out
// get a container for a system - System Name is filled out and Guid is empty
CTreeNode<CEventContainer*>* pNode = NULL;
if( ! sGuid.IsEmpty() && sGuid != _T("@") )
{
if( ! m_GuidToContainerMap.Lookup(sGuid,pNode) )
{
if( sSystemName.IsEmpty() )
{
ASSERT(FALSE);
pContainer = NULL;
return;
}
if( ! m_GuidToContainerMap.Lookup(GetCompositeGuid(sSystemName,sGuid),pNode) )
{
pContainer = NULL;
return;
}
}
pContainer = pNode->GetObject();
ASSERT(pContainer);
if( pContainer->m_sConfigurationGuid != sGuid )
{
ASSERT(FALSE);
pContainer = NULL;
}
}
else if( ! sSystemName.IsEmpty() )
{
if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pNode) )
{
ASSERT(FALSE);
return;
}
pContainer = pNode->GetObject();
ASSERT(pContainer);
}
}
inline void CEventManager::DeleteEvents(const CString& sSystemName, const CString& sStatusGuid)
{
ASSERT(!sSystemName.IsEmpty());
if( sSystemName.IsEmpty() )
{
return;
}
DeleteEvents(m_EventContainers.GetRootNode(),sSystemName,sStatusGuid);
CTreeNode<CEventContainer*>* pSystemNode = NULL;
if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pSystemNode) )
{
ASSERT(FALSE);
return;
}
ASSERT(pSystemNode);
if( ! pSystemNode )
{
ASSERT(FALSE);
return;
}
CEventContainer* pContainer = pSystemNode->GetObject();
if( ! pContainer )
{
ASSERT(FALSE);
return;
}
if( sStatusGuid.IsEmpty() )
{
pContainer->DeleteSystemEvents(sSystemName);
}
else
{
pContainer->DeleteEvent(sStatusGuid);
}
}
inline void CEventManager::DeleteEvents(CTreeNode<CEventContainer*>* pNode,const CString& sSystemName, const CString& sStatusGuid)
{
ASSERT(pNode);
if( pNode == NULL )
{
return;
}
CEventContainer* pContainer = pNode->GetObject();
ASSERT(pContainer);
if( pContainer == NULL )
{
return;
}
ASSERT(!sSystemName.IsEmpty());
// skip over this node if it is the system node
CTreeNode<CEventContainer*>* pSystemNode = NULL;
m_SystemNameToContainerMap.Lookup(sSystemName,pSystemNode);
if( pSystemNode != pNode )
{
// if status guid is filled out, then delete only the event which corresponds to it
// if the system name is filled out and status guid is not, then delete all the events for the system
if( ! sStatusGuid.IsEmpty() )
{
pContainer->DeleteEvent(sStatusGuid);
}
else if( ! sSystemName.IsEmpty() )
{
pContainer->DeleteSystemEvents(sSystemName);
}
else
{
ASSERT(FALSE);
}
}
for( int i = 0; i < pNode->GetChildCount(); i++ )
{
DeleteEvents(pNode->GetChild(i),sSystemName,sStatusGuid);
}
}
inline void CEventManager::AddContainer(const CString& sSystemName, const CString& sParentGuid, const CString& sGuid, CHMObject* pObject, CRuntimeClass* pClass)
{
ASSERT(pClass);
if( ! pClass )
{
return;
}
ASSERT(!sGuid.IsEmpty());
if( sGuid.IsEmpty() )
{
return;
}
// we could be adding a system group - systemname == NULL, parentguid could be null, sguid valid
// we could be adding something below a system - systemname valid, parentguid == "@" or is valid, sguid valid
CString _sGuid = sGuid;
CString _sParentGuid = sParentGuid;
if( ! sSystemName.IsEmpty() && ! sParentGuid.IsEmpty() && ! sGuid.IsEmpty() )
{
_sGuid = GetCompositeGuid(sSystemName,sGuid);
_sParentGuid = GetCompositeGuid(sSystemName,sParentGuid);
}
// first check if the container already exists
CTreeNode<CEventContainer*>* pExistingNode = NULL;
// if it exists, return
if( m_GuidToContainerMap.Lookup(_sGuid,pExistingNode) )
{
ASSERT(pExistingNode);
ASSERT(pExistingNode->GetObject());
if( pExistingNode->GetObject() && pExistingNode->GetObject()->GetObjectPtr() == NULL )
{
pExistingNode->GetObject()->SetObjectPtr(pObject);
}
return;
}
// if the parent guid is filled out, then query for the parent node. It must exist to continue.
CTreeNode<CEventContainer*>* pParentNode = NULL;
if( ! sParentGuid.IsEmpty() )
{
if( ! m_GuidToContainerMap.Lookup(_sParentGuid,pParentNode) )
{
ASSERT(sParentGuid == _T("@"));
if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pParentNode) )
{
ASSERT(FALSE);
return;
}
}
ASSERT(pParentNode);
if( pParentNode == NULL )
{
return;
}
}
// if the container with guid does not exist then
// create a new Node in the tree, NewNode
// create a new event container and associate it with NewNode
// if the node to add has a parent (parentguid filled out) then
// add NewNode as child of ParentNode
// else if the node has no parent then
// set the NewNode to be the RootNode of the EventContainer tree
// add the GUID,Node key-value pair to the container map
CTreeNode<CEventContainer*>* pNewNode = new CTreeNode<CEventContainer*>;
CEventContainer* pNewContainer = (CEventContainer*)pClass->CreateObject();
pNewContainer->m_sConfigurationGuid = sGuid;
pNewContainer->SetObjectPtr(pObject);
pNewNode->SetObject(pNewContainer);
if( pParentNode )
{
pParentNode->AddChild(pNewNode);
pNewNode->SetParent(pParentNode);
}
else
{
ASSERT( m_EventContainers.GetRootNode() == NULL);
if( m_EventContainers.GetRootNode() != NULL )
{
delete pNewNode;
delete pNewContainer;
return;
}
pNewNode->SetParent(NULL);
m_EventContainers.SetRootNode(pNewNode);
}
m_GuidToContainerMap.SetAt(_sGuid,pNewNode);
}
inline void CEventManager::RemoveContainer(const CString& sSystemName, const CString& sGuid)
{
ASSERT(!sGuid.IsEmpty());
if( sGuid.IsEmpty() )
{
return;
}
// first check if the container exists
CTreeNode<CEventContainer*>* pExistingNode = NULL;
// if it exists, delete it and remove the key from the guid to container map
// try the normal guid
if( m_GuidToContainerMap.Lookup(sGuid,pExistingNode) )
{
ASSERT(pExistingNode);
ASSERT(pExistingNode->GetObject());
if( pExistingNode )
{
if( pExistingNode == m_EventContainers.GetRootNode() )
{
m_EventContainers.SetRootNode(NULL);
}
delete pExistingNode;
m_GuidToContainerMap.RemoveKey(sGuid);
}
return;
}
// try the composite guid
if( m_GuidToContainerMap.Lookup(GetCompositeGuid(sSystemName,sGuid),pExistingNode) )
{
ASSERT(pExistingNode);
ASSERT(pExistingNode->GetObject());
if( pExistingNode )
{
delete pExistingNode;
m_GuidToContainerMap.RemoveKey(sGuid);
}
return;
}
ASSERT(FALSE); // did not find it
}
inline void CEventManager::AddSystemContainer(const CString& sParentGuid, const CString& sSystemName, CHMObject* pObject)
{
// parent guid must be filled out to continue
ASSERT(!sParentGuid.IsEmpty());
if( sParentGuid.IsEmpty() )
{
return;
}
// first check if the container already exists
CTreeNode<CEventContainer*>* pExistingNode = NULL;
// if it exists, return
if( m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
{
ASSERT(pExistingNode);
ASSERT(pExistingNode->GetObject());
if( pExistingNode->GetObject() )
{
pExistingNode->GetObject()->SetObjectPtr(pObject);
}
return;
}
// query for the parent node. It must exist to continue.
CTreeNode<CEventContainer*>* pParentNode = NULL;
if( ! m_GuidToContainerMap.Lookup(sParentGuid,pParentNode) )
{
ASSERT(FALSE);
return;
}
ASSERT(pParentNode);
if( pParentNode == NULL )
{
return;
}
// if the container with guid does not exist then
// create a new Node in the tree, NewNode
// create a new system event container and associate it with NewNode
// if the node to add has a parent (parentguid filled out) then
// add NewNode as child of ParentNode
// else if the node has no parent then
// set the NewNode to be the RootNode of the EventContainer tree
// add the GUID,Node key-value pair to the container map
CTreeNode<CEventContainer*>* pNewNode = new CTreeNode<CEventContainer*>;
CSystemEventContainer* pNewContainer = new CSystemEventContainer;
pNewContainer->m_sConfigurationGuid = _T("@");
pNewContainer->SetObjectPtr(pObject);
pNewNode->SetObject(pNewContainer);
pParentNode->AddChild(pNewNode);
pNewNode->SetParent(pParentNode);
m_SystemNameToContainerMap.SetAt(sSystemName,pNewNode);
}
inline void CEventManager::RemoveSystemContainer(const CString& sSystemName)
{
ASSERT(!sSystemName.IsEmpty());
if( sSystemName.IsEmpty() )
{
return;
}
// first check if the container exists
CTreeNode<CEventContainer*>* pExistingNode = NULL;
// if it does not exist, return
if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
{
ASSERT(FALSE);
return;
}
// make certain the node is valid
ASSERT(pExistingNode);
if( pExistingNode == NULL )
{
return;
}
// destroy all the events for this system from the tree
DeleteEvents(sSystemName,_T(""));
// destroy the node and all its children and then remove the system name key from the map
CTreeNode<CEventContainer*>* pParentNode = pExistingNode->GetParent();
ASSERT(pParentNode);
if( ! pParentNode )
{
return;
}
pParentNode->RemoveChild(pExistingNode);
m_SystemNameToContainerMap.RemoveKey(sSystemName);
// clean up the GuidToContainer map by deleting any keys left around
POSITION pos = m_GuidToContainerMap.GetStartPosition();
CString sKey;
CTreeNode<CEventContainer*>* pNode = NULL;
while(pos != NULL)
{
m_GuidToContainerMap.GetNextAssoc(pos,sKey,pNode);
if( sKey.Find(sSystemName) != -1 )
{
m_GuidToContainerMap.RemoveKey(sKey);
}
}
}
inline void CEventManager::AddSystemShortcutAssociation(const CString& sParentGuid, const CString& sSystemName)
{
// parent guid must be filled out to continue
ASSERT(!sParentGuid.IsEmpty());
if( sParentGuid.IsEmpty() )
{
return;
}
// first check if the container already exists
CTreeNode<CEventContainer*>* pExistingNode = NULL;
// if it does not exist, return
if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
{
return;
}
ASSERT(pExistingNode);
if( !pExistingNode )
{
return;
}
ASSERT(pExistingNode->GetObject());
if(! pExistingNode->GetObject() )
{
return;
}
// query for the parent node. It must exist to continue.
CTreeNode<CEventContainer*>* pParentNode = NULL;
if( ! m_GuidToContainerMap.Lookup(sParentGuid,pParentNode) )
{
ASSERT(FALSE);
return;
}
ASSERT(pParentNode);
if( pParentNode == NULL )
{
return;
}
pExistingNode->AddAssoc(pParentNode);
// pump events up from the associated node to the root
CEventContainer* pSystemContainer = pExistingNode->GetObject();
ASSERT(pSystemContainer);
if( ! pSystemContainer )
{
return;
}
while(pParentNode)
{
CEventContainer* pContainer = pParentNode->GetObject();
ASSERT(pContainer);
if( pContainer )
{
for( int i = 0; i < pSystemContainer->GetEventCount(); i++ )
{
pContainer->AddEvent(pSystemContainer->GetEvent(i));
}
}
pParentNode = pParentNode->GetParent();
}
}
inline void CEventManager::RemoveSystemShortcutAssociation(const CString& sParentGuid, const CString& sSystemName)
{
// parent guid must be filled out to continue
ASSERT(!sParentGuid.IsEmpty());
if( sParentGuid.IsEmpty() )
{
return;
}
// first check if the container already exists
CTreeNode<CEventContainer*>* pExistingNode = NULL;
// if it exists, return
if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
{
ASSERT(FALSE);
return;
}
ASSERT(pExistingNode);
ASSERT(pExistingNode->GetObject());
// query for the parent node. It must exist to continue.
CTreeNode<CEventContainer*>* pParentNode = NULL;
if( ! m_GuidToContainerMap.Lookup(sParentGuid,pParentNode) )
{
ASSERT(FALSE);
return;
}
ASSERT(pParentNode);
if( pParentNode == NULL )
{
return;
}
pExistingNode->RemoveAssoc(pParentNode);
// destroy system events for the parents
while( pParentNode )
{
pParentNode->GetObject()->DeleteSystemEvents(sSystemName);
if( pParentNode->GetParent() && pParentNode->GetParent()->GetParent() )
{
pParentNode = pParentNode->GetParent();
}
else
{
pParentNode = NULL;
}
}
}
inline int CEventManager::GetStatus(const CString& sSystemName, const CString& sGuid)
{
ASSERT(!sGuid.IsEmpty());
if( sGuid.IsEmpty() )
{
return -1;
}
// first check if the container exists
CTreeNode<CEventContainer*>* pExistingNode = NULL;
// if it does not exist, return
if( ! m_GuidToContainerMap.Lookup(sGuid,pExistingNode) )
{
if( ! m_GuidToContainerMap.Lookup(GetCompositeGuid(sSystemName,sGuid),pExistingNode) )
{
ASSERT(FALSE);
return -1;
}
}
ASSERT(pExistingNode);
if( ! pExistingNode )
{
return -1;
}
ASSERT(pExistingNode->GetObject());
if( ! pExistingNode->GetObject() )
{
return -1;
}
return CEvent::GetStatus(pExistingNode->GetObject()->m_iState);
}
inline int CEventManager::GetSystemStatus(const CString& sSystemName)
{
ASSERT(!sSystemName.IsEmpty());
if( sSystemName.IsEmpty() )
{
return -1;
}
// first check if the system container exists
CTreeNode<CEventContainer*>* pExistingNode = NULL;
// if it does not exist, return
if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
{
ASSERT(FALSE);
return -1;
}
ASSERT(pExistingNode);
if( ! pExistingNode )
{
return -1;
}
ASSERT(pExistingNode->GetObject());
if( ! pExistingNode->GetObject() )
{
return -1;
}
return CEvent::GetStatus(pExistingNode->GetObject()->m_iState);
}
inline void CEventManager::ActivateStatisticsEvents(const CString& sSystemName, const CString& sGuid)
{
CEventContainer* pContainer = NULL;
GetEventContainer(sSystemName,sGuid,pContainer);
if( ! pContainer && ! pContainer->IsKindOf(RUNTIME_CLASS(CDataPointEventContainer)) )
{
ASSERT(FALSE);
return;
}
CDataPointEventContainer* pDPContainer = (CDataPointEventContainer*)pContainer;
ASSERT(pDPContainer->m_pDEStatsListener == NULL);
if( pDPContainer->m_pDEStatsListener )
{
return;
}
pDPContainer->m_pDEStatsListener = new CDataElementStatsListener;
CString sQuery;
sQuery.Format(IDS_STRING_STATISTICS_EVENTQUERY,sGuid);
pDPContainer->m_pDEStatsListener->SetEventQuery(sQuery);
pDPContainer->m_pDEStatsListener->SetObjectPtr(pContainer->GetObjectPtr());
pDPContainer->m_pDEStatsListener->Create();
}
inline void CEventManager::DeactivateStatisticsEvents(const CString& sSystemName, const CString& sGuid)
{
CDataPointEventContainer* pContainer = NULL;
GetEventContainer(sSystemName,sGuid,(CEventContainer*&)pContainer);
if( ! pContainer && ! pContainer->IsKindOf(RUNTIME_CLASS(CDataPointEventContainer)) )
{
ASSERT(FALSE);
return;
}
CDataPointEventContainer* pDPContainer = (CDataPointEventContainer*)pContainer;
ASSERT(pDPContainer->m_pDEStatsListener);
if( pDPContainer->m_pDEStatsListener )
{
delete pDPContainer->m_pDEStatsListener;
pDPContainer->m_pDEStatsListener = NULL;
}
}
inline void CEventManager::ActivateSystemEventListener(const CString& sSystemName)
{
ASSERT(!sSystemName.IsEmpty());
if( sSystemName.IsEmpty() )
{
return;
}
// first check if the system container exists
CTreeNode<CEventContainer*>* pExistingNode = NULL;
// if it does not exist, return
if( ! m_SystemNameToContainerMap.Lookup(sSystemName,pExistingNode) )
{
ASSERT(FALSE);
return;
}
ASSERT(pExistingNode);
if( ! pExistingNode )
{
return;
}
CSystemEventContainer* pSystemContainer = (CSystemEventContainer*)pExistingNode->GetObject();
ASSERT(pSystemContainer);
if( ! pSystemContainer )
{
return;
}
// create the system status listener
ASSERT(pSystemContainer->m_pSystemStatusListener == NULL);
if( pSystemContainer->m_pSystemStatusListener == NULL )
{
pSystemContainer->m_pSystemStatusListener = new CSystemStatusListener;
pSystemContainer->m_pSystemStatusListener->SetObjectPtr(pSystemContainer->GetObjectPtr());
pSystemContainer->m_pSystemStatusListener->Create();
HRESULT hr = S_OK;
IWbemObjectSink* pSink = pSystemContainer->m_pSystemStatusListener->GetSink();
if( !CHECKHRESULT(hr = CnxExecQueryAsync(sSystemName,IDS_STRING_STATUS_QUERY,pSink)) )
{
TRACE(_T("FAILED : CConnectionManager::RegisterEventNotification failed!\n"));
}
}
}
inline void CEventManager::ProcessSystemStatusEvent(CWbemClassObject* pEventObject)
{
// find the system container node named sSystemName
CEventContainer* pContainer = NULL;
GetEventContainer(pEventObject->GetMachineName(),_T(""),pContainer);
if( pContainer == NULL )
{
ASSERT(FALSE);
return;
}
CString sClass;
HRESULT hr = pEventObject->GetClassName(sClass);
if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMSystemStatus")) != 0 )
{
ASSERT(FALSE);
return;
}
// Config Guid
hr = pEventObject->GetProperty(IDS_STRING_MOF_GUID,pContainer->m_sConfigurationGuid);
CHECKHRESULT(hr);
pContainer->m_sConfigurationGuid.TrimLeft(_T("{"));
pContainer->m_sConfigurationGuid.TrimRight(_T("}"));
// Name
CString sName;
hr = pEventObject->GetLocaleStringProperty(IDS_STRING_MOF_NAME,sName);
CHECKHRESULT(hr);
// NumberNormals
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERNORMALS,pContainer->m_iNumberNormals);
CHECKHRESULT(hr);
// NumberWarnings
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,pContainer->m_iNumberWarnings);
CHECKHRESULT(hr);
// NumberCriticals
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,pContainer->m_iNumberCriticals);
CHECKHRESULT(hr);
// State
hr = pEventObject->GetProperty(IDS_STRING_MOF_STATE,pContainer->m_iState);
CHECKHRESULT(hr);
// add statistics
CTime time = CTime::GetCurrentTime();
CHMStatistics* pStat = new CHMStatistics;
pStat->m_sName = sName;
pStat->m_iNumberCriticals = pContainer->m_iNumberCriticals;
pStat->m_iNumberNormals = pContainer->m_iNumberNormals;
pStat->m_iNumberUnknowns = pContainer->m_iNumberUnknowns;
pStat->m_iNumberWarnings = pContainer->m_iNumberWarnings;
time.GetAsSystemTime(pStat->m_st);
pContainer->AddStatistic(pStat);
CHMObject* pObject = pContainer->GetObjectPtr();
if( pObject && GfxCheckObjPtr(pObject,CHMObject) )
{
pObject->UpdateStatus();
}
}
inline void CEventManager::ProcessDataGroupStatusEvent(CWbemClassObject* pEventObject)
{
CString sClass;
HRESULT hr = pEventObject->GetClassName(sClass);
if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMDataGroupStatus")) != 0 )
{
ASSERT(FALSE);
return;
}
// Config Guid
CString sGuid;
hr = pEventObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
CHECKHRESULT(hr);
if( sGuid.IsEmpty() )
{
ASSERT(FALSE);
return;
}
sGuid.TrimLeft(_T("{"));
sGuid.TrimRight(_T("}"));
// Parent Guid
CString sParentGuid;
hr = pEventObject->GetProperty(IDS_STRING_MOF_PARENT_GUID,sParentGuid);
CHECKHRESULT(hr);
if( sParentGuid.IsEmpty() )
{
ASSERT(FALSE);
return;
}
sParentGuid.TrimLeft(_T("{"));
sParentGuid.TrimRight(_T("}"));
// find the data group container node with the appropriate Guid
CEventContainer* pContainer = NULL;
GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
if( pContainer == NULL )
{
AddContainer(pEventObject->GetMachineName(),sParentGuid,sGuid,NULL);
GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
if( pContainer == NULL )
{
ASSERT(FALSE);
return;
}
}
// Name
CString sName;
hr = pEventObject->GetLocaleStringProperty(IDS_STRING_MOF_NAME,sName);
CHECKHRESULT(hr);
// NumberNormals
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERNORMALS,pContainer->m_iNumberNormals);
CHECKHRESULT(hr);
// NumberWarnings
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,pContainer->m_iNumberWarnings);
CHECKHRESULT(hr);
// NumberCriticals
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,pContainer->m_iNumberCriticals);
CHECKHRESULT(hr);
// State
hr = pEventObject->GetProperty(IDS_STRING_MOF_STATE,pContainer->m_iState);
CHECKHRESULT(hr);
if( pContainer->GetObjectPtr() )
{
pContainer->GetObjectPtr()->SetState(CEvent::GetStatus(pContainer->m_iState),true);
}
// add statistics
CTime time = CTime::GetCurrentTime();
CHMStatistics* pStat = new CHMStatistics;
pStat->m_sName = sName;
pStat->m_iNumberCriticals = pContainer->m_iNumberCriticals;
pStat->m_iNumberNormals = pContainer->m_iNumberNormals;
pStat->m_iNumberUnknowns = pContainer->m_iNumberUnknowns;
pStat->m_iNumberWarnings = pContainer->m_iNumberWarnings;
time.GetAsSystemTime(pStat->m_st);
pContainer->AddStatistic(pStat);
CHMObject* pObject = pContainer->GetObjectPtr();
if( pObject && GfxCheckObjPtr(pObject,CHMObject) )
{
pObject->UpdateStatus();
}
}
inline void CEventManager::ProcessDataElementStatusEvent(CWbemClassObject* pEventObject, EventArray& NewEvents)
{
CString sClass;
HRESULT hr = pEventObject->GetClassName(sClass);
if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMDataCollectorStatus")) != 0 )
{
ASSERT(FALSE);
return;
}
// Config Guid
CString sGuid;
hr = pEventObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
CHECKHRESULT(hr);
if( sGuid.IsEmpty() )
{
ASSERT(FALSE);
return;
}
sGuid.TrimLeft(_T("{"));
sGuid.TrimRight(_T("}"));
// Parent Guid
CString sParentGuid;
hr = pEventObject->GetProperty(IDS_STRING_MOF_PARENT_GUID,sParentGuid);
CHECKHRESULT(hr);
if( sParentGuid.IsEmpty() )
{
ASSERT(FALSE);
return;
}
sParentGuid.TrimLeft(_T("{"));
sParentGuid.TrimRight(_T("}"));
// find the data element container node with the appropriate Guid
CEventContainer* pContainer = NULL;
GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
if( pContainer == NULL )
{
AddContainer(pEventObject->GetMachineName(),sParentGuid,sGuid,NULL,RUNTIME_CLASS(CDataPointEventContainer));
GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
if( pContainer == NULL )
{
ASSERT(FALSE);
return;
}
}
// Name
CString sName;
hr = pEventObject->GetLocaleStringProperty(IDS_STRING_MOF_NAME,sName);
CHECKHRESULT(hr);
// NumberNormals
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERNORMALS,pContainer->m_iNumberNormals);
CHECKHRESULT(hr);
// NumberWarnings
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,pContainer->m_iNumberWarnings);
CHECKHRESULT(hr);
// NumberCriticals
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,pContainer->m_iNumberCriticals);
CHECKHRESULT(hr);
// State
hr = pEventObject->GetProperty(IDS_STRING_MOF_STATE,pContainer->m_iState);
CHECKHRESULT(hr);
if( pContainer->GetObjectPtr() )
{
pContainer->GetObjectPtr()->SetState(CEvent::GetStatus(pContainer->m_iState),true);
}
// create a DataElement event if the message is not null
// ConfigurationMessage
CString sMessage;
hr = pEventObject->GetLocaleStringProperty(IDS_STRING_MOF_CONFIG_MESSAGE,sMessage);
if( ! sMessage.IsEmpty() )
{
CDataElementEvent* pDEEvent = new CDataElementEvent;
pDEEvent->m_sMessage = sMessage;
pDEEvent->m_iState = pContainer->m_iState;
pDEEvent->m_sName = sName;
pDEEvent->m_sSystemName = pEventObject->GetMachineName();
// StatusGUID
hr = pEventObject->GetProperty(IDS_STRING_MOF_STATUSGUID,pDEEvent->m_sStatusGuid);
pDEEvent->m_sStatusGuid.TrimLeft(_T("{"));
pDEEvent->m_sStatusGuid.TrimRight(_T("}"));
// DTime
CTime time;
hr = pEventObject->GetProperty(IDS_STRING_MOF_LOCALTIME,time);
time.GetAsSystemTime(pDEEvent->m_st);
// add the event to the container
pContainer->AddEvent(pDEEvent);
// add the event to the collection of new events
NewEvents.Add(pDEEvent);
// roll this event up to the system level
CTreeNode<CEventContainer*>* pNode = NULL;
if( ! m_GuidToContainerMap.Lookup(GetCompositeGuid(pEventObject->GetMachineName(),sGuid),pNode) )
{
return;
}
CTreeNode<CEventContainer*>* pParentNode = pNode;
CEventContainer* pContainer = NULL;
while(pParentNode)
{
pContainer = pParentNode->GetObject();
ASSERT(pContainer);
if( pContainer )
{
pContainer->AddEvents(NewEvents);
}
// base case
if( pContainer->IsKindOf(RUNTIME_CLASS(CSystemEventContainer)) )
{
return;
}
pParentNode = pParentNode->GetParent();
}
}
}
inline void CEventManager::ProcessRuleStatusEvent(CWbemClassObject* pEventObject)
{
CString sClass;
HRESULT hr = pEventObject->GetClassName(sClass);
if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMThresholdStatus")) != 0 )
{
ASSERT(FALSE);
return;
}
// Config Guid
CString sGuid;
hr = pEventObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
CHECKHRESULT(hr);
if( sGuid.IsEmpty() )
{
ASSERT(FALSE);
return;
}
sGuid.TrimLeft(_T("{"));
sGuid.TrimRight(_T("}"));
// Parent Guid
CString sParentGuid;
hr = pEventObject->GetProperty(IDS_STRING_MOF_PARENT_GUID,sParentGuid);
CHECKHRESULT(hr);
if( sParentGuid.IsEmpty() )
{
ASSERT(FALSE);
return;
}
sParentGuid.TrimLeft(_T("{"));
sParentGuid.TrimRight(_T("}"));
// find the rule container node with the appropriate Guid
CEventContainer* pContainer = NULL;
GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
if( pContainer == NULL )
{
AddContainer(pEventObject->GetMachineName(),sParentGuid,sGuid,NULL);
GetEventContainer(pEventObject->GetMachineName(),sGuid,pContainer);
if( pContainer == NULL )
{
ASSERT(FALSE);
return;
}
}
// NumberNormals
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERNORMALS,pContainer->m_iNumberNormals);
CHECKHRESULT(hr);
// NumberWarnings
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,pContainer->m_iNumberWarnings);
CHECKHRESULT(hr);
// NumberCriticals
hr = pEventObject->GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,pContainer->m_iNumberCriticals);
CHECKHRESULT(hr);
// State
hr = pEventObject->GetProperty(IDS_STRING_MOF_STATE,pContainer->m_iState);
CHECKHRESULT(hr);
if( pContainer->GetObjectPtr() )
{
pContainer->GetObjectPtr()->SetState(CEvent::GetStatus(pContainer->m_iState),true);
}
CHMObject* pObject = pContainer->GetObjectPtr();
if( pObject && GfxCheckObjPtr(pObject,CHMObject) )
{
pObject->UpdateStatus();
}
}
inline void CEventManager::ProcessRuleStatusInstanceEvent(CWbemClassObject* pEventObject, EventArray& NewEvents)
{
CString sClass;
HRESULT hr = pEventObject->GetClassName(sClass);
if( !CHECKHRESULT(hr) || sClass.CompareNoCase(_T("Microsoft_HMThresholdStatusInstance")) != 0 )
{
ASSERT(FALSE);
return;
}
// Config Guid
CString sGuid;
hr = pEventObject->GetProperty(IDS_STRING_MOF_GUID,sGuid);
CHECKHRESULT(hr);
if( sGuid.IsEmpty() )
{
ASSERT(FALSE);
return;
}
sGuid.TrimLeft(_T("{"));
sGuid.TrimRight(_T("}"));
// State
int iState = -1;
hr = pEventObject->GetProperty(IDS_STRING_MOF_STATE,iState);
CHECKHRESULT(hr);
// Message
CString sMessage;
hr = pEventObject->GetLocaleStringProperty(IDS_STRING_MOF_MESSAGE,sMessage);
// StatusGUID
CString sStatusGuid;
hr = pEventObject->GetProperty(IDS_STRING_MOF_STATUSGUID,sStatusGuid);
sStatusGuid.TrimLeft(_T("{"));
sStatusGuid.TrimRight(_T("}"));
// DTime
CTime time;
hr = pEventObject->GetProperty(IDS_STRING_MOF_LOCALTIME,time);
// ID
int iID = -1;
hr = pEventObject->GetProperty(IDS_STRING_MOF_ID,iID);
// DataCollector Name
CString sDEName;
hr = pEventObject->GetProperty(IDS_STRING_MOF_DCNAME,sDEName);
CRuleEvent* pRuleEvent = new CRuleEvent;
pRuleEvent->m_iID = iID;
pRuleEvent->m_sMessage = sMessage;
pRuleEvent->m_iState = iState;
pRuleEvent->m_sSystemName = pEventObject->GetMachineName();
pRuleEvent->m_sStatusGuid = sStatusGuid;
pRuleEvent->m_sName = sDEName;
time.GetAsSystemTime(pRuleEvent->m_st);
// add the event to the collection of new events
NewEvents.Add(pRuleEvent);
// roll this event up to the system level
CTreeNode<CEventContainer*>* pNode = NULL;
if( ! m_GuidToContainerMap.Lookup(GetCompositeGuid(pEventObject->GetMachineName(),sGuid),pNode) )
{
return;
}
CTreeNode<CEventContainer*>* pParentNode = pNode;
CEventContainer* pContainer = NULL;
while(pParentNode)
{
pContainer = pParentNode->GetObject();
ASSERT(pContainer);
if( pContainer )
{
pContainer->AddEvents(NewEvents);
}
// base case
if( pContainer && pContainer->IsKindOf(RUNTIME_CLASS(CSystemEventContainer)) )
{
return;
}
pParentNode = pParentNode->GetParent();
}
}
inline CString CEventManager::GetCompositeGuid(const CString& sSystemName, const CString& sGuid)
{
if( sSystemName.IsEmpty() )
{
return sGuid;
}
return sSystemName + _T("-") + sGuid;
}
inline void CEventManager::PropogateStatisticsToChildren(const CString& sSystemName, const CString& sParentGuid, StatsArray& Statistics)
{
if( sSystemName.IsEmpty() )
{
ASSERT(FALSE);
return;
}
if( sParentGuid.IsEmpty() )
{
ASSERT(FALSE);
return;
}
CTreeNode<CEventContainer*>* pParentNode = NULL;
if( ! m_GuidToContainerMap.Lookup(GetCompositeGuid(sSystemName,sParentGuid),pParentNode) )
{
ASSERT(FALSE);
return;
}
ASSERT(pParentNode);
if( ! pParentNode )
{
return;
}
// for each child do
// for each stat do
// create copy of stat
// add to child.Statistics
for( int i = 0; i < pParentNode->GetChildCount(); i++ )
{
CTreeNode<CEventContainer*>* pChildNode = pParentNode->GetChild(i);
ASSERT(pChildNode);
if( pChildNode )
{
CEventContainer* pContainer = pChildNode->GetObject();
ASSERT(pContainer);
if( pContainer )
{
for( int j = 0; j < Statistics.GetSize(); j++ )
{
CStatistics* pStat = Statistics[j];
if( pStat )
{
pContainer->AddStatistic(pStat->Copy());
}
}
}
}
}
}