//****************************************************************************** // // POLLER.H // // Copyright (C) 1996-1999 Microsoft Corporation // //****************************************************************************** #ifndef __WBEM_POLLER__H_ #define __WBEM_POLLER__H_ #include #include #include #include #include #pragma warning(disable: 4786) class CEssNamespace; class CBasePollingInstruction : public CTimerInstruction { public: void AddRef(); void Release(); int GetInstructionType() {return INSTTYPE_INTERNAL;} virtual CWbemTime GetNextFiringTime(CWbemTime LastFiringTime, OUT long* plFiringCount) const; virtual CWbemTime GetFirstFiringTime() const; virtual HRESULT Fire(long lNumTimes, CWbemTime NextFiringTime); bool DeleteTimer(); public: CBasePollingInstruction(CEssNamespace* pNamespace); virtual ~CBasePollingInstruction(); HRESULT Initialize(LPCWSTR wszLanguage, LPCWSTR wszQuery, DWORD dwMsInterval, bool bAffectsQuota = false); void Cancel(); protected: long m_lRef; CEssNamespace* m_pNamespace; BSTR m_strLanguage; BSTR m_strQuery; CWbemInterval m_Interval; IServerSecurity* m_pSecurity; bool m_bUsedQuota; bool m_bCancelled; HANDLE m_hTimer; CCritSec m_cs; protected: HRESULT ExecQuery(); virtual HRESULT ProcessObject(_IWmiObject* pObj) = 0; virtual HRESULT ProcessQueryDone(HRESULT hresQuery, IWbemClassObject* pError) = 0; virtual BOOL CompareTo(CBasePollingInstruction* pOther); static void staticTimerCallback(void* pParam, BOOLEAN); void Destroy(); }; class CPollingInstruction : public CBasePollingInstruction { public: CPollingInstruction(CEssNamespace* pNamespace); ~CPollingInstruction(); HRESULT Initialize(LPCWSTR wszLanguage, LPCWSTR wszQuery, DWORD dwMsInterval, DWORD dwEventMask, CEventFilter* pDest); HRESULT FirstExecute(); protected: DWORD m_dwEventMask; CEventFilter* m_pDest; bool m_bOnRestart; void* m_pUser; struct CCachedObject { BSTR m_strPath; _IWmiObject* m_pObject; CCachedObject(_IWmiObject* pObject); ~CCachedObject(); BOOL IsValid(){ return (NULL != m_strPath); }; static int __cdecl compare(const void* pelem1, const void* pelem2); }; typedef CUniquePointerArray CCachedArray; CCachedArray* m_papPrevObjects; CCachedArray* m_papCurrentObjects; friend class CPoller; protected: HRESULT RaiseCreationEvent(CCachedObject* pNewObj); HRESULT RaiseDeletionEvent(CCachedObject* pOldObj); HRESULT RaiseModificationEvent(CCachedObject* pNewObj, CCachedObject* pOldObj = NULL); static SYSFREE_ME BSTR GetObjectClass(CCachedObject* pObj); HRESULT ProcessObject(_IWmiObject* pObj); HRESULT ProcessQueryDone(HRESULT hresQuery, IWbemClassObject* pError); HRESULT SubtractMemory(CCachedArray* pArray); HRESULT ResetPrevious(); DWORD ComputeObjectMemory(_IWmiObject* pObj); }; class CEventFilterContainer; class CPoller { public: CPoller(CEssNamespace* pEssNamespace); ~CPoller(); void Clear(); HRESULT ActivateFilter(CEventFilter* pDest, LPCWSTR wszQuery, QL_LEVEL_1_RPN_EXPRESSION* pExp); HRESULT DeactivateFilter(CEventFilter* pDest); HRESULT VirtuallyStopPolling(); HRESULT CancelUnnecessaryPolling(); void DumpStatistics(FILE* f, long lFlags); protected: CEssNamespace* m_pNamespace; CQueryAnalyser m_Analyser; BOOL m_bInResync; CCritSec m_cs; struct FilterInfo { BOOL m_bActive; DWORD_PTR m_dwFilterId; }; typedef std::map, wbem_allocator > CInstructionMap; CInstructionMap m_mapInstructions; friend class CKeyTest; class CKeyTest : public CInstructionTest { DWORD_PTR m_dwKey; CInstructionMap& m_mapInstructions; public: CKeyTest(DWORD_PTR dwKey, CInstructionMap& mapInstructions) : m_dwKey(dwKey), m_mapInstructions(mapInstructions) {} BOOL operator()(CTimerInstruction* pToTest) { CInstructionMap::iterator it = m_mapInstructions.find((CPollingInstruction*)pToTest); if(it == m_mapInstructions.end()) return FALSE; if ( !it->second.m_bActive && m_dwKey == 0xFFFFFFFF ) return TRUE; return (it->second.m_dwFilterId == m_dwKey); } }; protected: HRESULT AddInstruction(DWORD_PTR dwKey, CPollingInstruction* pInst); HRESULT ListNonProvidedClasses(IN CClassInformation* pInfo, IN DWORD dwDesiredMask, OUT CClassInfoArray& aNonProvided); BOOL IsClassDynamic(IWbemClassObject* pClass); BOOL AddDynamicClass(IWbemClassObject* pClass, DWORD dwDesiredMask, OUT CClassInfoArray& aNonProvided); }; #endif