// 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; }