//****************************************************************************** // // AGGREG.H // // Copyright (C) 1996-1999 Microsoft Corporation // //****************************************************************************** #ifndef __WBEM_AGGREGATOR__H_ #define __WBEM_AGGREGATOR__H_ #include #include #include "tss.h" #include "binding.h" #include #include "postpone.h" class CEventAggregator : public COwnedEventSink { protected: long m_lNumProperties; // immutable CPropertyName* m_aProperties; // immutable double m_fTolerance; // immutable CEssNamespace* m_pNamespace; // immutable CEvalTree* m_pHavingTree; // immutable CCritSec m_cs; static IWbemClassObject* mstatic_pClass; class CBucket { protected: IWbemEvent* m_pRepresentative; DWORD m_dwCount; CVarVector* m_pvvData; public: CBucket(IWbemEvent* pEvent, CVarVector* pvvData); ~CBucket(); BOOL CompareTo(CVarVector& vv); HRESULT AddEvent(IWbemEvent* pEvent); HRESULT MakeAggregateEvent(IWbemEvent** ppAggEvent) NOCS; CBucket* Clone(); }; class CBucketInstruction : public CTimerInstruction { long m_lRefCount; CEventAggregator* m_pAggregator; CBucket* m_pBucket; CWbemInterval m_Interval; public: CBucketInstruction(CEventAggregator* pAggregator, CBucket* pBucket, double fMsTimeout); ~CBucketInstruction(); INTERNAL CEventAggregator* GetAggregator() {return m_pAggregator;} void AddRef(); void Release(); int GetInstructionType(); CWbemTime GetNextFiringTime(CWbemTime LastFiringTime, OUT long* plFiringCount) const; CWbemTime GetFirstFiringTime() const; HRESULT Fire(long lNumTimes, CWbemTime NextFiringTime); }; class CAggregatorInstructionTest : public CInstructionTest { CEventAggregator* m_pAgg; public: CAggregatorInstructionTest(CEventAggregator* pAgg) : m_pAgg(pAgg){} BOOL operator()(CTimerInstruction* pToTest); }; friend CBucket; friend CBucketInstruction; CUniquePointerArray m_apBuckets; // changes public: CEventAggregator(CEssNamespace* pNamespace, CAbstractEventSink* pDest); ~CEventAggregator(); HRESULT Deactivate(bool bFire); HRESULT SetQueryExpression(CContextMetaData* pMeta, QL_LEVEL_1_RPN_EXPRESSION* pExpr); HRESULT CopyStateTo(CEventAggregator* pOther); HRESULT Indicate(long lNumEvents, IWbemEvent** apEvents, CEventContext* pContext); CEventFilter* GetEventFilter() {return m_pOwner->GetEventFilter();} public: static HRESULT Initialize(IWbemServices* pNamespace); static HRESULT Shutdown(); protected: HRESULT DispatchBucket(CBucket* pBucket); HRESULT ComputeAggregationVector(IN IWbemEvent* pEvent, OUT CVarVector& vv); HRESULT Process(IWbemEvent* pEvent); HRESULT AddEventToBucket(IWbemEvent* pEvent, ACQUIRE CVarVector* pvv, CBucket** ppCreatedBucket); HRESULT PostponeFireAllBuckets(); HRESULT FireEvent(IWbemClassObject* pAggEvent, bool bRightNow); HRESULT PostponeDispatchFirstBucket(); HRESULT PostponeIndicate(CAbstractEventSink* pDest, IWbemEvent* pEvent); }; class CPostponedIndicate : public CPostponedRequest { protected: CAbstractEventSink* m_pDest; IWbemEvent* m_pEvent; public: CPostponedIndicate(CAbstractEventSink* pDest, IWbemEvent* pEvent) : m_pDest(pDest), m_pEvent(pEvent) { if(m_pDest) m_pDest->AddRef(); if(m_pEvent) m_pEvent->AddRef(); } ~CPostponedIndicate() { if(m_pDest) m_pDest->Release(); if(m_pEvent) m_pEvent->Release(); } HRESULT Execute(CEssNamespace* pNamespace) { // BUGBUG: context if(m_pDest) return m_pDest->Indicate(1, &m_pEvent, NULL); else return WBEM_E_OUT_OF_MEMORY; } }; #endif