windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/ess3/poller.h

185 lines
5.3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//******************************************************************************
//
// POLLER.H
//
// Copyright (C) 1996-1999 Microsoft Corporation
//
//******************************************************************************
#ifndef __WBEM_POLLER__H_
#define __WBEM_POLLER__H_
#include <tss.h>
#include <wbemcomn.h>
#include <map>
#include <analyser.h>
#include <evsink.h>
#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<CCachedObject> 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<CPollingInstruction*, FilterInfo, std::less<CPollingInstruction*>,
wbem_allocator<FilterInfo> > 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