windows-nt/Source/XPSP1/NT/net/ias/sdo/sdoias/sdoservice.cpp

171 lines
4.5 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
///////////////////////////////////////////////////////////////////////////
//
// Copyright(C) 1997-1998 Microsoft Corporation all rights reserved.
//
// Module: sdoservice.cpp
//
// Project: Everest
//
// Description: IAS Service SDO Implementation
//
// Author: TLP 2/3/98
//
///////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "sdoservice.h"
#include "sdocoremgr.h"
/////////////////////////////////////////////////////////////
// CSdoService Class - Implements ISdoService
/////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
CSdoService::CSdoService()
: m_theThread(NULL)
{
}
//////////////////////////////////////////////////////////////////////////////
CSdoService::~CSdoService()
{
}
//////////////////////
// ISdoService Methods
//////////////////////
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSdoService::InitializeService(SERVICE_TYPE eServiceType)
{
// Check preconditions...
//
_ASSERT ( SERVICE_TYPE_MAX > eServiceType );
// Use this to debug the service...
// DebugBreak();
return S_OK;
}
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSdoService::ShutdownService(SERVICE_TYPE eServiceType)
{
// Check preconditions...
//
_ASSERT ( SERVICE_TYPE_MAX > eServiceType );
return S_OK;
}
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSdoService::StartService(SERVICE_TYPE eServiceType)
{
// Check preconditions...
//
_ASSERT ( SERVICE_TYPE_MAX > eServiceType );
CSdoLock theLock(*this);
IASTracePrintf("Service SDO is starting service: %d...", eServiceType);
return GetCoreManager().StartService(eServiceType);
}
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSdoService::StopService(SERVICE_TYPE eServiceType)
{
// Check preconditions...
//
_ASSERT ( SERVICE_TYPE_MAX > eServiceType );
CSdoLock theLock(*this);
IASTracePrintf("Service SDO is stopping service: %d...", eServiceType);
return GetCoreManager().StopService(eServiceType);
}
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSdoService::ConfigureService (SERVICE_TYPE eServiceType)
{
// Check preconditions...
//
_ASSERT ( SERVICE_TYPE_MAX > eServiceType );
CSdoLock theLock(*this);
if ( m_theThread )
{
// We already have a thread, so just interrupt it to reset the timer.
QueueUserAPC(InterruptThread, m_theThread, 0);
}
else
{
// Create a new thread.
DWORD threadId;
m_theThread = CreateThread(
NULL,
0,
DebounceAndConfigure,
(LPVOID)this,
0,
&threadId
);
if ( ! m_theThread )
{
// We couldn't create a new thread, so we'll just do it ourself.
UpdateConfiguration();
}
}
return S_OK;
}
//////////////////
// Private Methods
//////////////////
//////////////////////////////////////////////////////////////////////////////
void CSdoService::UpdateConfiguration()
{
// Clear out the thread handle.
CSdoLock theLock(*this);
if ( m_theThread )
{
CloseHandle( m_theThread );
m_theThread = NULL;
}
IASTracePrintf("Service SDO is configuring services...");
GetCoreManager().UpdateConfiguration();
}
//////////////////////////////////////////////////////////////////////////////
// Empty APC used to interrupt the debounce thread.
//////////////////////////////////////////////////////////////////////////////
VOID WINAPI CSdoService::InterruptThread(
/*[in]*/ ULONG_PTR dwParam
)
{
}
// Debounce interval in milliseconds.
const DWORD DEBOUNCE_INTERVAL = 5000;
//////////////////////////////////////////////////////////////////////////////
// Entry point for the debounce thread.
//////////////////////////////////////////////////////////////////////////////
DWORD WINAPI CSdoService::DebounceAndConfigure(
/*[in]*/ LPVOID pSdoService
)
{
// Loop until we sleep for DEBOUNCE_INTERVAL without being interrupted.
while (SleepEx(DEBOUNCE_INTERVAL, TRUE) == WAIT_IO_COMPLETION) { }
// Update the configuration.
((CSdoService*)pSdoService)->UpdateConfiguration();
return 0;
}