|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name : ControlChannel.cxx
Abstract: Defines the functions used to access the control channel.
Author:
Murali R. Krishnan ( MuraliK ) 15-Oct-1998 Lei Jin ( leijin ) 13-Apr-1999 Porting
Project:
IIS Worker Process
--*/
# include "precomp.hxx"
# include "ControlChannel.hxx"
/********************************************************************++
UL_CONTROL_CHANNEL::Initialize()
Description: This function initializes the control channel for given address, NSGO, and host name. It opens the control channel, registers a virtual host, and NSGO. After that it registers the URL for which notifications are to be handled within the NSGO.
Arguments:
Returns:
++********************************************************************/
ULONG UL_CONTROL_CHANNEL::Initialize( IN MULTISZ& mszURLList, IN LPCWSTR pwszAppPoolName, IN DWORD dwSiteId ) { ULONG rc; LPCWSTR pwszURL;
if ( m_hControlChannel != NULL) { //
// There is already a control channel
//
DBGPRINTF(( DBG_CONTEXT, "Duplicate open of control channel\n")); return ERROR_DUP_NAME; } //
// 1. Open a control channel object from the UL driver
//
rc = HttpOpenControlChannel( &m_hControlChannel, 0);
if ( NO_ERROR != rc) { IF_DEBUG( ERROR) { DBGPRINTF(( DBG_CONTEXT, "UlOpenControlChannel() failed. Error = %08x. Returning\n", rc )); }
return (rc); }
//
// 2. Create a Config Group on this control channel
//
rc = HttpCreateConfigGroup( m_hControlChannel, &m_ConfigGroupId );
if ( NO_ERROR != rc) { IF_DEBUG(ERROR) { DBGPRINTF(( DBG_CONTEXT, "UlCreateConfigGroup failed. Error=%08x. Returning\n", rc )); }
return rc; }
//
// 3. Insert all specified URLs into the config group
//
pwszURL = mszURLList.First();
while (NULL != pwszURL) { rc = AddURLToConfigGroup(pwszURL, dwSiteId);
if (NO_ERROR != rc) { return rc; }
pwszURL = mszURLList.Next(pwszURL); }
//
// 4. Activate the Control Channel and the Config Group
//
HTTP_ENABLED_STATE ccState = HttpEnabledStateActive;
rc = HttpSetControlChannelInformation( m_hControlChannel, HttpControlChannelStateInformation, &ccState, sizeof(ccState));
if ( NO_ERROR != rc) { IF_DEBUG(ERROR) { DBGPRINTF(( DBG_CONTEXT, "Unable to activate ControlChannel. Error=%08x. Returning\n", rc )); }
return rc; }
HTTP_CONFIG_GROUP_STATE cgState;
cgState.Flags.Present = 1; cgState.State = HttpEnabledStateActive; rc = HttpSetConfigGroupInformation( m_hControlChannel, m_ConfigGroupId, HttpConfigGroupStateInformation, &cgState, sizeof(cgState));
if ( NO_ERROR != rc) { IF_DEBUG(ERROR) { DBGPRINTF(( DBG_CONTEXT, "Unable to activate Config Group. Error=%08x. Returning\n", rc )); }
return rc; }
//
// 5. Create an AppPool
//
rc = HttpCreateAppPool( &m_hAppPool, pwszAppPoolName, 0, 0 );
if ( NO_ERROR != rc) { IF_DEBUG(ERROR) { DBGPRINTF(( DBG_CONTEXT, "UlCreateAppPool failed for AppPool '%ws'. Error=%08x. Returning\n", pwszAppPoolName, rc )); }
return rc; } //
// 6. Associate AppPool with the config group
//
HTTP_CONFIG_GROUP_APP_POOL AppPoolConfig;
AppPoolConfig.Flags.Present = 1; AppPoolConfig.AppPoolHandle = m_hAppPool; rc = HttpSetConfigGroupInformation( m_hControlChannel, m_ConfigGroupId, HttpConfigGroupAppPoolInformation, &AppPoolConfig, sizeof(AppPoolConfig) ); if ( NO_ERROR != rc) { IF_DEBUG(ERROR) { DBGPRINTF(( DBG_CONTEXT, "UlSetConfigGroupInformation failed for AppPool '%ws'. Error=%08x. Returning\n", pwszAppPoolName, rc )); }
return rc; }
//
// 7. Enable the app pool
//
HTTP_APP_POOL_ENABLED_STATE NewHttpAppPoolState = HttpAppPoolEnabled;
rc = HttpSetAppPoolInformation( m_hAppPool, // app pool handle
HttpAppPoolStateInformation, // information class
reinterpret_cast <VOID *> ( &NewHttpAppPoolState ), // data
sizeof( HTTP_APP_POOL_ENABLED_STATE ) // data length
);
if ( rc != NO_ERROR ) { IF_DEBUG(ERROR) { DBGPRINTF(( DBG_CONTEXT, "HttpSetAppPoolInformation failed for AppPool '%ws'. Error=%08x. Returning\n", pwszAppPoolName, rc )); }
return rc;
}
return (rc); } // UL_CONTROL_CHANNEL::Initialize()
/********************************************************************++
++********************************************************************/
ULONG UL_CONTROL_CHANNEL::Cleanup(void) { ULONG rc = NO_ERROR;
if ( m_hControlChannel != NULL) { if ( ! HTTP_IS_NULL_ID(&m_ConfigGroupId) ) { rc = HttpDeleteConfigGroup( m_hControlChannel, m_ConfigGroupId); HTTP_SET_NULL_ID(&m_ConfigGroupId); }
if ( NULL != m_hAppPool ) { if ( !::CloseHandle( m_hAppPool)) { rc = GetLastError(); } }
m_hAppPool = NULL; if (!::CloseHandle( m_hControlChannel)) { rc = GetLastError(); } m_hControlChannel = NULL; } return (rc); } // UL_CONTROL_CHANNEL::Cleanup()
/********************************************************************++
++********************************************************************/
ULONG UL_CONTROL_CHANNEL::AddURLToConfigGroup( IN LPCWSTR pwszURL, IN DWORD dwSiteId ) { //
// Add the URL to the Config Group
//
ULONG rc;
HTTP_URL_CONTEXT UrlContext = dwSiteId; UrlContext = UrlContext << 32;
rc = HttpAddUrlToConfigGroup( m_hControlChannel, m_ConfigGroupId, pwszURL, UrlContext ); if ( NO_ERROR != rc) { IF_DEBUG (ERROR) { DBGPRINTF((DBG_CONTEXT, "UlAddUrlToConfigGroup() failed. Error=%08x\n", rc)); } }
return (rc); }
/************************ End of File ***********************/
|