//****************************************************************************** // // Copyright (c) 1999-2000, Microsoft Corporation, All rights reserved // //***************************************************************************** #ifndef __WBEM_MONITOR_PROVIDER__H_ #define __WBEM_MONITOR_PROVIDER__H_ #include "monitor.h" #include class CMonitorProvider : public CUnkBase { protected: STDMETHOD(ProvideEvents)(IWbemObjectSink* pSink, long lFlags); protected: CEssNamespace* m_pNamespace; IWbemEventSink* m_pSink; CCritSec m_cs; typedef std::map TMap; typedef TMap::iterator TIterator; TMap m_mapMonitors; _IWmiObject* m_pAssertClass; _IWmiObject* m_pRetractClass; _IWmiObject* m_pGoingUpClass; _IWmiObject* m_pGoingDownClass; _IWmiObject* m_pErrorClass; long m_lNameHandle; long m_lObjectHandle; long m_lCountHandle; long m_lNewHandle; public: CMonitorProvider(CLifeControl* pControl = NULL); ~CMonitorProvider(); HRESULT SetNamespace(CEssNamespace* pNamespace); HRESULT Shutdown(); HRESULT AddMonitor(LPCWSTR wszName, LPCWSTR wszQuery, long lFlags, IWbemContext* pContext); HRESULT RemoveMonitor(LPCWSTR wszName, IWbemContext* pContext); static HRESULT GetMonitorInfo(IWbemClassObject* pMonitorObj, BSTR* pstrKey, BSTR* pstrQuery, long* plFlags); protected: friend class CFiringMonitorCallback; INTERNAL IWbemEventSink* GetSink() {return m_pSink;} HRESULT ConstructAssert(LPCWSTR wszName, _IWmiObject* pObj, bool bEvent, DWORD dwTotalCount, _IWmiObject** ppEvent); HRESULT ConstructRetract(LPCWSTR wszName, _IWmiObject* pObj, bool bEvent, DWORD dwTotalCount, _IWmiObject** ppEvent); HRESULT ConstructGoingUp(LPCWSTR wszName, DWORD dwNumMatching, _IWmiObject** ppEvent); HRESULT ConstructGoingDown(LPCWSTR wszName, DWORD dwNumMatching, _IWmiObject** ppEvent); HRESULT ConstructError(LPCWSTR wszName, HRESULT hresError, IWbemClassObject* pErrorObj, _IWmiObject** ppEvent); private: HRESULT GetInstance(_IWmiObject* pClass, LPCWSTR wszName, DWORD dwCount, _IWmiObject** ppEvent); HRESULT SetObject(_IWmiObject* pEvent, _IWmiObject* pObj, bool bFromEvent); }; class CFiringMonitorCallback : public CMonitorCallback { protected: long m_lRef; CMonitorProvider* m_pProvider; WString m_wsName; IWbemEventSink* m_pSink; public: CFiringMonitorCallback(CMonitorProvider* pProvider, LPCWSTR wszName); ~CFiringMonitorCallback(); HRESULT Initialize(); LPCWSTR GetName() {return m_wsName;} virtual ULONG STDMETHODCALLTYPE AddRef(); virtual ULONG STDMETHODCALLTYPE Release(); virtual HRESULT Assert(_IWmiObject* pObj, LPCWSTR wszPath, bool bEvent, DWORD dwTotalCount); virtual HRESULT Retract(_IWmiObject* pObj, LPCWSTR wszPath, bool bEvent, DWORD dwTotalCount); virtual HRESULT GoingUp(DWORD dwNumMatching); virtual HRESULT GoingDown(DWORD dwNumMatching); virtual HRESULT Error(HRESULT hresError, IWbemClassObject* pErrorObj); protected: bool CheckSink(); HRESULT FireEvent(_IWmiObject* pEvent); }; #endif