287 lines
6.4 KiB
C++
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;
|
|
}
|