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

287 lines
6.4 KiB
C++

// HMObject.cpp : implementation file
//
#include "stdafx.h"
#include "snapin.h"
#include "HMObject.h"
#include "EventManager.h"
#include "System.h"
#include "ActionPolicy.h" // 59492b
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// static members for refreshing the events
int CHMObject::m_iRefreshType = 0;
int CHMObject::m_iEventCount = 50;
int CHMObject::m_iTimeValue = 1;
TimeUnit CHMObject::m_Units = Hours;
/////////////////////////////////////////////////////////////////////////////
// CHMObject
IMPLEMENT_SERIAL(CHMObject, CCmdTarget, 1)
CHMObject::CHMObject()
{
EnableAutomation();
m_nState = HMS_NODATA;
m_lNameSuffix = 0L;
SYSTEMTIME st;
GetSystemTime(&st);
// adjust to the local time zone
TIME_ZONE_INFORMATION tzi;
SYSTEMTIME stLocal;
GetTimeZoneInformation(&tzi);
SystemTimeToTzSpecificLocalTime(&tzi,&st,&stLocal);
m_CreateDateTime = stLocal;
m_ModifiedDateTime = stLocal;
m_lActiveSinkCount = 0L;
m_lNormalCount = 0;
m_lUnknownCount = 0;
m_lWarningCount = 0;
m_lCriticalCount = 0;
}
CHMObject::~CHMObject()
{
}
/////////////////////////////////////////////////////////////////////////////
// Event Members
/////////////////////////////////////////////////////////////////////////////
void CHMObject::AddContainer(const CString& sParentGuid, const CString& sGuid, CHMObject* pObject)
{
if( sGuid == _T("@") )
{
EvtGetEventManager()->AddSystemContainer(sParentGuid,pObject->GetSystemName(),pObject);
}
else
{
if( pObject->IsKindOf(RUNTIME_CLASS(CDataElement)) )
{
EvtGetEventManager()->AddContainer(GetSystemName(),sParentGuid,sGuid,pObject,RUNTIME_CLASS(CDataPointEventContainer));
}
else
{
EvtGetEventManager()->AddContainer(GetSystemName(),sParentGuid,sGuid,pObject);
}
}
}
void CHMObject::ClearEvents()
{
for( int i = 0; i < GetChildCount(); i++ )
{
CHMObject* pChild = GetChild(i);
if( pChild )
{
pChild->ClearEvents();
}
}
if( GetChildCount() == 0 )
{
CEventContainer* pContainer = NULL;
EvtGetEventManager()->GetEventContainer(GetSystemName(),GetGuid(),pContainer);
if( ! pContainer )
{
ASSERT(FALSE);
return;
}
// delete each event by status guid
CStringArray saStatusGuidsToDelete;
for( i = 0; i < pContainer->GetEventCount(); i++ )
{
CEvent* pEvent = pContainer->GetEvent(i);
saStatusGuidsToDelete.Add(pEvent->m_sStatusGuid);
}
for( i = 0; i < saStatusGuidsToDelete.GetSize(); i++ )
{
EvtGetEventManager()->DeleteEvents(GetSystemName(),saStatusGuidsToDelete[i]);
}
}
}
void CHMObject::DestroyChild(int iIndex, bool bDeleteClassObject /*= false*/)
{
TRACEX(_T("CHMObject::DestroyChild\n"));
TRACEARGn(iIndex);
TRACEARGn(bDeleteClassObject);
CHMObject* pObject = m_Children[iIndex];
if( ! GfxCheckObjPtr(pObject,CHMObject) )
{
return;
}
// destroy the events for the child
CEventContainer* pContainer = NULL;
EvtGetEventManager()->GetEventContainer(pObject->GetSystemName(),pObject->GetGuid(),pContainer);
if( pContainer )
{
pContainer->SetObjectPtr(NULL);
}
m_Children.RemoveAt(iIndex);
if( bDeleteClassObject )
{
pObject->DeleteClassObject();
}
for( int i = pObject->GetScopeItemCount()-1; i >= 0; i-- )
{
CScopePaneItem* pChild = pObject->GetScopeItem(i);
pObject->RemoveScopeItem(i);
if( pChild )
{
CScopePaneItem* pParent = pChild->GetParent();
if( pParent )
{
pParent->DestroyChild(pChild);
}
}
}
delete pObject;
}
void CHMObject::UpdateStatus()
{
TRACEX(_T("CHMObject::UpdateStatus\n"));
// set the state as appropriate
CEventContainer* pContainer = NULL;
EvtGetEventManager()->GetEventContainer(GetSystemName(),GetGuid(),pContainer);
if( ! pContainer )
{
return;
}
SetState(CEvent::GetStatus(pContainer->m_iState),true);
m_lNormalCount = pContainer->m_iNumberNormals;
m_lWarningCount = pContainer->m_iNumberWarnings;
m_lCriticalCount = pContainer->m_iNumberCriticals;
m_lUnknownCount = pContainer->m_iNumberUnknowns;
}
void CHMObject::IncrementActiveSinkCount()
{
TRACEX(_T("CHMObject::IncrementActiveSinkCount\n"));
m_lActiveSinkCount++;
CHealthmonScopePane* pHMPane = (CHealthmonScopePane*)GetScopePane();
if( ! pHMPane )
{
return;
}
CSystem* pSystem = pHMPane->GetSystem(GetSystemName());
if( ! pSystem )
{
return;
}
pSystem->m_lTotalActiveSinkCount++;
}
void CHMObject::DecrementActiveSinkCount()
{
TRACEX(_T("CHMObject::DecrementActiveSinkCount\n"));
m_lActiveSinkCount--;
if( m_lActiveSinkCount == 0L )
{
UpdateStatus();
}
CHealthmonScopePane* pHMPane = (CHealthmonScopePane*)GetScopePane();
if( ! pHMPane )
{
return;
}
CSystem* pSystem = pHMPane->GetSystem(GetSystemName());
if( ! pSystem )
{
return;
}
pSystem->m_lTotalActiveSinkCount--;
if( pSystem->m_lTotalActiveSinkCount == 0 )
{
EvtGetEventManager()->ActivateSystemEventListener(GetSystemName());
}
}
void CHMObject::OnFinalRelease()
{
// When the last reference for an automation object is released
// OnFinalRelease is called. The base class will automatically
// deletes the object. Add additional cleanup required for your
// object before calling the base class.
CCmdTarget::OnFinalRelease();
}
BEGIN_MESSAGE_MAP(CHMObject, CCmdTarget)
//{{AFX_MSG_MAP(CHMObject)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CHMObject, CCmdTarget)
//{{AFX_DISPATCH_MAP(CHMObject)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
// Note: we add support for IID_IHMObject to support typesafe binding
// from VBA. This IID must match the GUID that is attached to the
// dispinterface in the .ODL file.
// {D9BF4F9A-F673-11D2-BDC4-0000F87A3912}
static const IID IID_IHMObject =
{ 0xd9bf4f9a, 0xf673, 0x11d2, { 0xbd, 0xc4, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12 } };
BEGIN_INTERFACE_MAP(CHMObject, CCmdTarget)
INTERFACE_PART(CHMObject, IID_IHMObject, Dispatch)
END_INTERFACE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHMObject message handlers
// 59492b
// This will determine whether the object is the "Actions" item in the tree control
//*********************************************************************************
// IsActionsItem
//*********************************************************************************
BOOL CHMObject::IsActionsItem()
{
if (this->IsKindOf(RUNTIME_CLASS(CActionPolicy)))
return TRUE;
else
return FALSE;
}