|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-1997 Microsoft Corporation
//
// Module Name:
// Iis.cpp
//
// Abstract:
// Implementation of the CNNTPVirtualRootParamsPage class.
//
// Author:
// Pete Benoit (v-pbenoi) October 16, 1996
// David Potter (davidp) October 17, 1996
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <inetinfo.h>
#include "IISClEx4.h"
#include "nntpprop.h"
#include "ExtObj.h"
#include "DDxDDv.h"
#include "HelpData.h" // for g_rghelpmap*
#include <iadm.h>
#include <iiscnfgp.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CNNTPVirtualRootParamsPage property page
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CNNTPVirtualRootParamsPage, CBasePropertyPage)
/////////////////////////////////////////////////////////////////////////////
// Message Maps
BEGIN_MESSAGE_MAP(CNNTPVirtualRootParamsPage, CBasePropertyPage) //{{AFX_MSG_MAP(CNNTPVirtualRootParamsPage)
ON_CBN_SELCHANGE(IDC_PP_NNTP_INSTANCEID, OnChangeRequiredField) ON_BN_CLICKED(IDC_PP_NNTP_REFRESH, OnRefresh) //}}AFX_MSG_MAP
// TODO: Modify the following lines to represent the data displayed on this page.
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNNTPVirtualRootParamsPage::CNNTPVirtualRootParamsPage
//
// Routine Description:
// Default constructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CNNTPVirtualRootParamsPage::CNNTPVirtualRootParamsPage(void) : CBasePropertyPage(g_rghelpmapIISParameters) { // TODO: Modify the following lines to represent the data displayed on this page.
//{{AFX_DATA_INIT(CNNTPVirtualRootParamsPage)
m_strInstanceId = _T(""); //}}AFX_DATA_INIT
m_fReadList = FALSE; try { m_strServiceName = IIS_SVC_NAME_NNTP; } // try
catch (CMemoryException * pme) { pme->ReportError(); pme->Delete(); } // catch: CMemoryException
// Setup the property array.
{ m_rgProps[epropServiceName].Set(REGPARAM_IIS_SERVICE_NAME, m_strServiceName, m_strPrevServiceName); m_rgProps[epropInstanceId].Set(REGPARAM_IIS_INSTANCEID, m_strInstanceId, m_strPrevInstanceId); } // Setup the property array
m_iddPropertyPage = IDD_PP_NNTP_PARAMETERS; m_iddWizardPage = IDD_WIZ_NNTP_PARAMETERS; m_idcPPTitle = IDC_PP_NNTP_TITLE;
} //*** CNNTPVirtualRootParamsPage::CNNTPVirtualRootParamsPage()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNNTPVirtualRootParamsPage::DoDataExchange
//
// Routine Description:
// Do data exchange between the dialog and the class.
//
// Arguments:
// pDX [IN OUT] Data exchange object
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CNNTPVirtualRootParamsPage::DoDataExchange(CDataExchange * pDX) { CString strInstanceId;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CBasePropertyPage::DoDataExchange(pDX); // TODO: Modify the following lines to represent the data displayed on this page.
//{{AFX_DATA_MAP(CNNTPVirtualRootParamsPage)
DDX_Control(pDX, IDC_PP_NNTP_INSTANCEID, m_cInstanceId); DDX_Text(pDX, IDC_PP_NNTP_INSTANCEID, m_strInstanceName); //}}AFX_DATA_MAP
if (pDX->m_bSaveAndValidate) { if (!BBackPressed()) { DDV_RequiredText(pDX, IDC_PP_NNTP_INSTANCEID, IDC_PP_NNTP_INSTANCEID_LABEL, m_strInstanceName); } // if: Back button not pressed
m_strInstanceId = NameToMetabaseId( m_strInstanceName );
m_strServiceName = IIS_SVC_NAME_NNTP; } // if: saving data from dialog
} //*** CNNTPVirtualRootParamsPage::DoDataExchange()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNNTPVirtualRootParamsPage::OnInitDialog
//
// Routine Description:
// Handler for the WM_INITDIALOG message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE We need the focus to be set for us.
// FALSE We already set the focus to the proper control.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CNNTPVirtualRootParamsPage::OnInitDialog(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState());
CBasePropertyPage::OnInitDialog();
m_cInstanceId.EnableWindow( TRUE );
OnChangeCtrl();
if (!BWizard()) { FillServerList(); }
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
} //*** CNNTPVirtualRootParamsPage::OnInitDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNNTPVirtualRootParamsPage::OnSetActive
//
// Routine Description:
// Handler for the PSN_SETACTIVE message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Page successfully initialized.
// FALSE Page not initialized.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CNNTPVirtualRootParamsPage::OnSetActive(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState());
// Enable/disable the Next/Finish button.
if (BWizard()) { FillServerList(); } // if: in the wizard
return CBasePropertyPage::OnSetActive();
} //*** CNNTPVirtualRootParamsPage::OnSetActive()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNNTPVirtualRootParamsPage::OnChangeRequiredField
//
// Routine Description:
// Handler for the EN_CHANGE message on the Share name or Path edit
// controls.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CNNTPVirtualRootParamsPage::OnChangeRequiredField(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState());
OnChangeCtrl();
if (BWizard()) { SetEnableNext(); } // if: in a wizard
} //*** CNNTPVirtualRootParamsPage::OnChangeRequiredField()
////
void CNNTPVirtualRootParamsPage::FillServerList( ) /*++
Routine Description:
Populate server combo box with server list relevant to current service type, set current selection based on server instance ID enable Finish button if list non empty
Arguments:
None
Returns:
Nothing
--*/ {
int nIndex;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//
// build array if not already done
//
if ( !m_fReadList ) { HRESULT hr; hr = ReadList( &m_ServiceArray, MD_SERVICE_ROOT_NNTP, LPCTSTR(Peo()->StrNodeName()) ); if (FAILED(hr)) { CString err;
if ( REGDB_E_IIDNOTREG == hr) { err.Format(IDS_IIS_PROXY_MISCONFIGURED, Peo()->StrNodeName()); AfxMessageBox(err); } else { CString fmtError; DWORD dwError;
if ( (HRESULT_FACILITY(hr) == FACILITY_WIN32) || (HRESULT_FACILITY(hr) == FACILITY_NT_BIT)) { dwError = (DWORD) HRESULT_CODE(hr); } else { dwError = (DWORD) hr; } FormatError(fmtError, dwError); err.Format(IDS_ENUMERATE_FAILED, Peo()->StrNodeName(), fmtError); AfxMessageBox(err); }
m_cInstanceId.EnableWindow(FALSE); } else { m_cInstanceId.EnableWindow(TRUE); } m_fReadList = TRUE; }
m_strInstanceName = MetabaseIdToName( m_strInstanceId );
// add to combo from array
DWORD nAddCount = 0;
m_cInstanceId.ResetContent();
for ( nIndex = 0 ; nIndex < m_ServiceArray.GetSize() ; ++nIndex ) { //
// Only add sites that are not cluster enabled or have the same ID as the resource
//
if ( (!m_ServiceArray.ElementAt(nIndex).IsClusterEnabled()) || (!lstrcmp( m_ServiceArray.ElementAt( nIndex ).GetId(), m_strInstanceId)) ) { if ( m_cInstanceId.AddString( m_ServiceArray.ElementAt( nIndex ).GetName() ) < 0 ) { OutputDebugStringW( L"Error add\n" ); } else { nAddCount++; } } }
if (0 == nAddCount) { m_cInstanceId.EnableWindow(FALSE);
if (BWizard()) { CString err;
EnableNext(FALSE);
err.Format(IDS_ALL_INSTANCES_CLUSTER_ENABLED, Peo()->StrNodeName()); AfxMessageBox(err); } } else { if (BWizard()) { SetEnableNext(); m_cInstanceId.SetCurSel(0); } else { nIndex = m_cInstanceId.FindStringExact(-1, m_strInstanceName);
if ( nIndex != CB_ERR ) { m_cInstanceId.SetCurSel(nIndex); } } } }
HRESULT CNNTPVirtualRootParamsPage::ReadList( CArray <IISMapper, IISMapper>* pMapperArray, LPWSTR pszPath, LPCWSTR wcsMachineName ) /*++
Routine Description:
Read a server list from metabase based on metabase path
Arguments:
pMapperArray - array where to add list of ( ServerComment, InstanceId ) pairs pszPath - metabase path, e.g. LM/NNTPSVC
Returns:
Error code, S_OK if success
--*/ { IMSAdminBaseW * pcAdmCom = NULL; METADATA_HANDLE hmd; DWORD i; WCHAR aId[METADATA_MAX_NAME_LEN]; WCHAR aName[512]; HRESULT hRes = S_OK; COSERVERINFO csiMachine; MULTI_QI QI = {&IID_IMSAdminBase, NULL, 0}; ZeroMemory( &csiMachine, sizeof(COSERVERINFO) ); csiMachine.pwszName = (LPWSTR)wcsMachineName;
hRes = CoCreateInstanceEx( GETAdminBaseCLSID(TRUE), NULL, CLSCTX_SERVER, &csiMachine, 1, &QI );
if ( SUCCEEDED(hRes) && SUCCEEDED(QI.hr)) { pcAdmCom = (IMSAdminBaseW *)QI.pItf; if( SUCCEEDED( hRes = pcAdmCom->OpenKey( METADATA_MASTER_ROOT_HANDLE, pszPath, METADATA_PERMISSION_READ, 5000, &hmd)) ) { for ( i = 0 ; SUCCEEDED(pcAdmCom->EnumKeys( hmd, L"", aId, i )) ; ++i ) { METADATA_RECORD md; DWORD dwReq = sizeof(aName);
memset( &md, 0, sizeof(md) ); md.dwMDDataType = STRING_METADATA; md.dwMDUserType = IIS_MD_UT_SERVER; md.dwMDIdentifier = MD_SERVER_COMMENT; md.dwMDDataLen = sizeof(aName); md.pbMDData = (LPBYTE)aName;
if ( SUCCEEDED( pcAdmCom->GetData( hmd, aId, &md, &dwReq) ) ) { DWORD dwClusterEnabled = 0;
memset( &md, 0, sizeof(md) ); md.dwMDDataType = DWORD_METADATA; md.dwMDUserType = IIS_MD_UT_SERVER; md.dwMDIdentifier = MD_CLUSTER_ENABLED; md.dwMDDataLen = sizeof(dwClusterEnabled); md.pbMDData = (LPBYTE)&dwClusterEnabled;
pcAdmCom->GetData( hmd, aId, &md, &dwReq); IISMapper* pMap = new IISMapper( aName, aId, dwClusterEnabled ); if ( pMap ) { pMapperArray->Add( *pMap ); } else { hRes = E_OUTOFMEMORY; break; } } }
pcAdmCom->CloseKey( hmd ); }
pcAdmCom->Release(); }
return hRes; }
LPWSTR CNNTPVirtualRootParamsPage::NameToMetabaseId( CString& strName ) /*++
Routine Description:
Convert ServerComment to InstanceId
Arguments:
strName - ServerComment
Returns:
InstanceId if strName found in array, otherwise NULL
--*/ { DWORD i;
for ( i = 0 ; i < (DWORD)m_ServiceArray.GetSize() ; ++i ) { if ( !m_ServiceArray.ElementAt( i ).GetName().Compare( strName ) ) { return (LPWSTR)(LPCTSTR)(m_ServiceArray.ElementAt( i ).GetId()); } }
return NULL; }
LPWSTR CNNTPVirtualRootParamsPage::MetabaseIdToName( CString& strId ) /*++
Routine Description:
Convert InstanceId to ServerComment
Arguments:
strId - InstanceID
Returns:
InstanceId if strName found in array. If not found return 1st array element if array not empty, otherwise NULL
--*/ { DWORD i;
for ( i = 0 ; i < (DWORD)m_ServiceArray.GetSize() ; ++i ) { if ( !m_ServiceArray.ElementAt( i ).GetId().Compare( strId ) ) { return (LPWSTR)(LPCTSTR)(m_ServiceArray.ElementAt( i ).GetName()); } }
return m_ServiceArray.GetSize() == 0 ? NULL : (LPWSTR)(LPCTSTR)(m_ServiceArray.ElementAt( 0 ).GetName()); }
VOID CNNTPVirtualRootParamsPage::SetEnableNext( VOID ) /*++
Routine Description:
Set enable state of Finish button
Arguments:
None
Returns:
Nothing
--*/ { EnableNext( m_ServiceArray.GetSize() ? TRUE : FALSE ); }
void CNNTPVirtualRootParamsPage::OnRefresh() { m_fReadList = FALSE;
m_ServiceArray.RemoveAll(); FillServerList(); }
|