//*************************************************************************** // // THRESHLD.H // // Module: HEALTHMON SERVER AGENT // // Purpose: CThreshold class to do thresholding on a CDatapoint class. // The CDatapoint class contains the WMI instance, and the CThreshold // class says what ptoperty to threshold against, and how. // // Copyright (c)1999 Microsoft Corporation, All Rights Reserved // //*************************************************************************** #if !defined( __THRESHLD_H ) #define __THRESHLD_H #include #include #include "global.h" #include "base.h" // Add support for UINT64 and other similar datatypes. // Need to use a union for the values collecting. union hm_datatypes { long lValue; unsigned long ulValue; float fValue; double dValue; __int64 i64Value; unsigned __int64 ui64Value; // LPTSTR lpstr_value; // LPTSTR date_value; // unsigned char bool_value; // short int int_value; }; //XXXTake out the kludge in the Threshold::CrossTest and RearmTest that was converting all numeric //XXXstrings to numbers to do arithemetic compare instead of lexical. //XXXIn the StoreValues code use the CIMTYPE that get from the Get call directly, as //XXXwe do now in the ppn property. typedef struct _tag_VALStruct { union hm_datatypes value; } VALSTRUCT, *PVALSTRUCT; typedef std::vector > VALLIST; typedef struct _tag_INSTStruct { LPTSTR szInstanceID; // Name of instance LPTSTR szCurrValue; union hm_datatypes currValue; union hm_datatypes minValue; union hm_datatypes maxValue; union hm_datatypes avgValue; BOOL bNull; BOOL bNeeded; VALLIST valList; } INSTSTRUCT, *PINSTSTRUCT; typedef std::vector > INSTLIST; typedef struct _tag_PNStruct { LPTSTR szPropertyName; CIMTYPE type; // BOOL bNull; // BOOL bNeeded; INSTLIST instList; int iRefCount; } PNSTRUCT; typedef std::vector > PNLIST; typedef struct _tag_IRSStruct { LPTSTR szStatusGUID; TCHAR szDTTime[512]; TCHAR szTime[512]; LPTSTR szInstanceID; // Name of instance long lPrevState; long lCurrState; long lCrossCountTry; // union hm_datatypes prevValue; // union hm_datatypes prevPrevValue; long lPrevValue; unsigned long ulPrevValue; float fPrevValue; double dPrevValue; __int64 i64PrevValue; unsigned __int64 ui64PrevValue; long lPrevPrevValue; unsigned long ulPrevPrevValue; float fPrevPrevValue; double dPrevPrevValue; __int64 i64PrevPrevValue; unsigned __int64 ui64PrevPrevValue; BOOL bNeeded; int unknownReason; } IRSSTRUCT, *PIRSSTRUCT; typedef std::vector > IRSLIST; typedef struct _tag_ACTUALINSTStruct { LPTSTR szInstanceID; // Name of instance IWbemClassObject* pInst; BOOL bNeeded; TCHAR szDTTime[512]; TCHAR szTime[512]; } ACTUALINSTSTRUCT, *PACTUALINSTSTRUCT; typedef std::vector > ACTUALINSTLIST; class CDataCollector; // Forward declaration class CThreshold : public CBase { public: CThreshold(); ~CThreshold(); CDataCollector *m_pParentDC; long m_lPrevState; // long m_lCurrState; // long m_lViolationValue; // IWbemServices* m_pIWbemServices; LPTSTR m_szParentObjPath; // long m_lNameRID; LPTSTR m_szDescription; // long m_lDescriptionRID; // LPTSTR m_szResourceDLL; long m_lID; LPTSTR m_szPropertyName; BOOL m_bUseAverage; BOOL m_bUseDifference; BOOL m_bUseSum; // HM_CONDITION m_lTestCondition; long m_lTestCondition; LPTSTR m_szCompareValue; long m_lCompareValue; unsigned long m_ulCompareValue; float m_fCompareValue; double m_dCompareValue; __int64 m_i64CompareValue; unsigned __int64 m_ui64CompareValue; // union hm_datatypes m_compareValue; long m_lThresholdDuration; long m_lViolationToState; LPTSTR m_szCreationDate; LPTSTR m_szLastUpdate; // LPTSTR m_szMessage; // long m_lMessageRID; // LPTSTR m_szResetMessage; // long m_lResetMessageRID; long m_lStartupDelay; //XXX int m_iActiveDays; //XXX long m_lBeginHourTime; //XXX long m_lBeginMinuteTime; //XXX long m_lEndHourTime; //XXX long m_lEndMinuteTime; BOOL m_bEnabled; BOOL m_bParentEnabled; // So we can transfer down the hierarchy the state. BOOL m_bParentScheduledOut; TCHAR m_szDTTime[512]; TCHAR m_szTime[512]; IRSLIST m_irsList; long m_lNumberNormals; long m_lNumberWarnings; long m_lNumberCriticals; long m_lNumberChanges; BOOL m_bValidLoad; // // STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC // static void ThresholdTerminationCleanup(void); static void GetLocal(void); static BOOL mg_bEnglishCompare; HRESULT LoadInstanceFromMOF(IWbemClassObject* pObj, CDataCollector *pParentDC, LPTSTR pszParentObjPath, BOOL bModifyPass=FALSE); // return polling interval in milliseconds BOOL OnAgentInterval(ACTUALINSTLIST *actualInstList, PNSTRUCT *ppn, BOOL bRequireReset); BOOL FireEvent(BOOL bForce); BOOL FireInstanceEvents(ACTUALINSTLIST *actualInstList, PNSTRUCT *ppn); LPTSTR GetPropertyName(void); BOOL CrossTest(PNSTRUCT *ppn, IRSSTRUCT *pirs, LPTSTR szTestValue, union hm_datatypes testValue, INSTSTRUCT *pinst); BOOL RearmTest(PNSTRUCT *ppn, IRSSTRUCT *pirs, LPTSTR szTestValue, union hm_datatypes testValue, INSTSTRUCT *pinst); HRESULT GetHMThresholdStatusInstance(IWbemClassObject** pInstance, BOOL bEventBased); // BOOL GetHMThresholdStatusInstanceInstance(ACTUALINSTSTRUCT *pActualInst, PNSTRUCT *ppn, INSTSTRUCT *pinst, IRSSTRUCT *pirs, IWbemClassObject** ppIRSInstance, BOOL bChangesOnly, BOOL bEventBased); HRESULT SendHMThresholdStatusInstances(IWbemObjectSink* pSink); HRESULT SendHMThresholdStatusInstance(IWbemObjectSink* pSink, LPTSTR pszGUID); // HRESULT SendHMThresholdStatusInstanceInstances(ACTUALINSTLIST *actualInstList, PNSTRUCT *ppn, IWbemObjectSink* pSink); // HRESULT SendHMThresholdStatusInstanceInstance(ACTUALINSTLIST *actualInstList, PNSTRUCT *ppn, IWbemObjectSink* pSink, LPTSTR pszGUID); long GetCurrState(void); HRESULT FindAndModThreshold(BSTR szGUID, IWbemClassObject* pObj); LPTSTR GetGUID(void); BOOL SetCurrState(HM_STATE state, BOOL bForce = FALSE, int reason = 0); BOOL SetPrevState(HM_STATE state); BOOL SetParentEnabledFlag(BOOL bEnabled); BOOL SetParentScheduledOutFlag(BOOL bScheduledOut); BOOL SetBackPrev(PNSTRUCT *ppn); BOOL ClearInstList(void); BOOL ResetResetThreshold(void); BOOL GetChange(void); BOOL GetEnabledChange(void); HRESULT AddInstance(LPTSTR pszID); // BOOL FormatMessages(IWbemClassObject* pObj); BOOL FormatMessage(IWbemClassObject* pIRSInstance, IWbemClassObject *pEmbeddedInstance); //XXX BOOL Enable(BOOL bEnable); BOOL Cleanup(BOOL bSavePrevSettings); BOOL Init(void); BOOL DeleteThresholdConfig(BOOL bDeleteAssocOnly=FALSE); HRESULT Copy(ILIST* pConfigList, LPTSTR pszOldParentGUID, LPTSTR pszNewParentGUID); CBase *FindImediateChildByName(LPTSTR pszChildName); BOOL GetNextChildName(LPTSTR pszChildName, LPTSTR pszOutName); CBase *FindPointerFromName(LPTSTR pszChildName); // BOOL ModifyAssocForMove(CBase *pNewParentBase); BOOL ReceiveNewChildForMove(CBase *pBase); BOOL DeleteChildFromList(LPTSTR pszGUID); long PassBackStateIfChangedPerInstance(LPTSTR pszInstName); long PassBackWorstStatePerInstance(LPTSTR pszInstName); BOOL SendReminderActionIfStateIsSame(IWbemObjectSink* pActionEventSink, IWbemObjectSink* pActionTriggerEventSink, IWbemClassObject* pActionInstance, IWbemClassObject* pActionTriggerInstance, unsigned long ulTriggerStates); BOOL SkipClean(void); HRESULT CheckForBadLoad(void); }; #endif // __THRESHLD_H