You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
443 lines
14 KiB
443 lines
14 KiB
/*
|
|
Copyright (c) 1997-1999 Microsoft Corporation.
|
|
|
|
File: Win32Clock.H
|
|
|
|
Description:
|
|
Alarm event provider - header file defines alarm provider class
|
|
|
|
History:
|
|
*/
|
|
|
|
|
|
#ifndef _WIN32CLOCKPROV_H_
|
|
#define _WIN32CLOCKPROV_H_
|
|
|
|
#include <objbase.h>
|
|
#include <wbemprov.h>
|
|
#include "tss.h"
|
|
#include "datep.h"
|
|
#include <unk.h>
|
|
|
|
/*
|
|
class Win32_CurrentTime
|
|
{
|
|
uint16 Year;
|
|
uint32 Month;
|
|
uint32 Day;
|
|
uint32 DayOfWeek;
|
|
uint32 WeekInMonth;
|
|
uint32 Quarter;
|
|
uint32 Hour;
|
|
uint32 Minute;
|
|
uint32 Second;
|
|
};
|
|
*/
|
|
|
|
#define WIN32LOCALTIMECLASS L"Win32_LocalTime"
|
|
#define WIN32UTCTIMECLASS L"Win32_UTCTime"
|
|
#define INSTMODEVCLASS L"__InstanceModificationEvent"
|
|
|
|
template <class T> class CArray
|
|
{
|
|
int
|
|
m_nElts;
|
|
|
|
struct _Node { ULONG m_Key; T *m_pT; _Node *m_pNext; }
|
|
*m_pHead;
|
|
|
|
CRITICAL_SECTION
|
|
m_hModificationLock;
|
|
|
|
public:
|
|
|
|
CArray(void)
|
|
{
|
|
m_pHead = NULL; m_nElts = 0;
|
|
InitializeCriticalSection(&m_hModificationLock);
|
|
}
|
|
|
|
~CArray(void)
|
|
{
|
|
DeleteCriticalSection(&m_hModificationLock);
|
|
}
|
|
|
|
void Lock(void)
|
|
{ EnterCriticalSection(&m_hModificationLock); }
|
|
|
|
void UnLock(void)
|
|
{ LeaveCriticalSection(&m_hModificationLock); }
|
|
|
|
void Insert(T *pT, ULONG Key)
|
|
// **** to check for dup. keys, change this to sorted order
|
|
{
|
|
Lock();
|
|
|
|
_Node
|
|
*pNewNode = NULL;
|
|
|
|
if(Key == -1) return;
|
|
|
|
pNewNode = new _Node();
|
|
|
|
if(NULL == pNewNode) return;
|
|
|
|
pNewNode->m_pT = pT; pT->AddRef();
|
|
pNewNode->m_Key = Key;
|
|
pNewNode->m_pNext = m_pHead;
|
|
m_pHead = pNewNode;
|
|
|
|
m_nElts++;
|
|
|
|
UnLock();
|
|
}
|
|
|
|
void Remove(T *pT)
|
|
{
|
|
Lock();
|
|
|
|
_Node
|
|
*pCurrent = m_pHead,
|
|
*pPrev = NULL;
|
|
|
|
// **** find element using pointer
|
|
|
|
while((NULL != pCurrent) && (pCurrent->m_pT != pT))
|
|
{
|
|
pPrev = pCurrent;
|
|
pCurrent = pCurrent->m_pNext;
|
|
}
|
|
|
|
// **** remove element, if found, from queue
|
|
|
|
if(NULL != pCurrent)
|
|
{
|
|
if(NULL == pPrev)
|
|
m_pHead = m_pHead->m_pNext;
|
|
else
|
|
pPrev->m_pNext = pCurrent->m_pNext;
|
|
|
|
pCurrent->m_pT->Release();
|
|
delete pCurrent;
|
|
m_nElts--;
|
|
}
|
|
|
|
UnLock();
|
|
}
|
|
|
|
// **** find element by Index
|
|
|
|
T* operator[] (ULONG Index)
|
|
{
|
|
_Node
|
|
*pCurrent = m_pHead;
|
|
|
|
// **** get element using array index
|
|
|
|
if( Index >= m_nElts )
|
|
return NULL;
|
|
|
|
while((NULL != pCurrent) && (Index > 0)) // optimize?
|
|
{
|
|
pCurrent = pCurrent->m_pNext;
|
|
Index--;
|
|
}
|
|
|
|
if(NULL != pCurrent)
|
|
return pCurrent->m_pT;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
// **** get element by key
|
|
|
|
T* operator() (ULONG Key, BOOL bLock = FALSE)
|
|
{
|
|
if(TRUE == bLock) Lock();
|
|
|
|
_Node
|
|
*pCurrent = m_pHead;
|
|
|
|
// **** find element using Key
|
|
|
|
while((pCurrent != NULL) && (pCurrent->m_Key != Key)) // optimize?
|
|
pCurrent = pCurrent->m_pNext;
|
|
|
|
if(NULL != pCurrent)
|
|
return pCurrent->m_pT;
|
|
else
|
|
if(TRUE == bLock) UnLock();
|
|
|
|
return NULL;
|
|
}
|
|
};
|
|
|
|
class CWin32Clock
|
|
:
|
|
public IWbemEventProvider,
|
|
public IWbemEventProviderQuerySink,
|
|
public IWbemServices,
|
|
public IWbemProviderInit
|
|
{
|
|
public:
|
|
|
|
class CScheduledEvent : public CTimerInstruction
|
|
{
|
|
public:
|
|
|
|
enum { TypeNONE = 0, TypeUTC, TypeLocal };
|
|
|
|
ULONG
|
|
m_Type,
|
|
m_cRef, // reference count on this object
|
|
m_dwId; // unique id assigned by WMI
|
|
|
|
ULONGLONG
|
|
m_stLastFiringTime; // the first, and possibly only, firing
|
|
// time for the event generator
|
|
|
|
CWin32Clock
|
|
*m_pWin32Clock; // ptr back to clock obj containing
|
|
// this CScheduledEvent object
|
|
|
|
wchar_t
|
|
*m_WQLStmt; // WQL stmt that defines behavior for
|
|
// this CScheduledEvent object
|
|
|
|
int
|
|
m_nDatePatterns; // # of date pattern objects
|
|
|
|
WQLDateTime
|
|
m_WQLTime; // interprets WQL statement and
|
|
// calculates next firing time
|
|
|
|
// Local members
|
|
|
|
CScheduledEvent();
|
|
~CScheduledEvent();
|
|
|
|
HRESULT Init(CWin32Clock *pClock, wchar_t *WQLStmt, ULONG dwId);
|
|
HRESULT ReInit(wchar_t *WQLStmt);
|
|
|
|
void GetTime(SYSTEMTIME *CurrentTime) const;
|
|
void GetFileTime(FILETIME *CurrentTime) const;
|
|
|
|
// Inherited from CTimerInstruction
|
|
|
|
void AddRef();
|
|
void Release();
|
|
int GetInstructionType();
|
|
|
|
CWbemTime GetNextFiringTime(CWbemTime LastFiringTime,
|
|
long* plFiringCount) const;
|
|
CWbemTime GetFirstFiringTime() const;
|
|
HRESULT Fire(long lNumTimes, CWbemTime NextFiringTime);
|
|
};
|
|
|
|
CLifeControl* m_pControl;
|
|
CCritSec m_csWin32Clock;
|
|
|
|
// **** WMI attributes for both Event and Instance providers
|
|
|
|
CTimerGenerator m_Timer; // timer object to hold pending events
|
|
ULONG m_cRef; // reference count on this object
|
|
IWbemServices *m_pNs; // resource handle to wmi service daemon
|
|
IWbemClassObject *m_pLocalTimeClassDef; // CIM class def for Win32_CurrentTime
|
|
IWbemClassObject *m_pUTCTimeClassDef; // CIM class def for Win32_CurrentTime
|
|
|
|
// **** WMI Event Provider specific attributes
|
|
|
|
ULONGLONG m_MostRecentLocalFiringTime;
|
|
ULONGLONG m_MostRecentUTCFiringTime;
|
|
IWbemObjectSink *m_pSink; // sink object in which to place inst. objs
|
|
IWbemClassObject *m_pInstModClassDef; // class def for __InstanceModificationEvent
|
|
HANDLE m_ClockResetThread; // holds thread that adjusts firing times
|
|
// when the clock is reset
|
|
HWND m_hEventWindowHandle;
|
|
|
|
CArray<CScheduledEvent> m_EventArray; // array of clock provider objects
|
|
|
|
public:
|
|
|
|
CWin32Clock(CLifeControl* pControl);
|
|
~CWin32Clock();
|
|
|
|
// local members
|
|
|
|
static DWORD AsyncEventThread(LPVOID pArg);
|
|
|
|
static HRESULT SystemTimeToWin32_CurrentTime(IWbemClassObject *pClassDef, IWbemClassObject ** pNewInst, SYSTEMTIME *TheTime);
|
|
|
|
HRESULT SendEvent(IWbemClassObject *pSystemTime);
|
|
|
|
HRESULT ReAlignToCurrentTime(void);
|
|
|
|
// IUnknown members
|
|
|
|
STDMETHODIMP QueryInterface(REFIID, LPVOID *);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// Inherited from IWbemEventProvider
|
|
|
|
HRESULT STDMETHODCALLTYPE ProvideEvents(
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pSink,
|
|
/* [in] */ long lFlags);
|
|
|
|
// Inherited from IWbemEventProviderQuerySink
|
|
|
|
HRESULT STDMETHODCALLTYPE NewQuery(
|
|
/* [in] */ unsigned long dwId,
|
|
/* [in] */ wchar_t *wszQueryLanguage,
|
|
/* [in] */ wchar_t *wszQuery);
|
|
|
|
HRESULT STDMETHODCALLTYPE CancelQuery(
|
|
/* [in] */ unsigned long dwId);
|
|
|
|
// Inherited from IWbemProviderInit
|
|
|
|
HRESULT STDMETHODCALLTYPE Initialize(
|
|
/* [in] */ LPWSTR pszUser,
|
|
/* [in] */ LONG lFlags,
|
|
/* [in] */ LPWSTR pszNamespace,
|
|
/* [in] */ LPWSTR pszLocale,
|
|
/* [in] */ IWbemServices __RPC_FAR *pNamespace,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink);
|
|
|
|
// Inherited from IWbemServices
|
|
|
|
HRESULT STDMETHODCALLTYPE OpenNamespace(
|
|
/* [in] */ const BSTR Namespace,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [unique][in][out] */ IWbemServices __RPC_FAR *__RPC_FAR *ppWorkingNamespace,
|
|
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppResult) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE CancelAsyncCall(
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pSink) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE QueryObjectSink(
|
|
/* [in] */ long lFlags,
|
|
/* [out] */ IWbemObjectSink __RPC_FAR *__RPC_FAR *ppResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE GetObject(
|
|
/* [in] */ const BSTR ObjectPath,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [unique][in][out] */ IWbemClassObject __RPC_FAR *__RPC_FAR *ppObject,
|
|
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE GetObjectAsync(
|
|
/* [in] */ const BSTR ObjectPath,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler);
|
|
|
|
HRESULT STDMETHODCALLTYPE PutClass(
|
|
/* [in] */ IWbemClassObject __RPC_FAR *pObject,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE PutClassAsync(
|
|
/* [in] */ IWbemClassObject __RPC_FAR *pObject,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE DeleteClass(
|
|
/* [in] */ const BSTR Class,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE DeleteClassAsync(
|
|
/* [in] */ const BSTR Class,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE CreateClassEnum(
|
|
/* [in] */ const BSTR Superclass,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE CreateClassEnumAsync(
|
|
/* [in] */ const BSTR Superclass,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE PutInstance(
|
|
/* [in] */ IWbemClassObject __RPC_FAR *pInst,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE PutInstanceAsync(
|
|
/* [in] */ IWbemClassObject __RPC_FAR *pInst,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE DeleteInstance(
|
|
/* [in] */ const BSTR ObjectPath,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE DeleteInstanceAsync(
|
|
/* [in] */ const BSTR ObjectPath,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE CreateInstanceEnum(
|
|
/* [in] */ const BSTR Class,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE CreateInstanceEnumAsync(
|
|
/* [in] */ const BSTR Class,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler);
|
|
|
|
HRESULT STDMETHODCALLTYPE ExecQuery(
|
|
/* [in] */ const BSTR QueryLanguage,
|
|
/* [in] */ const BSTR Query,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE ExecQueryAsync(
|
|
/* [in] */ const BSTR QueryLanguage,
|
|
/* [in] */ const BSTR Query,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE ExecNotificationQuery(
|
|
/* [in] */ const BSTR QueryLanguage,
|
|
/* [in] */ const BSTR Query,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum) {return WBEM_E_NOT_SUPPORTED;};
|
|
|
|
HRESULT STDMETHODCALLTYPE ExecNotificationQueryAsync(
|
|
/* [in] */ const BSTR QueryLanguage,
|
|
/* [in] */ const BSTR Query,
|
|
/* [in] */ long lFlags,
|
|
/* [in] */ IWbemContext __RPC_FAR *pCtx,
|
|
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
|
|
HRESULT STDMETHODCALLTYPE ExecMethod( const BSTR, const BSTR, long, IWbemContext*,
|
|
IWbemClassObject*, IWbemClassObject**, IWbemCallResult**) {return WBEM_E_NOT_SUPPORTED;}
|
|
|
|
HRESULT STDMETHODCALLTYPE ExecMethodAsync( const BSTR, const BSTR, long,
|
|
IWbemContext*, IWbemClassObject*, IWbemObjectSink*) {return WBEM_E_NOT_SUPPORTED;}
|
|
};
|
|
|
|
#endif
|