/*++ 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 ( &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 ***********************/