WindowsXP-SP1/admin/hmonitor/snapin/hmdataelementstatus.cpp
2020-09-30 16:53:49 +02:00

337 lines
7.0 KiB
C++

// HMDataElementStatus.cpp: implementation of the CHMDataElementStatus class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "snapin.h"
#include "HMDataElementStatus.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNCREATE(CHMDataElementStatus,CHMEvent)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CHMDataElementStatus::CHMDataElementStatus()
{
m_iNumberWarnings = 0; // Number of Rules currently in critical state
m_iNumberCriticals = 0;// Number of Rules currently in warning state
m_iState = HMS_UNKNOWN; // The state we are in - rollup from all Microsoft_HMDataGroups.
ZeroMemory(&m_st,sizeof(SYSTEMTIME));
}
CHMDataElementStatus::~CHMDataElementStatus()
{
for( int i = 0; i < m_RuleStatus.GetSize(); i++ )
{
if( GfxCheckObjPtr(m_RuleStatus[i],CHMRuleStatus) )
{
delete m_RuleStatus[i];
}
}
m_RuleStatus.RemoveAll();
for( i = 0; i < m_RolledUpRuleStatus.GetSize(); i++ )
{
if( GfxCheckObjPtr(m_RolledUpRuleStatus[i],CHMEvent) )
{
delete m_RolledUpRuleStatus[i];
}
}
m_RolledUpRuleStatus.RemoveAll();
Destroy();
}
//////////////////////////////////////////////////////////////////////
// Create
//////////////////////////////////////////////////////////////////////
HRESULT CHMDataElementStatus::Create(const CString& sMachineName)
{
HRESULT hr = CHMEvent::Create(sMachineName);
if( !CHECKHRESULT(hr) )
{
return hr;
}
// create the enumerator for Microsoft_HMDataElementStatus object instances
BSTR bsClass = SysAllocString(_T("Microsoft_HMDataCollectorStatus"));
hr = CreateEnumerator(bsClass);
SysFreeString(bsClass);
if( !CHECKHRESULT(hr) )
{
return hr;
}
return hr;
}
HRESULT CHMDataElementStatus::Create(IWbemClassObject* pObject)
{
HRESULT hr = CHMEvent::Create(pObject);
if( !CHECKHRESULT(hr) )
{
return hr;
}
return hr;
}
//////////////////////////////////////////////////////////////////////
// Enumeration Operations
//////////////////////////////////////////////////////////////////////
HRESULT CHMDataElementStatus::EnumerateObjects(ULONG& uReturned)
{
// call GetNextObject to proceed to the next object instance
HRESULT hr = GetNextObject(uReturned);
if( FAILED(hr) || uReturned != 1 )
{
// no more instances
return hr;
}
ASSERT(m_pIWbemClassObject);
if( m_pIWbemClassObject == NULL )
{
ASSERT(0);
return S_FALSE;
}
// process the properties of this object
hr = GetAllProperties();
return hr;
}
//////////////////////////////////////////////////////////////////////
// Property Retrieval Operations
//////////////////////////////////////////////////////////////////////
HRESULT CHMDataElementStatus::GetAllProperties()
{
ASSERT(m_pIWbemClassObject);
if( m_pIWbemClassObject == NULL )
{
ASSERT(FALSE);
return S_FALSE;
}
HRESULT hr = S_OK;
// Name
hr = GetLocaleStringProperty(IDS_STRING_MOF_NAME,m_sName);
// GUID
hr = GetProperty(IDS_STRING_MOF_GUID,m_sGuid);
m_sGuid.TrimLeft(_T("{"));
m_sGuid.TrimRight(_T("}"));
// NumberNormals
hr = GetProperty(IDS_STRING_MOF_NUMBERNORMALS,m_iNumberNormals);
// NumberWarnings
hr = GetProperty(IDS_STRING_MOF_NUMBERWARNINGS,m_iNumberWarnings);
// NumberCriticals
hr = GetProperty(IDS_STRING_MOF_NUMBERCRITICALS,m_iNumberCriticals);
// State
hr = GetProperty(IDS_STRING_MOF_STATE,m_iState);
switch( m_iState )
{
case 0:
{
m_sState.LoadString(IDS_STRING_CRITICAL);
}
break;
case 1:
{
m_sState.LoadString(IDS_STRING_WARNING);
}
break;
case 2:
{
m_sState.LoadString(IDS_STRING_NODATA);
}
break;
case 3:
{
m_sState.LoadString(IDS_STRING_UNKNOWN);
}
break;
case 4:
{
m_sState.LoadString(IDS_STRING_OUTAGE);
}
break;
case 5:
{
m_sState.LoadString(IDS_STRING_DISABLED);
}
break;
case 6:
{
m_sState.LoadString(IDS_STRING_INFORMATION);
}
break;
case 7:
{
m_sState.LoadString(IDS_STRING_RESET);
}
break;
case 8:
{
m_sState.LoadString(IDS_STRING_NORMAL);
}
break;
}
// StatusGUID
hr = GetProperty(IDS_STRING_MOF_STATUSGUID,m_sStatusGuid);
m_sStatusGuid.TrimLeft(_T("{"));
m_sStatusGuid.TrimRight(_T("}"));
// DTime
CTime time;
hr = GetProperty(IDS_STRING_MOF_LOCALTIME,time);
time.GetAsSystemTime(m_st);
CString sTime;
CString sDate;
int iLen = GetTimeFormat(LOCALE_USER_DEFAULT,0L,&m_st,NULL,NULL,0);
iLen = GetTimeFormat(LOCALE_USER_DEFAULT,0L,&m_st,NULL,sTime.GetBuffer(iLen+(sizeof(TCHAR)*1)),iLen);
sTime.ReleaseBuffer();
iLen = GetDateFormat(LOCALE_USER_DEFAULT,0L,&m_st,NULL,NULL,0);
iLen = GetDateFormat(LOCALE_USER_DEFAULT,0L,&m_st,NULL,sDate.GetBuffer(iLen+(sizeof(TCHAR)*1)),iLen);
sDate.ReleaseBuffer();
m_sDateTime = sDate + _T(" ") + sTime;
// Message
hr = GetLocaleStringProperty(IDS_STRING_MOF_MESSAGE,m_sMessage);
if( ! m_sMessage.IsEmpty() )
{
CHMRuleStatusInstance* pRSI = new CHMRuleStatusInstance;
pRSI->SetParent(this);
pRSI->m_sDataElementName = m_sName;
pRSI->m_sSystemName = m_sSystemName;
pRSI->m_sMessage = m_sMessage;
pRSI->m_iState = m_iState;
pRSI->m_sState = m_sState;
pRSI->m_sStatusGuid = m_sStatusGuid;
pRSI->m_sDateTime = m_sDateTime;
pRSI->m_sDTime = m_sDTime;
pRSI->m_st = m_st;
m_RolledUpRuleStatus.Add(pRSI);
// propogate the status back up to the HMSystemStatus instance
// this gives us a roll up of status at each node in the tree
CHMEvent* pParent = GetParent();
CHMRuleStatusInstance* pStatus = NULL;
while(pParent)
{
pStatus = new CHMRuleStatusInstance(*pRSI);
pStatus->SetParent(this);
pParent->m_RolledUpRuleStatus.Add(pStatus);
pParent = pParent->GetParent();
}
}
// Rules
hr = GetProperty(IDS_STRING_MOF_RULES,m_Rules);
long lLower = 0L;
long lUpper = -1L;
if( hr != S_FALSE )
{
m_Rules.GetLBound(1L,&lLower);
m_Rules.GetUBound(1L,&lUpper);
}
for( long i = lLower; i <= lUpper; i++ )
{
IWbemClassObject* pIWBCO = NULL;
m_Rules.GetElement(&i,&pIWBCO);
if( pIWBCO )
{
CHMRuleStatus* pRS = new CHMRuleStatus;
pRS->SetParent(this);
pRS->m_sDataElementName = m_sName;
pRS->m_sSystemName = m_sSystemName;
pRS->Create(pIWBCO);
pRS->GetAllProperties();
m_RuleStatus.Add(pRS);
}
}
return hr;
}
void CHMDataElementStatus::RemoveStatusEvent(CHMEvent* pEvent)
{
for( int i = 0; i < m_RolledUpRuleStatus.GetSize(); i++ )
{
if( pEvent == m_RolledUpRuleStatus[i] )
{
m_RolledUpRuleStatus.RemoveAt(i);
break;
}
}
for( i = 0; i < m_RuleStatus.GetSize(); i++ )
{
m_RuleStatus[i]->RemoveStatusEvent(pEvent);
}
}