2025-04-27 07:49:33 -04:00

207 lines
3.7 KiB
C++

// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved
#include <windows.h>
#include <snmptempl.h>
#include <snmpmt.h>
#include <typeinfo.h>
#include <process.h>
#include <objbase.h>
#include <stdio.h>
#include <wbemidl.h>
#include "classfac.h"
#include "guids.h"
#include <snmpevt.h>
#include <snmpthrd.h>
#include <snmplog.h>
#include <snmpcl.h>
#include <instpath.h>
#include <snmpcont.h>
#include <snmptype.h>
#include <snmpauto.h>
#include <snmpobj.h>
#include <genlex.h>
#include <sql_1.h>
#include <objpath.h>
#include "wndtime.h"
#include "rmon.h"
ProviderStore* TimerWindow::m_provMap = NULL;
TimerWindow::TimerWindow(ProviderStore* provMap)
{
m_provMap = provMap;
m_IsValid = FALSE;
WNDCLASS w ;
w.style = CS_HREDRAW | CS_VREDRAW;
w.lpfnWndProc = TimerWindowProc;
w.cbClsExtra = 0;
w.cbWndExtra = 0;
w.hInstance = 0;
w.hIcon = NULL;
w.hCursor = NULL;
w.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
w.lpszMenuName = NULL;
w.lpszClassName = L"TimerWindow";
if (0 != RegisterClass(&w))
{
m_timerWindowHandle = CreateWindow (L"TimerWindow", L"TimerWindow", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, 0, NULL);
if (NULL != m_timerWindowHandle)
{
m_IsValid = ( 0 != SetTimer(m_timerWindowHandle, WINDOW_TIMER_ID, WINDOW_TIMER_STROBE_PERIOD, NULL) );
}
}
else
{
m_timerWindowHandle = NULL;
}
}
TimerWindow::~TimerWindow()
{
if (NULL != m_timerWindowHandle)
{
if (m_IsValid)
{
KillTimer(m_timerWindowHandle, WINDOW_TIMER_ID);
}
DestroyWindow(m_timerWindowHandle);
}
}
LONG CALLBACK TimerWindow::TimerWindowProc(
HWND hWnd ,UINT message ,
WPARAM wParam ,LPARAM lParam)
{
LONG ret = 0 ;
// send timer events to the Timer
if ((message == WM_TIMER) && (wParam == WINDOW_TIMER_ID))
{
m_provMap->Lock();
ProviderStore tmpProvMap;
POSITION pos = m_provMap->GetStartPosition();
while (pos)
{
ULONG rkey;
TopNTableProv *provObject;
m_provMap->GetNextAssoc(pos, rkey, provObject);
tmpProvMap.SetAt(rkey, provObject);
}
m_provMap->Unlock();
pos = tmpProvMap.GetStartPosition();
while (pos)
{
ULONG rkey;
TopNTableProv *provObject;
tmpProvMap.GetNextAssoc(pos, rkey, provObject);
provObject->Strobe();
}
tmpProvMap.RemoveAll();
}
else
{
ret = DefWindowProc(hWnd, message, wParam, lParam);
}
return ret;
}
BOOL ProviderStore::RegisterProviderWithTimer(TopNTableProv* prov)
{
if (Lock())
{
if (m_timerThread == NULL)
{
m_timerThread = new TimerThread(this);
m_timerThread->WaitForStartup();
if (!m_timerThread->IsValid())
{
delete m_timerThread;
m_timerThread = NULL;
Unlock();
return FALSE;
}
}
SetAt((ULONG)(prov), prov);
Unlock();
}
else
{
return FALSE;
}
return TRUE;
}
BOOL ProviderStore::UnregisterProviderWithTimer(TopNTableProv* prov)
{
if (Lock())
{
RemoveKey((ULONG)(prov));
if (IsEmpty())
{
delete m_timerThread;
m_timerThread = NULL;
}
Unlock();
}
else
{
return FALSE;
}
return TRUE;
}
ProviderStore::ProviderStore()
{
InitHashTable(23);
m_timerThread = NULL;
}
ProviderStore::~ProviderStore()
{
if (NULL != m_timerThread)
{
Lock();
delete m_timerThread;
RemoveAll();
Unlock();
}
}
TimerThread::TimerThread(ProviderStore* parent)
{
m_wndTimer = NULL;
m_parent = parent;
}
void TimerThread::Initialise()
{
CoInitialize(NULL);
m_wndTimer = new TimerWindow(m_parent);
}
void TimerThread::Uninitialise()
{
delete m_wndTimer;
CoUninitialize();
}